
All architecture is design; not all design is architecture. The difference? If you have to start over to fix it, it’s architecture. Remember those story problems in high school algebra? A lot of people hated them; I loved them. The hardest part was interpreting the story to get the equation. Get the right equation, the algebra was (mostly) easy. Get the equation wrong, you spent time and effort solving the wrong problem, with no hope of getting the right answer. Architecture is like that: get it wrong, you have to start over. The most important skill in architecture, of any kind, is recognizing the story; sometimes, you have to write it. The purpose of this chapter and the next is to help you make sure you solve the right problem. You may still get the wrong answer, stuff happens, but at least you were on the right track.
Digital images and videos are produced every day in astonishing amounts and the demand for higher quality is constantly rising which creates a need for advanced image quality assessment. Additionally, image quality assessment is important for the performance of image processing algorithms. It has been determined that image noise and artifacts can affect the performance of algorithms such as face detection and recognition [125], image saliency detection [126], and video target tracking [127]. Therefore, image quality assessment (IQA) has been a topic of intense research in the fields of image processing and computer vision. Since humans are the end consumer of multimedia signals, subjective quality metrics provide the most reliable results; however, their cost in addition to time requirements makes them unfeasible for practical applications; thus, OQM are usually preferred.
Software—the stuff of computer programs—is composed of sequence, selection, iteration, and indirection. Nothing more. Nothing less. — Robert C. Martin By now, you should have a pretty good handle on the problem you are trying to solve, and some idea of how you plan to go about it. Your problem domain abstractions are probably aligned well with abstractions in the real world, but may be too unwieldy to implement as they are. In particular, every application needs to have a user interface, business logic, and data access components, even if they don’t necessarily align with the problem domain abstractions.
Natural images usually include defocus blur due to the existence of objects at different depths from the camera. The depth richness of a scene translates into a spatially variable defocus blur in the captured image which cannot be easily undone with image deconvolution algorithms not only due to their computational requirements but also because most of the blind deconvolution algorithms assume a spatially invariant blur [20]. Automatic blur detection is an important element for several computer vision tasks such as spatially varying deblurring [21], photo editing [22], image classification [23], depth estimation [24], saliency detection [18], image segmentation [25], and digital image forensic analysis [26].
Most of the time, all you know is where you are and where you want to be. The rest is the adventure. Writing software is hard; writing good software is very hard, especially when it isn’t your primary job. I currently work in a research lab and see many highly trained scientists try to write code to support their research. To be blunt, much of the resulting software is not good. If it works at all, it is hard to use and fragile, and forget about trying to reuse it. Even well-known and well-used tools created by labs funded to build software tools suffer. (Ever try to install dcm4chee, a tool to manage medical images?)