Enhancement of compressed images
Summary by NHIP
Wavelet Image Denoising
The method characterizes quantization noise in reconstructed data from an inverse wavelet transform and removes it via a forward transform, thresholding, rescaling, and inverse transform sequence. Distinctive steps include applying an M-level enhancement wavelet transform to LL components and controlling denoising by setting level 1 coefficients to zero when corresponding level 2 coefficients are zero or have different signs.
Claim Score by NHIP
Abstract
A method and apparatus for enhancing compressed images is described. In one embodiment, the method comprises characterizing quantization noise in reconstructed low pass coefficients generated in response to application of an inverse wavelet transform and removing the quantization noise from the reconstructed low pass coefficients constructed during decoding.

Term
Term ended
Expired 5 February 2024, 2.6 years ago.
- Priority and filed
- Granted
- Expired
- Today
72 claims: 10 independent, 62 dependent
- 1Broadest claimClaim Score 74, broad(NHIP)A method comprising:characterizing quantization noise in reconstructed data generated in response to application of an inverse wavelet transform;removing the quantization noise from the reconstructed data constructed during decoding, including applying an M-level forward transform to LL components, thresholding coefficients, rescaling of coefficients after thresholding the coefficients, and applying a M-level inverse transform to thresholded coefficients to create denoised LL components.
- 39A method comprising:characterizing quantization noise in reconstructed data generated in response to application of an inverse wavelet transform;and removing the quantization noise from the reconstructed data constructed during decoding, including applying an M-level forward transform to LL components, thresholding coefficients, and applying a M-level inverse transform to thresholded coefficients to create denoised LL components, wherein thresholding coefficients comprises determining a threshold based on a scalar quantizer Q, where Q is a rational number, and wherein scalar quantizer Q is equal to 2 M b −(P+C−χ) ·Δ b where M b is G+ε b −1 where G is a number of guard bits and ε b is an exponent indicated in a first tag in a codestream, (P+C−χ) is the number of bitplanes decoded, and Δ b is indicated in a second tag in the codestream.
- 40A method comprising:characterizing quantization noise in reconstructed data generated in response to application of an inverse wavelet transform;and removing the quantization noise from the reconstructed data constructed during decoding, including applying an M-level forward transform to LL components, thresholding coefficients, and applying a M-level inverse transform to thresholded coefficients to create denoised LL components, wherein thresholding of coefficients comprises shrinking a value of wavelet coefficient toward zero by an amount of a threshold if the absolute value of the wavelet coefficient is greater than or equal to the threshold.
- 41A decoder comprising:an inverse wavelet filter unit to apply an inverse wavelet transform;a quantization noise characterization unit to characterize quantization noise in reconstructed data generated in response to application of the inverse wavelet transform;and a quantization noise removal unit to remove the quantization noise from the reconstructed data constructed during decoding, including applying an M-level forward transform to LL components, thresholding coefficients, wherein the quantization noise removal unit rescales coefficients after thresholding the coefficients, and applying a M-level inverse transform to thresholded coefficients to create denoised LL components.
- 56A decoder comprising:an inverse wavelet filter unit to apply an inverse wavelet transform;a quantization noise characterization unit to characterize quantization noise in reconstructed data generated in response to application of the inverse wavelet transform;and a quantization noise removal unit to remove the quantization noise from the reconstructed data constructed during decoding, including applying an M-level forward transform to LL components, thresholding coefficients, and applying a M-level inverse transform to thresholded coefficients to create denoised LL components, wherein the quantization noise removal unit thresholds coefficients by shrinking a value of wavelet coefficient toward zero by an amount of a threshold if the absolute value of the wavelet coefficient is greater than or equal to the threshold.
- 57A decoder comprising:an inverse wavelet filter unit to apply an inverse wavelet transform;a quantization noise characterization unit to characterize quantization noise in reconstructed data generated in response to application of the inverse wavelet transform;and a quantization noise removal unit to remove the quantization noise from the reconstructed data constructed during decoding, including applying an M-level forward transform to LL components, thresholding coefficients, and applying a M-level inverse transform to thresholded coefficients to create denoised LL components, wherein thresholding is performed using a threshold, and further wherein the threshold comprises an average of thresholds corresponding to the maximal approximation error of four neighboring samples.
- 58A decoder comprising:an inverse wavelet filter unit to apply an inverse wavelet transform;a quantization noise characterization unit to characterize quantization noise in reconstructed data generated in response to application of the inverse wavelet transform;and a quantization noise removal unit to remove the quantization noise from the reconstructed data constructed during decoding, including applying an M-level forward transform to LL components, thresholding coefficients, and applying a M-level inverse transform to thresholded coefficients to create denoised LL components, wherein thresholding is performed using a threshold, and further wherein the threshold comprises a maximum of thresholds corresponding to the maximal approximation error of four neighboring samples.
- 59An article of manufacture comprising one or more computer-readable media with executable instructions stored thereon which, when executed by a system, cause the system to perform a method, the method including characterizing quantization noise in reconstructed data generated in response to application of an inverse wavelet transform;and removing the quantization noise from the reconstructed data constructed during decoding, including applying an M-level forward transform to LL components, thresholding coefficients, and applying a M-level inverse transform to thresholded coefficients to create denoised LL components, wherein thresholding coefficients comprises determining a threshold based on a scalar quantizer Q, where Q is a rational number, and wherein scalar quantizer Q is equal to 2 M b −(P+C−χ) ·Δ b where M b is G+ε b −1 where G is a number of guard bits and ε b is an exponent indicated in a first tag in a codestream, (P+C−χ) is the number of bitplanes decoded, and Δ b is indicated in a second tag in the codestream.
- 60An article of manufacture comprising one or more computer-readable media with executable instructions stored thereon which, when executed by a system, cause the system to perform a method, the method including characterizing quantization noise in reconstructed data generated in response to application of an inverse wavelet transform;removing the quantization noise from the reconstructed data constructed during decoding, including applying an M-level forward transform to LL components, thresholding coefficients, rescaling of coefficients after thresholding the coefficients, and applying a M-level inverse transform to thresholded coefficients to create denoised LL components.
- 72An article of manufacture comprising one or more computer-readable media with executable instructions stored thereon which, when executed by a system, cause the system to perform a method, the method including characterizing quantization noise in reconstructed data generated in response to application of an inverse wavelet transform;and removing the quantization noise from the reconstructed data constructed during decoding, including applying an M-level forward transform to LL components, thresholding coefficients, including shrinking a value of wavelet coefficient toward zero by an amount of a threshold if the absolute value of the wavelet coefficient is greater than or equal to the threshold, and applying a M-level inverse transform to thresholded coefficients to create denoised LL components.
Independent claims10
239 paragraphs in 6 sections, as filed
FIELD OF THE INVENTION
A portion of the disclosure of this patent document contains material which is subject to (copyright or mask work) protection. The (copyright or mask work) owner has no objection to the facsimile reproduction by anyone of the patent document or the patent disclosure, as it appears in the Patent and Trademark Office patent file or records, but otherwise reserves all (copyright or mask work) rights whatsoever.
The present invention relates to the field of decompression and compression systems; more particularly, the present invention relates to enhancement of compressed images, such as, for example, those that are decoded by a decoder compliant with the JPEG 2000 Standard.
BACKGROUND OF THE INVENTION
At lower bitrates, compressed images often show some artifacts due to the quantization of transform coefficients. The nature of these artifacts depends very much on the chosen transform and quantization scheme. The artifacts are often called quantization noise. It is well known that wavelet-based noise removal is the state-of-the-art technique for removal of Gaussian White noise due to fundamental different theoretical properties of wavelet compared with Fourier bases. The characteristics of quantization noise are very different from Gaussian White noise and the familiar wavelet-shrinkage technique is not applicable.
The new image compression standard JPEG2000 (“J2K”) contains very sophisticated quantization schemes that are known to the encoder and decoder. See ITU-T T.800/ISO/IEC 154441:2000 JPEG 2000 Image Coding System.
Removal of compression artifacts caused by DCT compression is known in the art. Those artifacts are mostly blocky artifacts due to the 8×8 transform blocks. Typically, the position of the boundary between two transform blocks is known and the processing concentrated around those blocks. For more information, see Shen, M. -Y., Kuo, C. -C., “Review of Postprocessing Techniques for Compression Artifact Removal,” <i>Journal of Visual Communication and Image Representation</i>, vol. 9, pp. 2–14, 1998 and Xiong, Z., Orchard, M., Zhang, Y., “A Deblocking Algorithm for JPEG Compressed Images Using Overcomplete Wavelet Representations,” <i>IEEE Trans. Circuits and Systems for Video Technology</i>, vol. 7, pp. 433–437, 1997.
There has been some work on artifact removal at tile boundaries with wavelet compression systems, which is a similar problem to artifact removal at DCT block boundaries. The original JPEG Standard uses DCT, as opposed to the J2K, which uses a wavelet transform. For more information on the JPEG Standard, see ITU-T Recommendation T.81 I ISO/IEC 10918–1:1994, Information Technology—Digital Compression and Coding of Continuous-Tone Still Images: Requests and Guidelines.
Some postprocessing methods for removal of quantization noise in wavelet compression systems exist. In Nguyen, T., Yang, S., Hu, Y. H., Tull, D. L., “JPEG-2000 post processing” presented at a J2K meeting, 1999, a MAP-estimation algorithm is applied to the image which requires an estimate of the original image. In general applications that estimate is not available. Moreover, it is not possible to embed this technique into the decoder. Another approach is used in Wei, D., Burrus, C. S., “Optimal Wavelet Thresholding for Various Coding Schemes,” in Proceedings of ICIP '95, vol. 1, pp. 610–613, 1995, where the authors apply a simple wavelet-denoising algorithm to the quantized data. That denoising algorithm is specifically suited for Gaussian White noise. Quantization noise is by no means Gaussian White noise. In contrast, wavelet coefficients after quantization can take only a limited number of values given through the quantization. Therefore, the thresholding scheme for Gaussian noise that the authors set forth is not an optimal technique for removal of quantization noise. In Nosratinia, A., “Embedded Post-Processing for Enhancement of Compressed Images,” in <i>Proceedings of Data Compression Conference DCC</i>, pp. 62–71, 1999, an algorithm for artifact removal in DCT JPEG/wavelet-compressed images is presented that computes different shifts of the fully decoded image and clips coefficients to the quantization. However, this is also a postprocessing step that requires first a decoding of the entire image.
Correcting blurring is another problem for which image processing is performed. Sensing devices for digitizing images such as a scanner or a CCD camera typically produce a blurred version of the original image. Therefore, deblurring algorithms are necessary to produce a digital image that has the same degree of sharpness as the original image. Deblurring of images is a classical part of image processing. Typically, the blurring process is modeled by a convolution with a smoothing kernel. An inversion of this blurring is done by dividing by the convolution kernel in the Fourier domain. An exact inverse is only possible if the convolution kernel does not have any zeros in its frequency response. Even if the kernel satisfies this criterion in the presence of noise, the deblurring problem becomes an ill-posed problem since noise pixels may be magnified during the filter inversion. If the convolution kernel is not invertible, a regularized inverse is typically used where a regularization parameter manages the trade off between full inversion and noise suppression.
Recently, hybrid Fourier-wavelet-based techniques have been proposed in the literature to solve the deconvolution problem. In those approaches, the denoising part of the deconvolution problem is performed by wavelet shrinkage, the inversion of the convolution in the Fourier domain by classical filter inversion. For more information, see Abramovich, F., Silverman, B. W., “Wavelet Decomposition Approaches to Statistical Inverse Problems,” <i>Biometrika</i>, vol. 85, pp. 115–129, 1998; Donoho, D., “Nonlinear Solution of Linear Inverse Problems by Wavelet-Vaguelette Decomposition,” <i>Journal of Applied and Computational Harmonic Analysis</i>, vol. 2, pp. 101–115, 1995; Neelamani, R., Choi, H., Baraniuk, R., “Wavelet-based Deconvolution for Ill-conditioned Systems,” in Proceedings of ICASSP, vol. 6, pp. 3241–3244, 1998. S. Mallat, “A Wavelet Tour of Signal Processing,” Academic Press, 1998.
Enhancement of images in a subband decomposition, especially using the Laplacian pyramid, is known in the art. For example, see Ito, W., “Method and Apparatus for Enhancing Contrast in Images by Emphasis Processing of a Multiresolution Frequency Band,” Fuji, Japan, U.S. Pat. No. 5,907,642, issued May 24, 1999 and U.S. Pat. No. 5,960,123, issued Sep. 28, 1999.
U.S. Pat. No. 5,703,965, entitled “Image Compression/Decompression Based on Mathematical Transform, Reduction/Expansion, and Image Sharpening,” issued to Chi-Yung, F., Loren, P. on Dec. 30, 1995 discusses two operations: compression and image sharpening and smoothing. In that approach, which assumes the original JPEG compression scheme, the two operations are performed one after the other and not combined into one.
SUMMARY OF THE INVENTION
A method and apparatus for enhancing compressed images is described. In one embodiment, the method comprises characterizing quantization noise in reconstructed samples generated in response to application of an inverse wavelet transform and removing the quantization noise from the reconstructed samples constructed during decoding.
BRIEF DESCRIPTION OF THE DRAWINGS
The present invention will be understood more fully from the detailed description given below and from the accompanying drawings of various embodiments of the invention, which, however, should not be taken to limit the invention to the specific embodiments, but are for explanation and understanding only.
<figref idref="DRAWINGS">FIG. 1A</figref> is a flow diagram of one embodiment of a quantization noise removal process.
<figref idref="DRAWINGS">FIG. 1B</figref> is a block diagram of one embodiment of a decoder.
<figref idref="DRAWINGS">FIG. 2</figref> is a flow diagram of one embodiment of a wavelet sharpening and smoothing process.
<figref idref="DRAWINGS">FIG. 3</figref> is a block diagram of one embodiment of an encoder.
<figref idref="DRAWINGS">FIG. 4</figref> is a block diagram of an alternative embodiment of an encoder.
<figref idref="DRAWINGS">FIG. 5</figref> is a block diagram of an alternative embodiment of an encoder.
<figref idref="DRAWINGS">FIG. 6</figref> illustrates an input signal with step edges.
<figref idref="DRAWINGS">FIG. 7</figref> shows the high pass coefficients for a 5-3 transform assuming a mirror extension at boundaries.
<figref idref="DRAWINGS">FIG. 8</figref> shows the low pass coefficients for a 5-3 transform assuming the use of mirror extension at boundaries.
<figref idref="DRAWINGS">FIG. 9</figref> shows the high pass coefficients being quantized with Q equal to 16.
<figref idref="DRAWINGS">FIG. 10</figref> shows the result of applying the inverse transform.
<figref idref="DRAWINGS">FIG. 11</figref> illustrates the Level 1 low pass filter result of applying of the redundant Haar transform.
<figref idref="DRAWINGS">FIG. 12</figref> shows the Level 1 high pass filter result of applying of the redundant Haar transform.
<figref idref="DRAWINGS">FIG. 13</figref> shows the Level 2 low pass filter result of applying of the redundant Haar transform.
<figref idref="DRAWINGS">FIG. 14</figref> shows the Level 2 high pass filter result of applying of the redundant Haar transform.
<figref idref="DRAWINGS">FIG. 15</figref> shows the denoised high pass coefficients for level 1.
<figref idref="DRAWINGS">FIG. 16</figref> shows the denoised and sharpened high pass coefficients for level 1.
<figref idref="DRAWINGS">FIG. 17</figref> shows the denoised high pass coefficients for level 2.
<figref idref="DRAWINGS">FIG. 18</figref> shows the denoised and sharpened high pass coefficients for level 2.
<figref idref="DRAWINGS">FIG. 19</figref> shows the result of applying a two level inverse redundant Haar transform to the low pass coefficients and the denoised high pass coefficients.
<figref idref="DRAWINGS">FIG. 20</figref> shows an exemplary input signal that contains an edge between two textured regions.
<figref idref="DRAWINGS">FIG. 21</figref> shows the result of the applying high pass 5-3 filter to the input signal.
<figref idref="DRAWINGS">FIG. 22</figref> shows the result of applying a low pass 5-3 filter to the input signal.
<figref idref="DRAWINGS">FIG. 23</figref> shows that with quantization Q equal to 8, the high pass coefficients for the texture and the edge have the same magnitude, 12.
<figref idref="DRAWINGS">FIG. 24</figref> shows the result of using Q equal to 8 to represent the texture and the edge if a low compression ratio is acceptable.
<figref idref="DRAWINGS">FIG. 25</figref> shows the reconstruction in the case where quantization Q equals 16.
<figref idref="DRAWINGS">FIG. 26</figref> shows the level 1 low pass result of applying a redundant Haar transform to the original signal.
<figref idref="DRAWINGS">FIG. 27</figref> shows the level 1 high pass result of applying a redundant Haar transform to the original signal.
<figref idref="DRAWINGS">FIG. 28</figref> shows the level 2 low pass result of applying a redundant Haar transform to the original signal.
<figref idref="DRAWINGS">FIG. 29</figref> shows the level 2 high pass result of applying a redundant Haar transform to the original signal.
<figref idref="DRAWINGS">FIG. 30</figref> shows the level 2 denoised coefficients that result from the denoising.
<figref idref="DRAWINGS">FIG. 31</figref> shows the level 2 denoised and sharpened coefficients resulting from performing the sharpening.
<figref idref="DRAWINGS">FIG. 32</figref> shows denoised level 1 high pass coefficients.
<figref idref="DRAWINGS">FIG. 33</figref> shows the level 1 denoised and sharpened high pass coefficients.
<figref idref="DRAWINGS">FIG. 34</figref> shows the preprocessed results after wavelet denoising.
<figref idref="DRAWINGS">FIG. 35</figref> shows the high pass filter result from application of the 5-3 filter.
<figref idref="DRAWINGS">FIG. 36</figref> shows the low pass filter result from application of the 5-3 filter.
<figref idref="DRAWINGS">FIG. 37</figref> shows the high pass coefficients after quantization with Q equal to 8.
<figref idref="DRAWINGS">FIG. 38</figref> shows the pre-processing provides a good improvement in quality for a small increase in rate.
<figref idref="DRAWINGS">FIG. 39</figref> is a block diagram of a computer system.
DETAILED DESCRIPTION OF THE PRESENT INVENTION
A method and apparatus for enhancing compressed images is described. The new JPEG 2000 decoding standard (ITU-T Rec.T.800/ISO/IEC 154441:2000 JPEG 2000 Image Coding System) (herein after referred to as the J2K Standard) provides a new coding scheme and codestream definition for images, and is incorporated herein by reference.
A technique is described that uses the information on the quantization scheme available to a decoder, such as, for example, a J2K decoder, to characterize quantization noise and removes that noise from samples reconstructed during the decoding process. For example, the techniques described herein may be used to enhance a J2K compressed image, where enhancement refers to a removal of quantization noise. The technique may be embedded into the decoder codestream and does not require decoding of the entire image first in order to perform the enhancement.
In one embodiment, this noise removal operation is combined with a deblurring operation to enhance the sharpness of a compressed image (e.g., a J2K compressed image). The techniques described herein could be used on images taken by a digital camera, or in other settings, where the input image has been blurred before the compression by a sensing device.
A technique for enhancement of J2K compressed images including removal of quantization artifacts and deblurring is described. In one embodiment, these techniques eliminate visual degradation in J2K compressed images by removing quantization artifacts and performing a deblurring operation if necessary. This removal of quantization artifacts and performance of the deblurring operation may be performed by applying “wavelet sharpening and smoothing” (WSS) to J2K quantized coefficients. For more information on WSS, see K. Berkner, E. L. Schwartz, M. J. Gormish, M. Boliek, “A New Wavelet-Based Approach to Sharpening and Smoothing of Images in Besov Spaces with Applications to Deblurring,” Proceedings of ICIP/2000, Vancouver, Vol. III, pp. 797–800, 2000 and K. Berkner, E. L. Schwartz, M. J. Gormish, “Multiscale Sharpening and Smoothing in Besov Spaces with Applications to Image Enhancement,” in Applied and Computational Harmonic Analysis, Special Issue on Wavelet Applications, Vol. 11, No. 1, pp. 2–31, July 2001, incorporated herein by reference. See also, U.S. patent application Ser. No. 09/467,544, entitled “Multiscale Sharpening and Smoothing With Wavelets,” filed Dec. 10, 1999 and U.S. patent application Ser. No. 09/658,393, entitled “Wavelet-Based Image Processing Path,” filed Sep. 8, 2000, assigned to the corporate assignee.
In one embodiment, the operations of removal of quantization artifacts and deblurring, and the functionality necessary to perform them, may be used in combination or separately, are embedded into the decoder, and these operations use information on the quantization specified in the J2K Standard and known to the J2K decoder.
In one embodiment, the techniques described herein are implemented as a decoder option. In such a case, there is no cost during encoding and lossless decoding.
Alternatively, some of the techniques described herein can be implemented in an encoder. In one embodiment, the technique enables enhancement of an image at various resolutions. Enhancement at a particular resolution might target a particular client or device such as, for example, a monitor. The J2K codestream can be parsed to give a codestream for the device or client.
In the following description, numerous details are set forth, such as types of transforms, parameter values, etc., in order to provide a thorough understanding of the present invention. It will be apparent, however, to one skilled in the art, that the present invention may be practiced without these specific details. In other instances, well-known structures and devices are shown in block diagram form, rather than in detail, in order to avoid obscuring the present invention.
Some portions of the detailed descriptions that follow are presented in terms of algorithms and symbolic representations of operations on data bits within a computer memory. These algorithmic descriptions and representations are the means used by those skilled in the data processing arts to most effectively convey the substance of their work to others skilled in the art. An algorithm is here, and generally, conceived to be a self-consistent sequence of steps leading to a desired result. The steps are those requiring physical manipulations of physical quantities. Usually, though not necessarily, these quantities take the form of electrical or magnetic signals capable of being stored, transferred, combined, compared, and otherwise manipulated. It has proven convenient at times, principally for reasons of common usage, to refer to these signals as bits, values, elements, symbols, characters, terms, numbers, or the like.
It should be borne in mind, however, that all of these and similar terms are to be associated with the appropriate physical quantities and are merely convenient labels applied to these quantities. Unless specifically stated otherwise as apparent from the following discussion, it is appreciated that throughout the description, discussions utilizing terms such as “processing” or “computing” or “calculating” or “determining” or “displaying” or the like, refer to the action and processes of a computer system, or similar electronic computing device, that manipulates and transforms data represented as physical (electronic) quantities within the computer system's registers and memories into other data similarly represented as physical quantities within the computer system memories or registers or other such information storage, transmission or display devices.
The present invention also relates to apparatus for performing the operations herein. This apparatus may be specially constructed for the required purposes, or it may comprise a general purpose computer selectively activated or reconfigured by a computer program stored in the computer. Such a computer program may be stored in a computer readable storage medium, such as, but is not limited to, any type of disk including floppy disks, optical disks, CD-ROMs, and magnetic-optical disks, read-only memories (ROMs), random access memories (RAMs), EPROMs, EEPROMs, magnetic or optical cards, or any type of media suitable for storing electronic instructions, and each coupled to a computer system bus.
The algorithms and displays presented herein are not inherently related to any particular computer or other apparatus. Various general purpose systems may be used with programs in accordance with the teachings herein, or it may prove convenient to construct more specialized apparatus to perform the required method steps. The required structure for a variety of these systems will appear from the description below. In addition, the present invention is not described with reference to any particular programming language. It will be appreciated that a variety of programming languages may be used to implement the teachings of the invention as described herein.
A machine-readable medium includes any mechanism for storing or transmitting information in a form readable by a machine (e.g., a computer). For example, a machine-readable medium includes read only memory (“ROM”); random access memory (“RAM”); magnetic disk storage media; optical storage media; flash memory devices; electrical, optical, acoustical or other form of propagated signals (e.g., carrier waves, infrared signals, digital signals, etc.); etc.
Multiscale Sharpening, Smoothing and Denoising
In one embodiment, enhancement in the form of thresholding and/or scaling (e.g., multiplication) is performed on wavelet coefficients to achieve denoising, sharpening, and smoothing. A criterion dictates whether thresholding and/or multiplication are applied.
Denoising by Thresholding
Denoising may be performed by setting all coefficients below a given threshold to zero. This technique is known as hard-thresholding and is well-known in the art. As an alternative, soft-thresholding, e.g., shrinking the coefficients above the threshold toward zero by the amount of the threshold can also be considered. Such a technique may be advantageously used for critically sampled and overcomplete wavelet decompositions, and is described in Donoho, “Denoising by Soft-Thresholding”, IEEE Transactions on Information Theory, 41(3): 613–627, 1995.
There are a number of choices of threshold selection that may be used. These may be calculated from a series of test images.
There are additional strategies for thresholding available. There may be a global threshold or different thresholds for different levels of decomposition or different bands (LH, HL, HH). The thresholds may be set manually.
It is important to note that wavelets outperform many other transforms for denoising. For example, Laplacian based techniques applied to wavelet compressed images do not achieve the quality level obtained with wavelet denoising systems. Laplacian pyramid decompositions can be used only for systems where inferior or no denoising is acceptable.
Rescaling of Coefficients
After any denoising is completed, the wavelet coefficients that are non-zero may be modified for the purpose of sharpening or smoothing.
In one embodiment, sharpening or smoothing of the image is obtained by multiplication of wavelet coefficients with a level-dependent parameter μ<sub>j</sub>>0. For sharpening, the high frequency bands should be multiplied with a larger factor than the low frequency bands, whereas for smoothing the low frequency bands should be multiplied with larger factors than the high frequency bands. One way to obtain this resealing is to multiply the coefficients at level j with μ<sub>j</sub>=R·2<sup>αj </sup>The parameter R functions as a renormalization factor for preserving the global energy of coefficients and α is the parameter that determines the degree of sharpening (α<0) or smoothing (α>0). For more information on such sharpening and smoothing, see K. Berkner, E. L. Schwartz, M. J. Gormish, M. Boliek, “A New Wavelet-Based Approach to Sharpening and Smoothing of Images in Besov Spaces with Applications to Deblurring,” Proceedings of ICIP/2000, Vancouver, Vol. III, pp. 797–800, 2000 and K. Berkner, E. L. Schwartz, M. J. Gormish, “Multiscale Sharpening and Smoothing in Besov Spaces with Applications to Image Enhancement,” in Applied and Computational Harmonic Analysis, Special Issue on Wavelet Applications, Vol. 11, No. 1, pp. 2–31, July 2001, incorporated herein by reference. See also, U.S. patent application Ser. No. 09/467,544, entitled “Multiscale Sharpening and Smoothing With Wavelets,” filed Dec. 10, 1999 and U.S. patent application Ser. No. 09/658,393, entitled “Wavelet-Based Image Processing Path,” filed Sep. 8, 2000, assigned to the corporate assignee and incorporated herein by reference.
There are many choices for the parameter R that depend on how the energy of an image is measured. One way would be to preserve the L<sup>2 </sup>norm
<maths id="MATH-US-00001" num="00001"><math overflow="scroll"><msqrt><mrow><munder><mo>∑</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow></munder><mo></mo><msup><mrow><mo></mo><msub><mi>x</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow></msub><mo></mo></mrow><mn>2</mn></msup></mrow></msqrt></math></maths><br /> of the image before and after resealing, i.e. compute R with
<maths id="MATH-US-00002" num="00002"><math overflow="scroll"><mrow><msup><mi>R</mi><mn>2</mn></msup><mo>=</mo><mrow><mrow><mo>(</mo><mrow><munder><mo>∑</mo><mrow><mi>j</mi><mo>,</mo><mi>k</mi></mrow></munder><mo></mo><msup><mrow><mo></mo><msub><mi>d</mi><mrow><mi>j</mi><mo>,</mo><mi>k</mi></mrow></msub><mo></mo></mrow><mn>2</mn></msup></mrow><mo>)</mo></mrow><mo>/</mo><mrow><mo>(</mo><mrow><munder><mo>∑</mo><mrow><mi>j</mi><mo>,</mo><mi>k</mi></mrow></munder><mo></mo><msup><mrow><mo></mo><mrow><msub><mi>μ</mi><mi>j</mi></msub><mo></mo><msub><mi>d</mi><mrow><mi>j</mi><mo>,</mo><mi>k</mi></mrow></msub></mrow><mo></mo></mrow><mn>2</mn></msup></mrow><mo>)</mo></mrow></mrow></mrow></math></maths><br /> If the scanned image is assumed to have a Hoelder regularity of γ (typically γ≧1), an approximation of R<sup>2 </sup>can be obtained by the following estimate.
<maths id="MATH-US-00003" num="00003"><math overflow="scroll"><mrow><msup><mi>R</mi><mn>2</mn></msup><mo>=</mo><mrow><mrow><mrow><mrow><mrow><mo>[</mo><mfrac><mrow><msup><mn>2</mn><mrow><mrow><mo>(</mo><mrow><mi>L</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow><mo></mo><mn>2</mn><mo></mo><mi>γ</mi></mrow></msup><mo>-</mo><msup><mn>2</mn><mrow><mn>2</mn><mo></mo><mi>γ</mi></mrow></msup></mrow><mrow><msup><mn>2</mn><mrow><mn>2</mn><mo></mo><mi>γ</mi></mrow></msup><mo>-</mo><mn>1</mn></mrow></mfrac><mo>]</mo></mrow><mo>/</mo><mrow><mo>[</mo><mfrac><mrow><msup><mn>2</mn><mrow><mrow><mo>(</mo><mrow><mi>L</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow><mo></mo><mn>2</mn><mo></mo><mrow><mo>(</mo><mrow><mi>γ</mi><mo>+</mo><mi>α</mi></mrow><mo>)</mo></mrow></mrow></msup><mo>-</mo><msup><mn>2</mn><mrow><mn>2</mn><mo></mo><mrow><mo>(</mo><mrow><mi>γ</mi><mo>+</mo><mi>α</mi></mrow><mo>)</mo></mrow></mrow></msup></mrow><mrow><msup><mn>2</mn><mrow><mn>2</mn><mo></mo><mrow><mo>(</mo><mrow><mi>γ</mi><mo>+</mo><mi>α</mi></mrow><mo>)</mo></mrow></mrow></msup><mo>-</mo><mn>1</mn></mrow></mfrac><mo>]</mo></mrow></mrow><mo></mo><mstyle><mspace width="0.8em" height="0.8ex" /></mstyle><mo></mo><mi>for</mi><mo></mo><mstyle><mspace width="0.8em" height="0.8ex" /></mstyle><mo></mo><mi>α</mi></mrow><mo>+</mo><mi>γ</mi></mrow><mo>≠</mo><mn>0</mn></mrow></mrow></math></maths><br /> This approximation can be computed a-priori and does not depend on the actual values of wavelet coefficients. For cases where α+γ=0
<maths id="MATH-US-00004" num="00004"><math overflow="scroll"><mrow><msup><mi>R</mi><mn>2</mn></msup><mo>=</mo><mrow><mrow><mo>[</mo><mfrac><mrow><msup><mn>2</mn><mrow><mrow><mo>(</mo><mrow><mi>L</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow><mo></mo><mn>2</mn><mo></mo><mi>γ</mi></mrow></msup><mo>-</mo><msup><mn>2</mn><mrow><mn>2</mn><mo></mo><mi>γ</mi></mrow></msup></mrow><mrow><msup><mn>2</mn><mrow><mn>2</mn><mo></mo><mi>γ</mi></mrow></msup><mo>-</mo><mn>1</mn></mrow></mfrac><mo>]</mo></mrow><mo>/</mo><mrow><mi>L</mi><mo>.</mo></mrow></mrow></mrow></math></maths>
Instead of using the L<sup>2 </sup>norm, there are other choices for the norm. Using the theory of Besov spaces, it is possible to preserve a specific Besov norm of the image. This norm is defined as a weighted sum of wavelet coefficients. The parameter R can be computed as
<maths id="MATH-US-00005" num="00005"><math overflow="scroll"><mrow><msup><mi>R</mi><mi>q</mi></msup><mo>=</mo><mrow><mrow><mo>(</mo><mrow><munder><mo>∑</mo><mi>j</mi></munder><mo></mo><mrow><msup><mn>2</mn><mrow><mi>j</mi><mo></mo><mrow><mo>(</mo><mrow><mi>α</mi><mo>+</mo><mi>q</mi><mo>+</mo><mrow><mn>1</mn><mo>/</mo><mn>2</mn></mrow></mrow><mo>)</mo></mrow></mrow></msup><mo></mo><msup><mrow><mo>(</mo><mrow><munder><mo>∑</mo><mi>k</mi></munder><mo></mo><msup><mrow><mo></mo><msub><mi>d</mi><mrow><mi>j</mi><mo>,</mo><mi>k</mi></mrow></msub><mo></mo></mrow><mi>p</mi></msup></mrow><mo>)</mo></mrow><mrow><mi>q</mi><mo>/</mo><mi>p</mi></mrow></msup></mrow></mrow><mo>)</mo></mrow><mo>/</mo><mrow><mo>(</mo><mrow><munder><mo>∑</mo><mi>j</mi></munder><mo></mo><mrow><msup><mn>2</mn><mrow><mi>j</mi><mo></mo><mrow><mo>(</mo><mrow><mi>α</mi><mo>+</mo><mi>q</mi><mo>+</mo><mrow><mn>1</mn><mo>/</mo><mn>2</mn></mrow></mrow><mo>)</mo></mrow></mrow></msup><mo></mo><msup><mrow><mo>(</mo><mrow><munder><mo>∑</mo><mi>k</mi></munder><mo></mo><msup><mrow><mo></mo><mrow><mrow><msub><mi>μ</mi><mi>j</mi></msub><mo></mo><msub><mi>d</mi><mi>j</mi></msub></mrow><mo>,</mo><mi>k</mi></mrow><mo></mo></mrow><mi>p</mi></msup></mrow><mo>)</mo></mrow><mrow><mi>q</mi><mo>/</mo><mi>p</mi></mrow></msup></mrow></mrow><mo>)</mo></mrow></mrow></mrow></math></maths><br /> for 0<p,q<∞. <br /> For p,q=∞, the term
<maths id="MATH-US-00006" num="00006"><math overflow="scroll"><msup><mrow><mo>(</mo><mrow><mo>∑</mo><msup><mrow><mo></mo><mi>…</mi><mo></mo></mrow><mi>s</mi></msup></mrow><mo>)</mo></mrow><mrow><mn>1</mn><mo>/</mo><mi>s</mi></mrow></msup></math></maths><br /> in the previous equation is substituted by sup|d<sub>j,k</sub>|.
In one embodiment, the choice of the parameters α and R can be controlled by the user interface of a device, giving the user the opportunity to select more/less sharpening, or more/less smoothing. This parameterization of sharpening and smoothing allows a fine graduation of degrees of enhancement.
The above technique may be used for deblurring of noisy images, in particular scanned documents. Thus, these techniques perform denoising and inversion of the blurring completely in the wavelet domain. The denoising part may be performed by shrinkage of coefficients, while the inversion of the blurring may be performed by reweighting of the denoised coefficients. These deblurring solutions are used as an individual processing operation on the original data of the blurred image, not on a compressed code stream.
Compression Artifact Removal and Deblurring of J2K Compressed Images
The denoising and/or deblurring may be used to reduce or eliminate artifacts due to quantization noise in compression images. In one embodiment, a technique is described for removal of quantization noise in a J2K encoded data stream. A technique for performing a deblurring operation using a process related to the wavelet sharpening and smoothing process described above on a J2K encoded data stream is also described. Those two techniques can be used separately or in combination to form an enhancement system. Such an enhancement system may be included in, for example, a digital camera, scanner, printer, digital copier, displays, post processing software, or embedded into the decoder.
Removal of Quantization Noise in J2K-Compressed Coefficients
Gaussian White noise is uniformly distributed in the levels of a wavelet decomposition and its strength can be estimated by computing the standard deviation of the coefficients at the finest level of decomposition. Quantization noise has a different characteristic. This noise appears when transform coefficients of very similar size end up in different quantization bins after applying the quantization. This mismatch of quantization bins becomes visible as an artifact after performing the inverse wavelet transform—especially in smooth regions of the image. It becomes clear that the characteristics of quantization noise artifacts in wavelet compressed images depend on the quantization procedure itself as well as the inverse transform.
The J2K Standard Part 1 makes multiple passes through coefficients in each subband. Some coefficients (those predicted to be significant) can be coded before adjacent coefficients. Each pass reduces the quantization “bin size” for some coefficients. In addition, the region of interest (ROI) functionality of Part 1 of the J2K Standard (in which use is indicated by the RGN marker) and the increased ROI functionality of Part 2 allow more changes in the order of coefficient processing and, thus, effectively more “bin sizes.” In all cases, the decoder is aware of the number of bits decoded for each coefficient and, thus, the bound on the original coefficient.
An encoder in many compression systems performs scalar quantization. An encoder quantizes transform coefficients d of a subband to the value d′ according to the following equation:
<maths id="MATH-US-00007" num="00007"><math overflow="scroll"><mrow><msup><mi>d</mi><mi>′</mi></msup><mo>=</mo><mrow><mrow><mi>sign</mi><mo></mo><mrow><mo>(</mo><mi>d</mi><mo>)</mo></mrow></mrow><mo>·</mo><mrow><mo>⌊</mo><mfrac><mrow><mo></mo><mi>d</mi><mo></mo></mrow><mi>Q</mi></mfrac><mo>⌋</mo></mrow></mrow></mrow></math></maths><br /> where Q is the quantization step size.
The quantizer Q is used in encoding. In one embodiment, Q changes code-block to code-block or at different parts of the codestream. In the J2K standard, the decoder knows the Q value and when the Q value changes. In J2K Q value changes per coefficient. Such information is available as header information in the compressed codestream, (e.g., the number of coding passes in packet headers in J2K codestreams). This is also the case in other compression schemes.
The decoder typically uses
<tables id="TABLE-US-00001" num="00001"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="4"><colspec colname="offset" colwidth="42pt" align="left" /><colspec colname="1" colwidth="84pt" align="left" /><colspec colname="2" colwidth="77pt" align="left" /><colspec colname="3" colwidth="14pt" align="left" /><thead><row><entry /><entry namest="offset" nameend="3" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry /><entry>{circumflex over (d)} = (d′ + r)Q</entry><entry>for d′ > 0,</entry><entry>(1)</entry></row><row><entry /><entry>{circumflex over (d)} = (d′ − r)Q</entry><entry>for d′ < 0, and</entry><entry>(2)</entry></row><row><entry /><entry>{circumflex over (d)} = 0</entry><entry>for d′ = 0.</entry><entry>(3)</entry></row><row><entry /><entry namest="offset" nameend="3" align="center" rowsep="1" /></row></tbody></tgroup></table></tables><br /> For this discussion, a value of ½ is used for r, but other values such as, for example, ⅜ may be used.
The decoder knows in which quantization bin d was placed, i.e. <br /><i>Qd′≦d≦Q</i>(<i>d′+</i>1).
Original coefficients “close” to nQ for integers n≦−2 or n≧2 may be reconstructed as (n−½)Q or (n+½)Q. Therefore, for two such close coefficients, the reconstructed value can differ by Q.
In one embodiment, the technique described herein uses that information on quantization schemes as well as the inverse wavelet transforms used to first characterize and then remove the quantization noise on each reconstructed LL component computed during the inverse wavelet transform.
Determining Quantization “Bin Size” for J2K Files
Annex E of the J2K standard describes quantization. The quantization bin size Q is <br /><i>Q=</i>2<sup>M</sup><sup><sub2>b</sub2></sup><sup>−N</sup><sup><sub2>b</sub2></sup><sup>(u,v)</sup>·Δ<sub>b</sub>.
The value Δ<sub>b </sub>is the explicit scalar quantization step size for a given subband. For the reversible 5-3 transform, it is always 1. For the reversible 9-7 transform, Δ<sub>b </sub>is signaled in QCD or QCC tags in a header (as described in Annex A). M<sub>b </sub>is G+ε<sub>b</sub>−1, where G is the number of guard bits and ε<sub>b </sub>is the exponent from the QCD or QCC tag. N<sub>b</sub>(u,v) is the number of bitplanes decoded for a particular coefficient at location u,v and 1≦N<sub>b</sub>(u,v)≦M<sub>b</sub>. (N<sub>b</sub>(u,v) can be zero, but in this is case all coefficients are zero—this is an all noise, no signal case.) A J2K codestream may contain less than M<sub>b </sub>bitplanes for a particular coefficient.
The number of bitplanes decoded, <br /><i>N</i><sub>b</sub>(<i>u,v</i>)=<i>P+C−χ. </i>
P is the number of zero bitplanes signalled in the packet header (described in Annex B). C is
<maths id="MATH-US-00008" num="00008"><math overflow="scroll"><mrow><mi>C</mi><mo>=</mo><mrow><mo>⌊</mo><mfrac><mrow><mo>(</mo><mrow><mi>CP</mi><mo>+</mo><mn>4</mn></mrow><mo>)</mo></mrow><mn>3</mn></mfrac><mo>⌋</mo></mrow></mrow></math></maths><br /> where CP is the total number of coding passes signalled in packet headers (or CP is a value less than the one signalled by the header chosen by the decoder).
Coefficients are coded in one of three coding passes: significance propagation, refinement or cleanup (as described in Annex D). χ is 0 or 1 as shown in Table K where % is the modulus operator (remainder after division) and the pass for each coefficient is determined by the J2K context model described in annex D.
<tables id="TABLE-US-00002" num="00002"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="center" /><thead><row><entry namest="1" nameend="1" rowsep="1">TABLE 1</entry></row></thead><tbody valign="top"><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Value for χ.</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="5"><colspec colname="1" colwidth="28pt" align="center" /><colspec colname="2" colwidth="42pt" align="center" /><colspec colname="3" colwidth="56pt" align="center" /><colspec colname="4" colwidth="49pt" align="center" /><colspec colname="5" colwidth="42pt" align="center" /><tbody valign="top"><row><entry /><entry /><entry>χ</entry><entry>χ</entry><entry>χ</entry></row><row><entry /><entry /><entry>for significance</entry><entry>for refinement</entry><entry>for cleanup</entry></row><row><entry /><entry>last</entry><entry>propagation (SP)</entry><entry>(RE) pass</entry><entry>(CL) pass</entry></row><row><entry>CP%3</entry><entry>coding pass</entry><entry>pass coefficients</entry><entry>coefficients</entry><entry>coefficients</entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row><row><entry>2</entry><entry>significance</entry><entry>0</entry><entry>1</entry><entry>1</entry></row><row><entry /><entry>propagation</entry></row><row><entry /><entry>(SP)</entry></row><row><entry>0</entry><entry>refinement</entry><entry>0</entry><entry>0</entry><entry>1</entry></row><row><entry /><entry>(RE)</entry></row><row><entry>1</entry><entry>cleanup (CL)</entry><entry>0</entry><entry>0</entry><entry>0</entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row></tbody></tgroup></table></tables><br /> An example follows below: <ul id="ul0001" list-style="none"><li id="ul0001-0001" num="0000"><ul id="ul0002" list-style="none"><li id="ul0002-0001" num="0102">reversible 5-3 transform, so Δ<sub>b</sub>=1</li><li id="ul0002-0002" num="0103">G=2, ε<sub>b</sub>=9 from QCD or QCC tag, so M<sub>b</sub>=10</li><li id="ul0002-0003" num="0104">P=4 from packet header for codeblock (zero bitplanes)</li><li id="ul0002-0004" num="0105">CP=3 from packet header for codeblock. Since the first bitplane has only one coding pass, a cleanup pass, the 3 coding passes are: <ul id="ul0003" list-style="none"><li id="ul0003-0001" num="0106">cleanup pass for the first non-zero bitplane</li><li id="ul0003-0002" num="0107">significance propagation for the second non-zero bitplane</li><li id="ul0003-0003" num="0108">refinement pass for the second non-zero bitplane</li></ul></li></ul></li></ul>
A refinement pass is last coding pass, and there is no cleanup pass for the second non-zero bitplane. C is 2 and from Table 1, χ is 0 for significance propagation pass and refinement pass coefficients and 1 for cleanup coefficients. <ul id="ul0004" list-style="none"><li id="ul0004-0001" num="0000"><ul id="ul0005" list-style="none"><li id="ul0005-0001" num="0110">When χ is 0, N<sub>b</sub>(u,v)=P+C−χ=6, so Q=2<sup>10−6</sup>·1=2<sup>4</sup>=16</li><li id="ul0005-0002" num="0111">When χ is 1, N<sub>b</sub>(u,v)=P+C−χ=5, so Q=2<sup>10−5</sup>·1=2<sup>5</sup>=32 <br /> Therefore, if a codeblock consists of 12×1 coefficients in the following passes (SP=significance propagation pass, RE=refinement pass, CL=cleanup pass.) </li></ul></li></ul>
<tables id="TABLE-US-00003" num="00003"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="12"><colspec colname="1" colwidth="21pt" align="center" /><colspec colname="2" colwidth="14pt" align="center" /><colspec colname="3" colwidth="21pt" align="center" /><colspec colname="4" colwidth="14pt" align="center" /><colspec colname="5" colwidth="21pt" align="center" /><colspec colname="6" colwidth="14pt" align="center" /><colspec colname="7" colwidth="21pt" align="center" /><colspec colname="8" colwidth="14pt" align="center" /><colspec colname="9" colwidth="21pt" align="center" /><colspec colname="10" colwidth="14pt" align="center" /><colspec colname="11" colwidth="21pt" align="center" /><colspec colname="12" colwidth="21pt" align="center" /><thead><row><entry namest="1" nameend="12" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry>CL</entry><entry>CL</entry><entry>SP</entry><entry>RE</entry><entry>SP</entry><entry>RE</entry><entry>RE</entry><entry>SP</entry><entry>SP</entry><entry>RE</entry><entry>RE</entry><entry>SP</entry></row><row><entry namest="1" nameend="12" align="center" rowsep="1" /></row></tbody></tgroup></table></tables><br /> then, for each coefficient, χ is:
<tables id="TABLE-US-00004" num="00004"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="12"><colspec colname="1" colwidth="21pt" align="center" /><colspec colname="2" colwidth="14pt" align="center" /><colspec colname="3" colwidth="21pt" align="center" /><colspec colname="4" colwidth="14pt" align="center" /><colspec colname="5" colwidth="21pt" align="center" /><colspec colname="6" colwidth="14pt" align="center" /><colspec colname="7" colwidth="21pt" align="center" /><colspec colname="8" colwidth="14pt" align="center" /><colspec colname="9" colwidth="21pt" align="center" /><colspec colname="10" colwidth="14pt" align="center" /><colspec colname="11" colwidth="21pt" align="center" /><colspec colname="12" colwidth="21pt" align="center" /><thead><row><entry namest="1" nameend="12" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry>1</entry><entry>1</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry></row><row><entry namest="1" nameend="12" align="center" rowsep="1" /></row></tbody></tgroup></table></tables><br /> and then, for each coefficient, Q is:
<tables id="TABLE-US-00005" num="00005"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="12"><colspec colname="1" colwidth="21pt" align="center" /><colspec colname="2" colwidth="14pt" align="center" /><colspec colname="3" colwidth="21pt" align="center" /><colspec colname="4" colwidth="14pt" align="center" /><colspec colname="5" colwidth="21pt" align="center" /><colspec colname="6" colwidth="14pt" align="center" /><colspec colname="7" colwidth="21pt" align="center" /><colspec colname="8" colwidth="14pt" align="center" /><colspec colname="9" colwidth="21pt" align="center" /><colspec colname="10" colwidth="14pt" align="center" /><colspec colname="11" colwidth="21pt" align="center" /><colspec colname="12" colwidth="21pt" align="center" /><thead><row><entry namest="1" nameend="12" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry>32</entry><entry>32</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry></row><row><entry namest="1" nameend="12" align="center" rowsep="1" /></row></tbody></tgroup></table></tables><br /> Characterization of Quantization Noise
The error that is being made by putting two similar wavelet coefficients in two different quantization bins is usually the same magnitude for all quantization bins, except in some instances e.g., where the zero bin is wider. (In such a case the difference can be 1.5Q) It is illustrated in the following example using a scalar quantization with Q=32.
<tables id="TABLE-US-00006" num="00006"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="259pt" align="center" /><thead><row><entry namest="1" nameend="1" rowsep="1">TABLE 2</entry></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Example for quantization highpass coefficients, Q = 32.</entry></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="13"><colspec colname="1" colwidth="42pt" align="left" /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="14pt" align="char" char="." /><colspec colname="8" colwidth="14pt" align="char" char="." /><colspec colname="9" colwidth="14pt" align="char" char="." /><colspec colname="10" colwidth="14pt" align="char" char="." /><colspec colname="11" colwidth="14pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>highpass</entry><entry>96</entry><entry>95</entry><entry>96</entry><entry>99</entry><entry>32</entry><entry>0</entry><entry>0</entry><entry>32</entry><entry>17</entry><entry>−6</entry><entry>0</entry><entry>0</entry></row><row><entry>coeffs d</entry></row><row><entry>quantized</entry><entry>3</entry><entry>2</entry><entry>3</entry><entry>3</entry><entry>1</entry><entry>0</entry><entry>0</entry><entry>1</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry></row><row><entry>coeffs d′</entry></row><row><entry>reconstructed</entry><entry>112</entry><entry>80</entry><entry>112</entry><entry>112</entry><entry>48</entry><entry>0</entry><entry>0</entry><entry>48</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry></row><row><entry>coeffs {circumflex over (d)}</entry></row><row><entry namest="1" nameend="13" align="center" rowsep="1" /></row></tbody></tgroup></table></tables><br /> In Table 2 above, with Q being 32, the quantized coefficients d′ represent the result of dividing the high pass coefficients by Q and rounding it. The value 80 in the reconstructed coefficients {circumflex over (d)} being vastly different than its neighboring reconstructed coefficients (both at 112) causes an artifact. (An error of 32 which is the quantization bin size).
An example for quantization of highpass coefficients with different numbers of coding passes:
<tables id="TABLE-US-00007" num="00007"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="259pt" align="center" /><thead><row><entry namest="1" nameend="1" rowsep="1">TABLE 3</entry></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Example for quantization highpass coefficients, depending on</entry></row><row><entry>significance values that change Q.</entry></row><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="13"><colspec colname="1" colwidth="42pt" align="left" /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="14pt" align="char" char="." /><colspec colname="8" colwidth="14pt" align="char" char="." /><colspec colname="9" colwidth="14pt" align="char" char="." /><colspec colname="10" colwidth="14pt" align="char" char="." /><colspec colname="11" colwidth="14pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>highpass</entry><entry>96</entry><entry>95</entry><entry>96</entry><entry>99</entry><entry>32</entry><entry>0</entry><entry>0</entry><entry>32</entry><entry>17</entry><entry>−6</entry><entry>0</entry><entry>0</entry></row><row><entry>coefficients</entry></row><row><entry>d</entry></row><row><entry>quantizer Q</entry><entry>32</entry><entry>32</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry><entry>16</entry></row><row><entry>quantized</entry><entry>3</entry><entry>2</entry><entry>6</entry><entry>6</entry><entry>2</entry><entry>0</entry><entry>0</entry><entry>2</entry><entry>1</entry><entry>0</entry><entry>0</entry><entry>0</entry></row><row><entry>coeffs d′</entry></row><row><entry>reconstructed</entry><entry>112</entry><entry>80</entry><entry>104</entry><entry>104</entry><entry>40</entry><entry>0</entry><entry>0</entry><entry>40</entry><entry>24</entry><entry>0</entry><entry>0</entry><entry>0</entry></row><row><entry>coeffs {circumflex over (d)}</entry></row><row><entry namest="1" nameend="13" align="center" rowsep="1" /></row></tbody></tgroup></table></tables><br /> Note that the quantizer Q changes from 32 to 16. In this case, there is a mismatch of 32 on one side of the 2<sup>nd </sup>coefficient and 24 on the other side.
A finer distinction is made by looking at the smoothness of the reconstructed image. A mismatch in the quantization bin may lead to an “outlier” in the reconstructed lowpass component. This outlier is the result of applying the inverse transform to the mismatched quantized coefficients. Therefore, the size A of the difference between the outlier and its neighbors theoretically be determined by the information given on the quantization and inverse wavelet transform. In other words, the maximum difference between coefficients is identified. In one embodiment, the maximum difference is assumed to be a multiple of Q. This is illustrated at the following example using the reversible 5-3 wavelet transform.
The forward transform is characterized as follows:
<maths id="MATH-US-00009" num="00009"><math overflow="scroll"><mrow><mrow><msup><mi>Y</mi><mi>H</mi></msup><mo></mo><mrow><mo>(</mo><mrow><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow><mo>=</mo><mrow><mrow><mi>X</mi><mo></mo><mrow><mo>(</mo><mrow><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow><mo>-</mo><mrow><mrow><mo>⌊</mo><mfrac><mrow><mrow><mi>X</mi><mo></mo><mrow><mo>(</mo><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>)</mo></mrow></mrow><mo>+</mo><mrow><mi>X</mi><mo></mo><mrow><mo>(</mo><mrow><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>+</mo><mn>2</mn></mrow><mo>)</mo></mrow></mrow></mrow><mn>2</mn></mfrac><mo>⌋</mo></mrow><mo>.</mo></mrow></mrow></mrow></math></maths><br /> where odd-indexed coefficients of output signal Y are computed first for all values of n such that
<maths id="MATH-US-00010" num="00010"><math overflow="scroll"><mrow><mrow><mrow><mrow><mo>⌈</mo><mfrac><msub><mi>i</mi><mn>0</mn></msub><mn>2</mn></mfrac><mo>⌉</mo></mrow><mo>-</mo><mn>1</mn></mrow><mo>≤</mo><mi>n</mi><mo><</mo><mrow><mo>⌈</mo><mfrac><msub><mi>i</mi><mn>1</mn></msub><mn>2</mn></mfrac><mo>⌉</mo></mrow></mrow><mo>,</mo></mrow></math></maths><br /> and
<maths id="MATH-US-00011" num="00011"><math overflow="scroll"><mrow><mrow><msup><mi>Y</mi><mi>L</mi></msup><mo></mo><mrow><mo>(</mo><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>)</mo></mrow></mrow><mo>=</mo><mrow><mrow><mi>X</mi><mo></mo><mrow><mo>(</mo><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>)</mo></mrow></mrow><mo>+</mo><mrow><mo>⌊</mo><mfrac><mrow><mrow><mi>Y</mi><mo></mo><mrow><mo>(</mo><mrow><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>-</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow><mo>+</mo><mrow><mi>Y</mi><mo></mo><mrow><mo>(</mo><mrow><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow><mo>+</mo><mn>2</mn></mrow><mn>4</mn></mfrac><mo>⌋</mo></mrow></mrow></mrow></math></maths><br /> where the even-indexed coefficients of output signal Y are computed from the even-indexed values of extended signal X and the odd-indexed coefficients of signal Y for all values of n such that
<maths id="MATH-US-00012" num="00012"><math overflow="scroll"><mrow><mrow><mo>⌈</mo><mfrac><msub><mi>i</mi><mn>0</mn></msub><mn>2</mn></mfrac><mo>⌉</mo></mrow><mo>≤</mo><mi>n</mi><mo><</mo><mrow><mrow><mo>⌈</mo><mfrac><msub><mi>i</mi><mn>1</mn></msub><mn>2</mn></mfrac><mo>⌉</mo></mrow><mo>.</mo></mrow></mrow></math></maths><br /> The values of Y(k) such that i<sub>0</sub>≦k<i<sub>1 </sub>form the output.
The inverse transform is characterized as follows:
<maths id="MATH-US-00013" num="00013"><math overflow="scroll"><mrow><mrow><mi>X</mi><mo></mo><mrow><mo>(</mo><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>)</mo></mrow></mrow><mo>=</mo><mrow><mrow><msup><mi>Y</mi><mi>L</mi></msup><mo></mo><mrow><mo>(</mo><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>)</mo></mrow></mrow><mo>-</mo><mrow><mrow><mo>⌊</mo><mfrac><mrow><mrow><msup><mi>Y</mi><mi>H</mi></msup><mo></mo><mrow><mo>(</mo><mrow><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>-</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow><mo>+</mo><mrow><msup><mi>Y</mi><mi>H</mi></msup><mo></mo><mrow><mo>(</mo><mrow><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow><mo>+</mo><mn>2</mn></mrow><mn>4</mn></mfrac><mo>⌋</mo></mrow><mo></mo><mstyle><mspace width="0.8em" height="0.8ex" /></mstyle><mo></mo><mi>for</mi></mrow></mrow></mrow></math></maths><maths id="MATH-US-00013-2" num="00013.2"><math overflow="scroll"><mrow><mrow><mrow><mo>⌊</mo><mfrac><msub><mi>i</mi><mn>0</mn></msub><mn>2</mn></mfrac><mo>⌋</mo></mrow><mo>≤</mo><mi>n</mi><mo><</mo><mrow><mrow><mo>⌊</mo><mfrac><msub><mi>i</mi><mn>1</mn></msub><mn>2</mn></mfrac><mo>⌋</mo></mrow><mo>+</mo><mn>1</mn></mrow></mrow><mo>,</mo><mstyle><mtext></mtext></mstyle><mo></mo><mrow><mrow><mi>X</mi><mo></mo><mrow><mo>(</mo><mrow><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow><mo>=</mo><mrow><mrow><msup><mi>Y</mi><mi>H</mi></msup><mo></mo><mrow><mo>(</mo><mrow><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow><mo>+</mo><mrow><mrow><mo>⌊</mo><mfrac><mrow><mrow><mi>X</mi><mo></mo><mrow><mo>(</mo><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>)</mo></mrow></mrow><mo>+</mo><mrow><mi>X</mi><mo></mo><mrow><mo>(</mo><mrow><mrow><mn>2</mn><mo></mo><mi>n</mi></mrow><mo>+</mo><mn>2</mn></mrow><mo>)</mo></mrow></mrow></mrow><mn>2</mn></mfrac><mo>⌋</mo></mrow><mo></mo><mstyle><mspace width="0.8em" height="0.8ex" /></mstyle><mo></mo><mi>for</mi></mrow></mrow></mrow></mrow></math></maths><maths id="MATH-US-00013-3" num="00013.3"><math overflow="scroll"><mrow><mrow><mo>⌊</mo><mfrac><msub><mi>i</mi><mn>0</mn></msub><mn>2</mn></mfrac><mo>⌋</mo></mrow><mo>≤</mo><mi>n</mi><mo><</mo><mrow><mrow><mo>⌊</mo><mfrac><msub><mi>i</mi><mn>1</mn></msub><mn>2</mn></mfrac><mo>⌋</mo></mrow><mo>.</mo></mrow></mrow></math></maths><br /> The values of X(k) such that i<sub>0</sub>≦k<i<sub>1 </sub>form the output. Note that Y<sup>H </sup>is d when encoding and {circumflex over (d)} when decoding.
Considering a quantization error of Q, then the difference between Y<sub>2n−1</sub><sup>H </sup>and Y<sub>2n+1</sub><sup>H </sup>is at least Q. As a consequence, for a one-dimensional transform, the reconstruction error is of order <ul id="ul0006" list-style="none"><li id="ul0006-0001" num="0000"><ul id="ul0007" list-style="none"><li id="ul0007-0001" num="0128">¼Q for even reconstructed lowpass coefficients and</li><li id="ul0007-0002" num="0129">¾Q for odd reconstructed lowpass coefficients (see Table 4 below).</li></ul></li></ul>
<tables id="TABLE-US-00008" num="00008"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="center" /><thead><row><entry namest="1" nameend="1" rowsep="1">TABLE 4</entry></row></thead><tbody valign="top"><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Reconstruction Error Using a Q and the 1-D 5-3 Transform.</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="5"><colspec colname="1" colwidth="70pt" align="center" /><colspec colname="2" colwidth="21pt" align="center" /><colspec colname="3" colwidth="49pt" align="center" /><colspec colname="4" colwidth="28pt" align="center" /><colspec colname="5" colwidth="49pt" align="center" /><tbody valign="top"><row><entry>quantizer Q</entry><entry>error</entry><entry>Q = 8</entry><entry>Q = 16</entry><entry>Q = 32</entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="5"><colspec colname="1" colwidth="70pt" align="center" /><colspec colname="2" colwidth="21pt" align="center" /><colspec colname="3" colwidth="49pt" align="center" /><colspec colname="4" colwidth="28pt" align="char" char="." /><colspec colname="5" colwidth="49pt" align="char" char="." /><tbody valign="top"><row><entry>X(2m)</entry><entry>¼Q</entry><entry>2</entry><entry>4</entry><entry>8</entry></row><row><entry>X(2m + 1)</entry><entry>¾Q</entry><entry>6</entry><entry>12</entry><entry>24</entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
Thus, the technique described herein examines differences between quantized coefficients and generates a threshold by which to characterize that difference.
Characterization of Quantization Noise and Threshold Selection for the 2D Case
In J2K, and in general for image compression, a two-dimensional (2D) wavelet transform is used. In J2K, a 2D forward wavelet transform is performed by applying a 1D vertical forward transform to the image columns and then applying a 1D horizontal forward transform to the rows of vertical transform coefficients. The 2D inverse wavelet transform is performed by applying a 1D horizontal inverse transform to coefficient rows followed by a 1D vertical inverse transform.
Coefficients for the 2D transform are named:
LL horizontal lowpass, vertical lowpass
HL horizontal highpass, vertical lowpass
LH horizontal lowpass, vertical highpass
HH horizontal highpass, vertical highpass
HL, LH, HH are all considered detail coefficients or highpass coefficients.
In the following, it is assumed that the LL coefficient are not quantized, but the detail coefficients are. In some applications it might be that also the LL coefficients are quantized, but the LL-quantization is much less than the quantization of the detail coefficients and can, therefore, be ignored in the following calculations.
In general, it is assumed that visible compression artifacts occur if two similar wavelet coefficients are divided into different quantization bins. For example, if Q equals 8, then 7 belongs is quantized to 0 and reconstructed as 4 (noise 3), whereas 8 is quantized to 1 and reconstructed as 12 (noise 4). That means a reconstructed wavelet coefficients contain quantization noise of magnitude≦Q/2.
The inverse transform on rows of LL and HL components are as follows: <br /><i>X</i><sup>L</sup>(2<i>N</i>)=<i>Y</i><sup>LL</sup>(2<i>N</i>)−└¼(<i>Y</i><sup>HL</sup>(2<i>N−</i>1)+<i>Y</i><sup>HL</sup>(2<i>N+</i>1))+½┘<br /><i>X</i><sup>L</sup>(2<i>N+</i>1)=<i>Y</i><sup>HL</sup>(2<i>N+</i>1)+└½(<i>X</i><sup>L</sup>(2<i>N</i>)+<i>X</i><sup>L</sup>(2<i>N+</i>2))┘
Following the 1D approach, the coefficients X<sup>L</sup><sub>2N </sub>contain a noise term of ¼Q due to the quantization of the Y<sup>HL </sup>coefficients. The coefficients X<sup>L</sup><sub>2N+1 </sub>will contain a noise term smaller or equal to (½+¼)Q, which equals ¾Q.
The inverse transform on rows of LH and HH components are as follows: <br /><i>X</i><sup>H</sup>(2<i>N</i>)=<i>Y</i><sup>LH</sup>(2<i>N</i>)−└¼(<i>Y</i><sup>HH</sup>(2<i>N−</i>1)+<i>Y</i><sup>HH</sup>(2<i>N+</i>1))+½┘<br /><i>X</i><sup>H</sup>(2<i>N+</i>1)=<i>Y</i><sup>HH</sup>(2<i>N+</i>1)+└½(<i>X</i><sup>H</sup>(2<i>N</i>)+<i>X</i><sup>H</sup>(2<i>N+</i>2))┘
Since the quantized coefficients Y<sup>LH </sup>are used in this part of the inverse transform instead of the non-quantized coefficient Y<sup>LL</sup>, which were used previously, the coefficients X<sup>H</sup>(2N) will contain a noise term of (½+¼)Q. The coefficients X<sup>H</sup>(2N+1) will contain a noise term smaller or equal to (½+¾)Q which equals 5/4Q. The magnitude of the quantization noise after the inverse transform on columns is summarized in Table 5 below.
<tables id="TABLE-US-00009" num="00009"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="center" /><thead><row><entry namest="1" nameend="1" rowsep="1">TABLE 5</entry></row></thead><tbody valign="top"><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Magnitude of Quantization Noise After</entry></row><row><entry>Horizontal Inverse Transform</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="5"><colspec colname="1" colwidth="70pt" align="center" /><colspec colname="2" colwidth="21pt" align="center" /><colspec colname="3" colwidth="49pt" align="center" /><colspec colname="4" colwidth="28pt" align="center" /><colspec colname="5" colwidth="49pt" align="center" /><tbody valign="top"><row><entry>coefficients</entry><entry>Error</entry><entry>Q = 8</entry><entry>Q = 16</entry><entry>Q = 32</entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="5"><colspec colname="1" colwidth="70pt" align="center" /><colspec colname="2" colwidth="21pt" align="center" /><colspec colname="3" colwidth="49pt" align="char" char="." /><colspec colname="4" colwidth="28pt" align="char" char="." /><colspec colname="5" colwidth="49pt" align="char" char="." /><tbody valign="top"><row><entry>X<sup>L</sup>(2N,·)</entry><entry>¼Q</entry><entry>2</entry><entry>4</entry><entry>8</entry></row><row><entry>X<sup>L</sup>(2N + 1,·)</entry><entry>¾Q</entry><entry>6</entry><entry>12</entry><entry>24</entry></row><row><entry>X<sup>H</sup>(2N,·)</entry><entry>¾Q</entry><entry>6</entry><entry>12</entry><entry>24</entry></row><row><entry>X<sup>H</sup>(2N + 1,·)</entry><entry> 5/4Q</entry><entry>10</entry><entry>20</entry><entry>40</entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row></tbody></tgroup></table></tables><br /> In the notation (2N,•) or (2N+1,•), the “•” represents all the elements in the row. <br /> The inverse transform on columns of X<sup>L </sup>and X<sup>H </sup>components are as follows: <br /><i>X</i>(2<i>N,</i>2<i>N</i>)=<i>X</i><sup>L</sup>(2<i>N,</i>2<i>N</i>)−└¼(<i>X</i><sup>H</sup>(2<i>N,</i>2N−1)+<i>X</i><sup>H</sup>(2<i>N,</i>2<i>N+</i>1)+½)┘<br /><i>X</i>(2<i>N,</i>2<i>N+</i>1)=<i>X</i><sup>H</sup>(2<i>N,</i>2<i>N+</i>1)+└½(<i>X</i>(2<i>N,</i>2<i>N</i>)+<i>X</i>(2N,2<i>N+</i>2))┘<br /><i>X</i>(2<i>N+</i>1,2<i>N</i>)=<i>X</i><sup>L</sup>(2<i>N+</i>1,2<i>N</i>)−└¼(<i>X</i><sup>H</sup>(2<i>N+</i>1,2<i>N−</i>1)+<i>X</i><sup>H</sup>(2<i>N+</i>1,2<i>N+</i>1)+½)┘<br /><i>X</i>(2<i>N+</i>1,2<i>N+</i>1)=<i>X</i><sup>H</sup>(2<i>N+</i>1,2<i>N+</i>1)+└½(<i>X</i>(2<i>N+</i>1,2<i>N</i>)+<i>X</i>(2<i>N+</i>1,2<i>N+</i>2))┘
Quantization noise contained in the components after the inverse transforms on rows is displayed in Table 6 below.
<tables id="TABLE-US-00010" num="00010"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="center" /><thead><row><entry namest="1" nameend="1" rowsep="1">TABLE 6</entry></row></thead><tbody valign="top"><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Maximum Magnitude of Quantization Noise</entry></row><row><entry>After Complete Inverse Transform</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="5"><colspec colname="1" colwidth="105pt" align="center" /><colspec colname="2" colwidth="21pt" align="center" /><colspec colname="3" colwidth="35pt" align="center" /><colspec colname="4" colwidth="28pt" align="center" /><colspec colname="5" colwidth="28pt" align="center" /><tbody valign="top"><row><entry>Coefficients</entry><entry>Error</entry><entry>Q = 8</entry><entry>Q = 16</entry><entry>Q = 32</entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="5"><colspec colname="1" colwidth="105pt" align="center" /><colspec colname="2" colwidth="21pt" align="center" /><colspec colname="3" colwidth="35pt" align="center" /><colspec colname="4" colwidth="28pt" align="center" /><colspec colname="5" colwidth="28pt" align="char" char="." /><tbody valign="top"><row><entry>X(2N,2N) ± X(2N,2N + 1)</entry><entry>2Q</entry><entry>16</entry><entry>32</entry><entry>64</entry></row><row><entry>X(2N + 1,2N) ± X(2N + 1,2N + 1)</entry><entry>4Q</entry><entry>32</entry><entry>64</entry><entry>128</entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row></tbody></tgroup></table></tables><br /> Removal of Quantization Noise
Using this knowledge on quantization, a denoising of the reconstructed L coefficients is performed. This is illustrated with a 1-dimensional example. In order to remove the outlier and smooth out the smooth region, a redundant Haar wavelet transform (filter
<maths id="MATH-US-00014" num="00014"><math overflow="scroll"><mrow><mrow><mfrac><mn>1</mn><msqrt><mn>2</mn></msqrt></mfrac><mo></mo><mrow><mo>[</mo><mn>11</mn><mo>]</mo></mrow></mrow><mo>,</mo><mrow><mfrac><mn>1</mn><msqrt><mn>2</mn></msqrt></mfrac><mo></mo><mrow><mo>[</mo><mrow><mn>1</mn><mo>-</mo><mn>1</mn></mrow><mo>]</mo></mrow></mrow></mrow></math></maths><br /> is computed on samples. This transform computes the differences between neighboring samples. On the wavelet coefficients of that transform, in one embodiment, a thresholding of coefficients is performed in the following way. The Haar wavelet coefficients computed from <br /><i>X</i>(2<i>N,</i>2<i>N</i>),<i>X</i>(2<i>N,</i>2<i>N+</i>1),<i>X</i>(2<i>N+</i>1,2N), <i>X</i>(2<i>N+</i>1,2<i>N+</i>1)<br /> result in <br />(<i>X</i>(2<i>N,</i>2<i>N</i>)+<i>X</i>(2<i>N,</i>2<i>N+</i>1)−<i>X</i>(2<i>N+</i>1,2<i>N</i>)−<i>X</i>(2<i>N+</i>1,2<i>N+</i>1))/2;<br />(<i>X</i>(2<i>N,</i>2<i>N</i>)−<i>X</i>(2<i>N,</i>2<i>N+</i>1)+<i>X</i>(2<i>N+</i>1,2<i>N</i>)−<i>X</i>(2<i>N+</i>1,2<i>N+</i>1))/2; and<br />(<i>X</i>(2<i>N,</i>2<i>N</i>)−<i>X</i>(2<i>N,</i>2<i>N+</i>1)−<i>X</i>(2<i>N+</i>1,2<i>N</i>)+<i>X</i>(2<i>N+</i>1,2<i>N+</i>1))/2.
Using the results from Table 6, the maximal noise terms contained in the Haar coefficients are approximately of order (2Q+4Q)/2, which equals 3Q.
A highpass Haar wavelet coefficient d is set to zero if |d|<T and is kept if |d|≧T. From the estimation on the error between two mismatched coefficients given above in Tables 4 and 6, a threshold T for the Haar wavelet coefficients can be derived as <br /><i>T</i>=(error[<i>X</i>(2<i>m</i>)]+error[<i>X</i>(2<i>m+</i>1)])/√{square root over (2)}<br /> for the 1-dimensional transform and T=(error[X(2N,2N)±X(2N,2N+1)]+error[X(2N+1,2N)±X(2N+1,2N+1)])/2 for the 2-dimensional transform.
These thresholds are upper bounds that might be too large for many applications. The threshold for the 2-dimensional transform can often be lowered. Most visible quantization noise is created when one single coefficient is pushed into a different quantization bin than all of its surrounding neighbors. As a result, wavelet basis vectors show up as artifacts on smooth regions. In one embodiment, in order to remove those isolated basis vectors, the 2-dimensional threshold can be lowered as described in the following operations: <ul id="ul0008" list-style="none"><li id="ul0008-0001" num="0000"><ul id="ul0009" list-style="none"><li id="ul0009-0001" num="0152">(1) Take the lowpass and high pass filter of the inverse transform and write them as vectors filter_low=[ . . . ], filter_high=[ . . . ].</li><li id="ul0009-0002" num="0153">(2) Compute the matrices <ul id="ul0010" list-style="none"><li id="ul0010-0001" num="0154">M<sub>HL</sub>=(filter_high)<sup>T</sup>·filter_low</li><li id="ul0010-0002" num="0155">M<sub>LH</sub>=M<sub>HL</sub><sup>T </sup></li><li id="ul0010-0003" num="0156">M<sub>HH</sub>=(filter_high)<sup>T</sup>·filter_high.</li></ul></li><li id="ul0009-0003" num="0157">(3) Perform one level of a redundant Haar transform on the matrices M.</li><li id="ul0009-0004" num="0158">(4) Set the threshold T<sub>min </sub>as the (maximum of the absolute values of all the wavelet coefficients)·Q for 2-dim signals.</li><li id="ul0009-0005" num="0159">(5) Set the threshold T<sub>min </sub>as the (maximum of the absolute values of the wavelet coefficients of filter_high)·Q for 1-dim signals</li></ul></li></ul>
For the irreversible 5-3 wavelet system with lowpass filter [0.5 1 0.5] and highpass filter [−0.125−0.25 0.75−0.25−0.125] T<sub>min </sub>results in T<sub>min</sub>=¾ Q for the 2-dimensional transform and T<sub>min</sub>=Q/√{square root over (2)} for the 1-dimensional transform.
For the Daubechies 9-7 filter the lowpass and highpass filters are given as: <br />lowpass =[−0.0912−0.0575 0.5912 1.1150 0.5912−0.0575−0.0912],<br />highpass=[0.0267 0.0168−0.0782−0.2668 0.6029−0.2668−0.0782 0.0168 0.0267].
The threshold T<sub>min </sub>results as T<sub>min</sub>=0.7471·Q for the 2-dimensional transform and T<sub>min</sub>=0.6150·Q for the 1-dimensional transform.
Given lowpass and highpass filters of the inverse transform, a maximum threshold similar to the one derived for the reversible 5-3 transform in Table 7 can be derived by computing the maximal error being propagated through the inverse transform allowing more than just one coefficient in a neighborhood having maximal quantization error. In one embodiment, the operations for computing that threshold T<sub>max </sub>are: <ul id="ul0011" list-style="none"><li id="ul0011-0001" num="0000"><ul id="ul0012" list-style="none"><li id="ul0012-0001" num="0164">(1) Take the lowpass and high pass filter of the inverse transform and write them as vectors F=filter_low=[ . . . ], G=filter_high=[ . . . ].</li><li id="ul0012-0002" num="0165">(2) Denote the two subsampled versions of the filters by F<sub>0</sub>,F<sub>1 </sub>and G<sub>0</sub>,G<sub>1</sub>.</li><li id="ul0012-0003" num="0166">(3) Compute the matrix</li></ul></li></ul>
<maths id="MATH-US-00015" num="00015"><math overflow="scroll"><mrow><mi>M</mi><mo>=</mo><mrow><mo>(</mo><mrow><mrow><mrow><mrow><mo>[</mo><mtable><mtr><mtd><mrow><mo></mo><msub><mi>F</mi><mn>0</mn></msub><mo></mo></mrow></mtd><mtd><mrow><mo></mo><msub><mi>G</mi><mn>0</mn></msub><mo></mo></mrow></mtd></mtr><mtr><mtd><mrow><mo></mo><msub><mi>F</mi><mn>1</mn></msub><mo></mo></mrow></mtd><mtd><mrow><mo></mo><msub><mi>G</mi><mn>1</mn></msub><mo></mo></mrow></mtd></mtr></mtable><mo>]</mo></mrow><mo>.</mo><mstyle><mspace width="0.8em" height="0.8ex" /></mstyle><mo></mo><mi>where</mi></mrow><mo></mo><mstyle><mspace width="0.8em" height="0.8ex" /></mstyle><mo></mo><mrow><mo></mo><mi>F</mi><mo></mo></mrow><mo></mo><mstyle><mspace width="0.8em" height="0.8ex" /></mstyle><mo></mo><mi>denotes</mi><mo></mo><mstyle><mspace width="0.8em" height="0.8ex" /></mstyle><mo></mo><mi>the</mi><mo></mo><mstyle><mspace width="0.8em" height="0.8ex" /></mstyle><mo></mo><msub><mi>l</mi><mn>1</mn></msub></mrow><mo>-</mo><mrow><mi>norm</mi><mo></mo><mstyle><mspace width="0.8em" height="0.8ex" /></mstyle><mo></mo><mrow><munder><mo>∑</mo><mi>k</mi></munder><mo></mo><mrow><mrow><mo></mo><mrow><mi>F</mi><mo></mo><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></mrow><mo></mo></mrow><mo>.</mo></mrow></mrow></mrow></mrow></mrow></mrow></math></maths><ul id="ul0013" list-style="none"><li id="ul0013-0001" num="0000"><ul id="ul0014" list-style="none"><li id="ul0014-0001" num="0168">(4) Denote the entries in M as m1,m2,m3,m4 and compute T<sub>max </sub>as T<sub>max</sub>=(m1+m2+m3+m4)/2.</li></ul></li></ul>
In most applications, it is advised to choose a threshold between T<sub>min </sub>and T<sub>max</sub>. A good choice is T<sub>middle</sub>=max(T<sub>min</sub>, ½T<sub>max</sub>).
A summary of the different treshold for the reversible 5-3 and the Daubechies 9-7 transform is given in Table 7.
<tables id="TABLE-US-00011" num="00011"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="center" /><thead><row><entry namest="1" nameend="1" rowsep="1">TABLE 7</entry></row></thead><tbody valign="top"><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row><row><entry>Thesholds for Thresholding Quantization</entry></row><row><entry>Noise after a Haar Transform</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="5"><colspec colname="1" colwidth="84pt" align="left" /><colspec colname="2" colwidth="35pt" align="left" /><colspec colname="3" colwidth="28pt" align="center" /><colspec colname="4" colwidth="28pt" align="center" /><colspec colname="5" colwidth="42pt" align="center" /><tbody valign="top"><row><entry>2-dimensional transforms</entry><entry>error</entry><entry>Q = 8</entry><entry>Q = 16</entry><entry>Q = 32</entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="5"><colspec colname="1" colwidth="84pt" align="left" /><colspec colname="2" colwidth="35pt" align="left" /><colspec colname="3" colwidth="28pt" align="char" char="." /><colspec colname="4" colwidth="28pt" align="char" char="." /><colspec colname="5" colwidth="42pt" align="char" char="." /><tbody valign="top"><row><entry>T<sub>min </sub>[rev 53 ]</entry><entry>0.75 Q</entry><entry>6</entry><entry>12</entry><entry>24</entry></row><row><entry>T<sub>max </sub>[rev 53 ]</entry><entry>3 Q</entry><entry>24</entry><entry>48</entry><entry>96</entry></row><row><entry>T<sub>middle </sub>[rev 53]</entry><entry>1.5 Q</entry><entry>12</entry><entry>24</entry><entry>48</entry></row><row><entry>T<sub>min </sub>[97]</entry><entry>0.7471 Q</entry><entry>5.9768</entry><entry>11.9536</entry><entry>23.9072</entry></row><row><entry>T<sub>max </sub>[97]</entry><entry>4.5326 Q</entry><entry>36.2608</entry><entry>72.5216</entry><entry>145.0432</entry></row><row><entry>T<sub>middle </sub>[07]</entry><entry>2.2663 Q</entry><entry>18.1304</entry><entry>36.2608</entry><entry>72.5216</entry></row><row><entry namest="1" nameend="5" align="center" rowsep="1" /></row></tbody></tgroup></table></tables>
In the situation that coefficients of the same size are quantized with different values of Q (this is known to the decoder), additional criteria can be chosen. In an example of quantizing using two passes through the image, a coefficient is quantized with a smaller bin if it is surrounded by zeros rather than if it is surrounded by nonzero coefficients. In this case, a Haar wavelet coefficient is, for example, set to zero if the preceding coefficient in the scanning order is also below that threshold T and if the two neighboring coefficients have different signs.
After performing the thresholding, an inverse Haar transform is performed. By doing this, a denoising via wavelet shrinkage using a one- or M-level Haar wavelet transform is performed on each sample or coefficient that is computed during the reconstruction of the entire image. A schematic overview is given in <figref idref="DRAWINGS">FIG. 1A</figref>. The processing logic performing the operations shown in <figref idref="DRAWINGS">FIG. 1A</figref> may comprise hardware (e.g., dedicated logic, circuitry, etc.), software (such as run on a general purpose computer system or a dedicated machine), or a combination of both.
Referring to <figref idref="DRAWINGS">FIG. 1A</figref>, processing logic applies an inverse JPEG 2000 discrete wavelet transform (DWT) to LL coefficients at level L (signal <b>101</b>) and high pass coefficients signal <b>102</b> at level L to produce noisy samples at level L−1 (signal <b>103</b>). This DWT is also referred to herein as the compression wavelet transform. Processing logic then performs wavelet sharpening and smoothing on these samples (processing block <b>110</b>). In one embodiment, the wavelet sharpening and smoothing and denoising (processing block <b>110</b>) comprises processing logic applying a m-level forward Haar transform (where m equals, for example, 1, 2, 3, 4, etc.) (processing block <b>104</b>), followed by thresholding of the coefficients (processing block <b>105</b>). This wavelet transform is also referred to herein as the enhancement wavelet transform. Thereafter, processing logic applies a m-level inverse Haar transform (processing block <b>106</b>) to the samples. The results of applying the wavelet sharpening and smoothing (processing block <b>110</b>) are the generation of denoised samples at level L−1 (signal <b>107</b>).
Processing logic applies an inverse JPEG 2000 DWT to the denoised samples at level L−1 (LL coefficients) (signal <b>107</b>) and the high pass coefficients at level L−1 with quantization noise (processing block <b>108</b>) to generate noisy samples at level L−2 (processing block <b>109</b>). Processing logic applies the wavelet sharpening and smoothing (processing block <b>110</b>) on each successive level of noisy samples to generate more denoised samples at a lower level and the processing repeats until denoised image samples at level 1 (processing block <b>111</b>) are generated.
Then processing logic applies an inverse JPEG 2000 DWT to the denoised samples at level 1 (LL coefficients at level 1) (processing block <b>111</b>) and the high pass coefficients at level 1 (processing block <b>112</b>) to generate noisy samples at level 0 (processing block <b>113</b>). Thereafter, wavelet sharpening and smoothing <b>110</b> is applied again to the noisy samples to produce the denoised samples at level 0 (processing block <b>114</b>), which is the denoised image.
Note that in alternate embodiments, the wavelet sharpening and smoothing is only applied to a subset of all the samples or only on certain levels. For example, in one embodiment, the wavelet sharpening and smoothing is only performed on the noisy samples at level 0. For example, enhancement may only be performed over a range of levels L to L*>1 (e.g., level 5 to 3, 4 to 2, 5 to 1, etc.) for a particular monitor or display or selected levels L<sub>1</sub>, L<sub>2</sub>, L<sub>3</sub>, (e.g., 5, 3, 2).
Depending on the amount of compression and the size of quantization bins, it might be useful sometimes to use several levels of a redundant Haar transform for the denoising procedure.
<figref idref="DRAWINGS">FIG. 1B</figref> is a block diagram of one embodiment of a decoder. Referring to <figref idref="DRAWINGS">FIG. 1B</figref>, an inverse discrete wavelet transform is coupled to receive image data and apply an inverse discrete wavelet transform filter to the image data. The output of inverse wavelet transform <b>121</b> is coupled to inputs of characterization block <b>122</b> and denoising block <b>123</b>. Characterization noise block <b>122</b> characterizes the quantization noise in reconstructed data generated by the application of the inverse wavelet transform <b>121</b>. The output of characterization noise block <b>122</b> is coupled to the input of denoising block <b>123</b>. Denoising block <b>123</b> removes the quantization noise from the reconstructed data that is constructed during decoding.
Deblurring With “Embedded WSS Processing” Using the Compressed Data Stream
As previously discussed above, the WSS-technology provides a solution to the classical restoration problem that involves solving a noise removal and a deblurring problem. A second operation similar to the WSS technology may be used to also perform the inversion of a blurring on the compressed coefficients.
After the thresholding of coefficients of the 1-level (M-level) redundant Haar transform performed on the samples at level 1, the nonzero coefficients at level m are rescaled. In one embodiment, the rescaling comprises multiplying the non zero coefficients at level m by R<sup>1/l</sup>·2<sup>mα</sup>, where m=1 . . . M, where α is the parameter that determines the degree of smoothing (α>0) or sharpening (α<0) and R is the renormalization constant that preserves the norm of the image. Since the quantization noise is removed already, only the “true” parts of the image are enhanced by the reweighting. Since this version of WSS operates directly on wavelet coefficients (of a different transform) during the inverse transform, it is referred to herein as “embedded WSS”. The parameter R and α can be determined following the rules in U.S. patent application Ser. No. 09/467,544, entitled “Multiscale Sharpening and Smoothing With Wavelets,” filed Dec. 10, 1999 and U.S. patent application Ser. No. 09/658,393, entitled “Wavelet-Based Image Processing Path,” filed Sep. 8, 2000 based on theoretical smoothing characteristics of a sensor and modeling of an image in Besov spaces. However, it is also possible to derive estimates for α and R directly from experimental studies of devices such as CCDs and a series of test images.
Range for Sharpening or Smoothing Parameter α Dependent on Smoothness of the Wavelet System γ
In one embodiment, sharpening and smoothing is expressed by rescaling wavelet coefficients by multiplication with the factor R<sup>1/l</sup>·2<sup>mα</sup>, where α is the sharpening/smoothing parameter and R a renormalization factor. The range of possible values for α is bounded by the smoothness of the wavelet system γ and the smoothness of the signal. If the signal has Hoelder regularity β then α has to satisfy the condition 0<β+α<γ, i.e. α∈(−β,γ−β).
For overcomplete wavelet transforms using orthogonal wavelets, the regularity γ is approximately the smoothness of the autocorrelation function of the wavelet function. As a consequence, the overcomplete Haar system has γ=1. For the overcomplete biorthogonal 5-3 system, a similar value for γ has performed well in the experiments.
A scanned document typically has a smoothness β>1. Therefore, α is set as α=−1 for the application of the enhancement of a scanned document.
Embedded WSS can be demonstrated in a similar schematic overview as the noise removal in <figref idref="DRAWINGS">FIG. 1</figref> by substituting the dashed Haar-transform block by the following block that includes an additional resealing of coefficients for the deblurring. This is shown in <figref idref="DRAWINGS">FIG. 2</figref>. Note that although the use of the Haar transform is described herein, other transforms may be used for the same purpose, such as, for example, the 2,6 or 5,3 transforms (as well as others) may be used.
Referring to <figref idref="DRAWINGS">FIG. 2</figref>, the wavelet sharpening and smoothing includes processing logic applying a 1- or (m)-level forward Haar transform (processing block <b>204</b>), followed by thresholding of coefficients (processing block <b>205</b>). Thereafter, processing logic applies resealing of coefficients (processing block <b>210</b>). After resealing of coefficients, processing logic applies a 1- or m-level inverse Haar transform (processing block <b>206</b>). In one embodiment, m equals 1, but it may be other numbers as described above.
By performing nonlinear shrinkage combined with resealing, the embedded WSS is not equivalent to any spatial domain linear filter or Fourier-based technique. Moreover, it operates in a noniterative manner which makes it easy to implement hardware or software.
The techniques presented herein, the quantization noise removal and its combination with deblurring using the embedded WSS, operate on the quantized coefficients and are decoder options. The enhancement of LL samples successively during the reconstruction process makes it possible in network applications, for example, to adapt the enhancement process of the image to a special resolution, such as, for example, for the display on a monitor.
Method of Determining Quantization at the JPEG 2000 Encoder Using WSS Information
The discussion above provided a way to reduce artifacts and enhance images after compression by a generic JPEG 2000 encoder. The discussion below provides a technique for reducing artifacts and enhancing images with a special purpose encoder which will work with a generic JPEG 2000 decoder (e.g., JPEG 2000 decoder, a JPEG 2000 decoder without any noise removal or sharpening, etc.).
Preprocessing with WSS
One way to combine WSS technology with JPEG 2000 is to run wavelet smoothing and sharpening on the image before compression as shown in <figref idref="DRAWINGS">FIG. 3</figref>. Referring to <figref idref="DRAWINGS">FIG. 3</figref>, an image <b>300</b> is input into wavelet sharpening and smoothing (WSS) processing block <b>301</b>. In one embodiment, block <b>301</b> is equivalent to <figref idref="DRAWINGS">FIG. 2</figref>. This performs sharpening or smoothing and deblurring. The output of WSS processing block <b>301</b> is image <b>310</b>. Image <b>310</b> is input in JPEG 2000 encoder <b>302</b>, which performs JPEG 2000 encoding, to generate compressed file <b>320</b>. Rate control processing block <b>303</b> monitors compressed file <b>320</b> and feeds back in one or more feedbacks, such as, for instance, feedback <b>304</b> and feedback <b>305</b>. Feedback <b>304</b> is used by JPEG 2000 encoder <b>302</b> to control the JPEG 2000 encoder <b>302</b> to quantize more or less information depending on whether the rate at which data is being output in compressed file <b>320</b> is greater or lesser than the predetermined target rate. Similarly, the feedback <b>305</b> may cause WSS processing block <b>301</b> to perform more denoising, more sharpening, or more smoothing.
Thresholds may be used for preprocessing in the encoder, perhaps as indications of texture, and may be determined in one of the following ways: <ul id="ul0015" list-style="none"><li id="ul0015-0001" num="0000"><ul id="ul0016" list-style="none"><li id="ul0016-0001" num="0192">1. Standard deviation or median of absolute values of coefficients in one region (e.g., HH coefficients at level 1) (global threshold)</li><li id="ul0016-0002" num="0193">2. Standard deviation or median of absolute values of HH coefficients at each level (level-dependent threshold)</li><li id="ul0016-0003" num="0194">3. Standard deviation or median of absolute values of LH/HL/HH coefficients at first level (band-dependent threshold). For the example of two levels of decomposition three thresholds are chosen.</li><li id="ul0016-0004" num="0195">4. Standard deviation or median of absolute values of LH/HL/HH coefficients at each level (level-band-dependent threshold). For the example of two levels of decomposition, six thresholds are chosen.</li><li id="ul0016-0005" num="0196">5. Manually set thresholds (global, level-dependent, level-band dependent) using controls that are part of the user interface of the device.</li><li id="ul0016-0006" num="0197">6. Local thresholding by computing local variances or medians of coefficients within a subband.</li><li id="ul0016-0007" num="0198">7. Using a classifier different thresholds can be set for each class determined by the classifier. As discussed above these thresholds can be determined globally, in a level-dependent method, or in a level and band dependent method.</li></ul></li></ul>
The smoothing operation of WSS eliminates some coefficients that are considered to be “noise” and allows the compression system to spend fewer bits encoding the image. The sharpening operation of WSS increases some coefficients. Increasing the coefficients increases the bit rate required by the encoder, but in some cases eliminates the perception that the compressed image is too “smoothed” (a common complaint in wavelet compression systems).
The separated WSS and JPEG 2000 compression allows different wavelet transforms to be used for enhancement and compression. In one embodiment, the over complete Haar wavelet transforms can be used for WSS, while JPEG 2000 can use the critically sampled 5-3 or 9-7 wavelet transforms. In addition, even though WSS is separate from the compression system, it could be used inside a rate control loop. For example, if after the first denoising and compression of an image the bitrate is too high, rather than increasing the quantization done by the compression system, the smoothing done by the WSS system could be increased.
Integrated WSS and JPEG 2000
Typically, wavelet denoising techniques work by reducing the magnitude of wavelet coefficients in order to suppress noise. In one embodiment, the denoising operation of WSS determines a threshold T for each coefficient and sets the coefficient to zero if it is smaller than the threshold.
There is a relationship between the Q in quantization of a compression system and the T used for thresholding in a noise removal system. If Q is set equivalent to T, then a compression system has the same effect on all coefficients less than the threshold as both soft and hard thresholding. In addition, the “compression” noise added is of the same order of magnitude as the noise being removed. If the “compression” or quantization noise is in the opposite direction of the real noise, it cancels the real noise producing a better image; if it is in the same direction, it adds to the real noise and quantization noise.
Thus, the simplest system, conceptually, is to run any denoising system to determine a set of thresholds to use for each subband, and then to use those values for quantization parameters (normalized to adjust for differences in wavelet bases) for the compression system. Normalization is explained in more detail below. Such a system is shown in <figref idref="DRAWINGS">FIG. 4</figref>.
Referring to <figref idref="DRAWINGS">FIG. 4</figref>, image <b>410</b> is input into WSS processing block <b>401</b> and JPEG 2000 encoder <b>402</b>. Forward WSS processing block <b>401</b> generates quantization parameters in the form of threshold information <b>406</b> to input into the JPEG 2000 encoder <b>402</b>. JPEG 2000 encoder <b>402</b> performs encoding, including performing quantization based on threshold information <b>406</b>, and generates compressed file <b>420</b> to rate control block <b>403</b>. Rate control block <b>403</b> performs rate control by monitoring how many bits are being generated in compressed file <b>420</b> and comparing that to a predetermined target rate. Rate control <b>403</b> generates feedback <b>405</b> to forward WSS processing block <b>401</b> to control the amount of smoothing that is performed as a way to control the quantization performed by JPEG 2000 encoder <b>402</b>. In this manner, the rate may be controlled. Rate control could operate in a feed-forward manner only on a sequence of images. The rate might also be controlled for regions smaller than an entire image. Also in many cases, it is not necessary to rerun the compression system to use a smaller threshold, sometimes compressed data may be discarded.
In this case, WSS again can use a different wavelet system than JPEG 2000, but the entire WSS system is not required. Only the forward transform is needed, and depending on the method to determine the thresholds, the buffer memory for denoising may be vastly reduced.
If reversible filters are used in JPEG 2000, then the quantization value is also changed to the nearest power of two. Of course, computational performance is better if the wavelet denoising system is using the same wavelet transform as the compression system.
If the denoising system determines different thresholds for different coefficients within a subband (e.g., WSS with text vs. non-text distinction), then different quantizations can be applied on each code-block in JPEG 2000. If the denoising system provides different thresholds for regions smaller than a code-block, then, in one embodiment, the thresholds are combined to produce one threshold for the code-block. In one embodiment, this combination could be a simple average. In alternative embodiments, this combination may use the minimum threshold determined for the whole block or some value in between. The wavelet sharpening and smoothing unit or the JPEG 2000 compressor does the combining of thresholds.
Alternatively, some coefficients with very large thresholds may be eliminated while leaving other coefficients. In still another embodiment, coefficients may be quantized more coarsely even though the over all quantization is fine grained. In these cases, the ability to produce a more refined image beyond the current quantization is lost, but that may be acceptable in noise reduction applications.
There could be many methods. For example, suppose the Haar threshold for denoising is T, the change in a coefficient by T has the effect αT on the MSE of an image, and suppose in the compression system error of Q in same subband causes βQ MSE on the image, then use
<maths id="MATH-US-00016" num="00016"><math overflow="scroll"><mrow><mi>Q</mi><mo>=</mo><mrow><mfrac><mrow><mi>α</mi><mo></mo><mstyle><mspace width="0.3em" height="0.3ex" /></mstyle><mo></mo><mi>T</mi></mrow><mi>β</mi></mfrac><mo>.</mo></mrow></mrow></math></maths>
The thresholds from a wavelet denoising system may also be applied as weights for a Rate Distortion (R-D) optimization algorithm (like the JPEG 2000 Verification Model (VM)) or described in David Taubman, “High Performance Scalable Image Compression with EBCOT,” IEEE Trans IP, Vol. 9, no. 7, July 2000.
If the denoising system is using the same wavelet transform as the compression system (and is using a critically sampled wavelet, e.g., not a redundant wavelet), then the denoising operation and compression system do not need to operate independently and substantial computation can be saved. One embodiment of such a system is shown in <figref idref="DRAWINGS">FIG. 5</figref>.
Referring to <figref idref="DRAWINGS">FIG. 5</figref>, an image <b>501</b> is input into component transform <b>502</b> which decorrelates red, green, and blue components into Y, Cb, Cr. The output of component transform <b>502</b> is input in wavelet transform <b>503</b>, which performs a wavelet transform. The coefficients that are output of wavelet transform <b>503</b> are input into WSS threshold determination processing block <b>506</b> and quantization processing block <b>504</b>. The WSS-like threshold determination processing block <b>506</b> generates threshold information <b>510</b> in response to inputs from the wavelet transform processing block <b>503</b> and inputs threshold information <b>510</b> into quantization block <b>504</b>. In response to threshold information <b>510</b>, quantization processing block <b>504</b> performs quantization. The output of quantization processing block <b>504</b> is a quantized compressed image. The quantized compressed image is input to entropy coding <b>505</b> to create compressed file <b>520</b>.
Information from the WSS system may be used to decide if coefficients close to a quantization threshold should be increased or decreased.
EXAMPLES
Example of Using Denoising with Decoding
The following simple example shows how wavelet denoising can improve lossy decompression of signals with smooth regions and edges. Source code and numerical results are provided below. The example processes a one-dimensional (1D) signal for simplicity. <figref idref="DRAWINGS">FIG. 6</figref> illustrates an input signal with step edges.
<figref idref="DRAWINGS">FIG. 7</figref> shows the high pass coefficients for a 5-3 transform assuming a mirror extension at boundaries. <figref idref="DRAWINGS">FIG. 8</figref> shows the low pass coefficients for a 5-3 transform assuming the use of mirror extension at boundaries.
<figref idref="DRAWINGS">FIG. 9</figref> shows the high pass coefficients being quantized with Q equal to 16. In such a case, 30 is quantized to 16+8=24 and −30 is quantized to −24.
Once the high pass coefficients have been quantized, an inverse transform is applied. <figref idref="DRAWINGS">FIG. 10</figref> shows the result of applying the inverse transform. In this example, the result has a mean squared error (MSE) 3.44 difference with the input signal.
Thereafter, the redundant Haar transform is applied. <figref idref="DRAWINGS">FIG. 11</figref> illustrates the Level 1 low pass filter result of applying of the redundant Haar transform. <figref idref="DRAWINGS">FIG. 12</figref> shows the Level 1 high pass filter result of applying of the redundant Haar transform. <figref idref="DRAWINGS">FIG. 13</figref> shows the Level 2 low pass filter result of applying of the redundant Haar transform. <figref idref="DRAWINGS">FIG. 14</figref> shows the Level 2 high pass filter result of applying of the redundant Haar transform.
Then denoising is performed by setting small coefficients to 0. In this example, Q is 16. Following Table 7, a threshold
<maths id="MATH-US-00017" num="00017"><math overflow="scroll"><mrow><mfrac><mn>16</mn><msqrt><mn>2</mn></msqrt></mfrac><mo>≅</mo><mn>11.</mn></mrow></math></maths><br /><figref idref="DRAWINGS">FIG. 15</figref> shows the denoised high pass coefficients for level 1.
For this example, a sharpening parameter α=−½ is chosen. Sharpening with the redundant Haar wavelet varies from α=0 for no sharpening to α=−γ=−1 for maximum sharpening. Therefore, this is half of the maximum sharping. The number of transform levels, L, equals 2 for this example. The renormalization parameter R is 1.825 from:
<maths id="MATH-US-00018" num="00018"><math overflow="scroll"><mrow><msqrt><mfrac><mrow><mo>(</mo><mfrac><mrow><msup><mn>2</mn><mrow><mrow><mo>(</mo><mrow><mi>L</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow><mo></mo><mn>2</mn><mo></mo><mi>γ</mi></mrow></msup><mo>-</mo><msup><mn>2</mn><mrow><mn>2</mn><mo></mo><mi>γ</mi></mrow></msup></mrow><mrow><msup><mn>2</mn><mrow><mn>2</mn><mo></mo><mi>γ</mi></mrow></msup><mo>-</mo><mn>1</mn></mrow></mfrac><mo>)</mo></mrow><mrow><mo>(</mo><mfrac><mrow><msup><mn>2</mn><mrow><mrow><mo>(</mo><mrow><mi>L</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow><mo></mo><mn>2</mn><mo></mo><mrow><mo>(</mo><mrow><mi>γ</mi><mo>+</mo><mi>α</mi></mrow><mo>)</mo></mrow></mrow></msup><mo>-</mo><msup><mn>2</mn><mrow><mn>2</mn><mo></mo><mrow><mo>(</mo><mrow><mi>γ</mi><mo>+</mo><mi>α</mi></mrow><mo>)</mo></mrow></mrow></msup></mrow><msup><mn>2</mn><mrow><mrow><mn>2</mn><mo></mo><mrow><mo>(</mo><mrow><mi>γ</mi><mo>+</mo><mi>α</mi></mrow><mo>)</mo></mrow></mrow><mo>-</mo><mn>1</mn></mrow></msup></mfrac><mo>)</mo></mrow></mfrac></msqrt><mo>=</mo><mrow><msqrt><mfrac><mrow><mo>(</mo><mfrac><mrow><msup><mn>2</mn><mrow><mn>3</mn><mo>·</mo><mn>2</mn><mo>·</mo><mn>1</mn></mrow></msup><mo>-</mo><msup><mn>2</mn><mrow><mn>2</mn><mo>·</mo><mn>1</mn></mrow></msup></mrow><mrow><msup><mn>2</mn><mrow><mn>2</mn><mo>·</mo><mn>1</mn></mrow></msup><mo>-</mo><mn>1</mn></mrow></mfrac><mo>)</mo></mrow><mrow><mo>(</mo><mfrac><mrow><msup><mn>2</mn><mrow><mn>3</mn><mo>·</mo><mn>2</mn><mo>·</mo><mrow><mo>(</mo><mrow><mn>1</mn><mo>-</mo><mfrac><mn>1</mn><mn>2</mn></mfrac></mrow><mo>)</mo></mrow></mrow></msup><mo>-</mo><msup><mn>2</mn><mrow><mn>2</mn><mo>·</mo><mrow><mo>(</mo><mrow><mn>1</mn><mo>-</mo><mfrac><mn>1</mn><mn>2</mn></mfrac></mrow><mo>)</mo></mrow></mrow></msup></mrow><mrow><msup><mn>2</mn><mrow><mn>2</mn><mo>·</mo><mrow><mo>(</mo><mrow><mn>1</mn><mo>-</mo><mfrac><mn>1</mn><mn>2</mn></mfrac></mrow><mo>)</mo></mrow></mrow></msup><mo>-</mo><mn>1</mn></mrow></mfrac><mo>)</mo></mrow></mfrac></msqrt><mo>=</mo><mstyle><mtext></mtext></mstyle><mo></mo><msqrt><mfrac><mrow><mo>(</mo><mfrac><mrow><mn>64</mn><mo>-</mo><mn>4</mn></mrow><mrow><mn>4</mn><mo>-</mo><mn>1</mn></mrow></mfrac><mo>)</mo></mrow><mrow><mo>(</mo><mfrac><mrow><mn>8</mn><mo>-</mo><mn>2</mn></mrow><mrow><mn>2</mn><mo>-</mo><mn>1</mn></mrow></mfrac><mo>)</mo></mrow></mfrac></msqrt></mrow></mrow></math></maths>
For level 1, the sharpening multiplier μ<sub>1</sub>=R·2<sup>α</sup> is 1.825·2<sup>−1/2</sup>=1.29. For level 2, the sharpening multiplier μ<sub>2</sub>=R·2<sup>α·2 </sup>is 1.825·2<sup>−1/2·2</sup>=0.913. FIG. <b>16</b> shows the denoised and sharpened high pass coefficients for level 1. <figref idref="DRAWINGS">FIG. 17</figref> shows the denoised high pass coefficients for level 2. <figref idref="DRAWINGS">FIG. 18</figref> shows the denoised and sharpened high pass coefficients for level 2.
<figref idref="DRAWINGS">FIG. 19</figref> shows the result of applying a two level inverse redundant Haar transform to the low pass coefficients and the denoised high pass coefficients. This result has an MSE 1.19 difference with the original signal so the result is closer to the original signal than the reconstruction without denoising and sharpening. The sharpening does compensate for blurring caused by lossy wavelet compression. Only denoising (no sharpening) results in a MSE of 1.75 which is not as close to the original as the result with sharpening. (In general, MSE is not always an appropriate measure for a good reconstruction, but it is commonly used and appropriate for this simple example.) The step edges are more uniform than the result before denoising.
Example of Using WSS Pre-Processing Before Encoding
For some applications, it is desirable to encode images such that edges are preserved and textures are eliminated. In some cases, textures may be undesirable noise, such as, for example, film grain noise, thermal noise in CDD or other image sensors, etc. Textures may also be caused by halftoning or dithering. In other cases, the textures are part of the original signal, but for lossy compression, accurately representing the texture results in poor compression while providing little value to an observer. Accurately representing edges often has high value to an observer.
To eliminate textures but preserve edges, wavelet denoising with multiple levels of wavelet transform can be used. A transform level other than the first level can be used to control denoising of lower transform levels. For example, all coefficients of lower levels can be set to zero if the corresponding control level coefficient is zero. Alternatively, all coefficients of lower levels can be set to zero if the corresponding control level coefficient is zero or has opposite sign. Additionally, lower level coefficients may be set to zero if they are below a threshold to combine texture removal with usual denoising.
<figref idref="DRAWINGS">FIG. 20</figref> shows an exemplary input signal that contains an edge between two textured regions. <figref idref="DRAWINGS">FIG. 21</figref> shows the result of the applying high pass 5-3 filter to the input signal. <figref idref="DRAWINGS">FIG. 22</figref> shows the result of applying a low pass 5-3 filter to the input signal.
<figref idref="DRAWINGS">FIG. 23</figref> shows that with quantization Q equal to 8, the high pass coefficients for the texture and the edge have the same magnitude, 12.
<figref idref="DRAWINGS">FIG. 24</figref> shows the result of using Q equal to 8 to represent the texture and the edge if a low compression ratio is acceptable.
With quantization Q equaling 16, high pass coefficients for both the edge and texture are quantized to 0. <figref idref="DRAWINGS">FIG. 25</figref> shows the reconstruction in the case where quantization Q equals 16.
Alternatively, WSS is applied to the original signal. <figref idref="DRAWINGS">FIG. 26</figref> shows the level 1 low pass result of applying WSS to the original signal. <figref idref="DRAWINGS">FIG. 27</figref> shows the level 1 high pass result of applying WSS to the original signal. <figref idref="DRAWINGS">FIG. 28</figref> shows the level 2 low pass result of applying WSS to the original signal. <figref idref="DRAWINGS">FIG. 29</figref> shows the level 2 high pass result of applying WSS to the original signal.
Denoising is applied to the high pass coefficients to keep the edge but eliminate the texture. For some applications, the threshold for level l>1 should be chosen decreasing monotonically with increasing l. For level 2, a value for Q equaling 8 and threshold
<maths id="MATH-US-00019" num="00019"><math overflow="scroll"><mrow><mi>T</mi><mo>=</mo><mrow><mfrac><mn>8</mn><msqrt><mn>2</mn></msqrt></mfrac><mo>≅</mo><mn>6</mn></mrow></mrow></math></maths><br /> are used. <figref idref="DRAWINGS">FIG. 30</figref> shows the level 2 denoised coefficients that result from the denoising.
For this example, a sharpening parameter α equals −1 is chosen, which is the maximum sharpening for the redundant Haar transform which has γ equal to 1. The number of transform levels, L, equals 2 for this example. The renormalization parameter R is 3.1623 from:
<maths id="MATH-US-00020" num="00020"><math overflow="scroll"><mrow><msqrt><mfrac><mrow><mo>(</mo><mfrac><mrow><msup><mn>2</mn><mrow><mrow><mo>(</mo><mrow><mi>L</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow><mo></mo><mn>2</mn><mo></mo><mi>γ</mi></mrow></msup><mo>-</mo><msup><mn>2</mn><mrow><mn>2</mn><mo></mo><mi>γ</mi></mrow></msup></mrow><mrow><msup><mn>2</mn><mrow><mn>2</mn><mo></mo><mi>γ</mi></mrow></msup><mo>-</mo><mn>1</mn></mrow></mfrac><mo>)</mo></mrow><mi>L</mi></mfrac></msqrt><mo>=</mo><mrow><msqrt><mfrac><mrow><mo>(</mo><mfrac><mrow><msup><mn>2</mn><mrow><mn>3</mn><mo>·</mo><mn>2</mn><mo>·</mo><mn>1</mn></mrow></msup><mo>-</mo><msup><mn>2</mn><mrow><mn>2</mn><mo>·</mo><mn>1</mn></mrow></msup></mrow><mrow><msup><mn>2</mn><mrow><mn>2</mn><mo>·</mo><mn>1</mn></mrow></msup><mo>-</mo><mn>1</mn></mrow></mfrac><mo>)</mo></mrow><mn>2</mn></mfrac></msqrt><mo>=</mo><mrow><msqrt><mfrac><mrow><mo>(</mo><mfrac><mrow><mn>64</mn><mo>-</mo><mn>4</mn></mrow><mrow><mn>4</mn><mo>-</mo><mn>1</mn></mrow></mfrac><mo>)</mo></mrow><mn>2</mn></mfrac></msqrt><mo>=</mo><msqrt><mn>10</mn></msqrt></mrow></mrow></mrow></math></maths>
For level 1, the sharpening multiplier μ<sub>1</sub>=R·2<sup>α</sup> is 3.1623·2<sup>−1</sup>=1.581. For level 2, the sharpening multiplier μ<sub>2</sub>=R·2<sup>α·2 </sup>is 3,1623·2<sup>−1·2</sup>=0.791.
<figref idref="DRAWINGS">FIG. 31</figref> shows the level 2 denoised and sharpened coefficients resulting from performing the sharpening.
For level 1, to keep the edge but eliminate the texture, the level 2 coefficients are used to control denoising instead of thresholding based on level 1 coefficients. In this example, all level 1 coefficients are set to zero where the corresponding level 2 coefficient is zero or has a different sign. <figref idref="DRAWINGS">FIG. 32</figref> shows the denoised level 1 high pass coefficients that result from this denoising. <figref idref="DRAWINGS">FIG. 33</figref> shows the level 1 denoised and sharpened high pass coefficients that result from this denoising.
<figref idref="DRAWINGS">FIG. 34</figref> shows the preprocessed results after wavelet denoising.
Now, the 5-3 filter is applied for encoding. <figref idref="DRAWINGS">FIG. 35</figref> shows the high pass filter result from application of the 5-3 filter. <figref idref="DRAWINGS">FIG. 36</figref> shows the low pass filter result from application of the 5-3 filter.
<figref idref="DRAWINGS">FIG. 37</figref> shows the high pass coefficients after quantization with Q equal to 8. Note that the coefficient at the edge is larger than the corresponding coefficient without WSS.
The result after reconstruction is shown in <figref idref="DRAWINGS">FIG. 38</figref>. This closer to a step edge than the reconstruction without WSS when Q is equal to 16. J2K uses sophisticated, adaptive coding techniques. The exact differences in the amount of compressed data for “no pre-processing, Q=8,” “pre-processing, Q=8” and “no pre-processing, Q=16” cannot be determined from a 1D example. However, in general the amount of compressed data for “pre-processing, Q=8” is only a little more than for “no pre-processing, Q=16” and significantly less than “no pre-processing, Q=8”. <figref idref="DRAWINGS">FIG. 38</figref> shows the pre-processing provides a good improvement in quality for a small increase in rate.
Source Code for Examples
<tables id="TABLE-US-00012" num="00012"><table frame="none" colsep="0" rowsep="0"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><thead><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry>#!/usr/bin/env python</entry></row><row><entry># WSS and JPEG 2000 filtering examples</entry></row><row><entry># This is Python language software, see www.python.org.</entry></row><row><entry># Copyright 2001 Ricoh Innovations Inc.</entry></row><row><entry>import sys</entry></row><row><entry>import math</entry></row><row><entry>data_1 = [20, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80,</entry></row><row><entry>20, 20, 20, 20, 20]</entry></row><row><entry>data_2 = [20, 30, 20, 30, 20, 30, 20, 30, 70, 80, 70,</entry></row><row><entry>80, 70, 80, 70, 80]</entry></row><row><entry>def print_data(data, *arg):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>isfloat = 0</entry></row><row><entry /><entry>for i in data:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>if type(i) == type(1.0):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="42pt" align="left" /><colspec colname="1" colwidth="175pt" align="left" /><tbody valign="top"><row><entry /><entry>isfloat = 1</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>for i in data:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>if not isfloat:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="42pt" align="left" /><colspec colname="1" colwidth="175pt" align="left" /><tbody valign="top"><row><entry /><entry>print “%3d ” % i,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>elif int(i*10+0.5) == int(i+0.5) *10:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="42pt" align="left" /><colspec colname="1" colwidth="175pt" align="left" /><tbody valign="top"><row><entry /><entry>print “%d” % int(i),</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>else:</entry></row><row><entry /><entry>print “%1.1f” % i,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>print “”</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def mirror_53_for(data):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>“““Odd symetric extension for before forward</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>transform,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>JPEG 2000 Compliant”””</entry></row><row><entry /><entry>data = data[:] # make a copy</entry></row><row><entry /><entry>data.insert(0, data[1]) # b | a b</entry></row><row><entry /><entry>data.insert(0, data[3]) # c b | a b c</entry></row><row><entry /><entry>data.append(data[len(data) −2])</entry></row><row><entry /><entry>data.append(data[len(data) −4])</entry></row><row><entry /><entry>return data</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def mirror_53_inv(data):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>“““Symetric extension for before inverse transform,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>JPEG 2000 Compliant”””</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>data = data[:] # make a copy</entry></row><row><entry /><entry>data.insert(0, data[0])</entry></row><row><entry /><entry>data.append(data[len(data) −1])</entry></row><row><entry /><entry>return data</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def mirror_Haar_for(data, level):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>“““Mirror extension for redundant Haar forward</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>transform”””</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>data = data[:] + data[−level:]</entry></row><row><entry /><entry>return data</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def mirror_Haar_inv(data, level):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>“““Mirror extension for redundant Haar inverse</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>transform”””</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>data = data[:level] + data[:]</entry></row><row><entry /><entry>return data</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def f53_for(data):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>“““ Apply 5-3 forward wavelet transfrom”””</entry></row><row><entry /><entry>data = mirror_53_for(data)</entry></row><row><entry /><entry>high = [ ]</entry></row><row><entry /><entry>for i in range((len(data)−2) /2):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>c = data[2*i+1]−((data[2*i]+data[2*i+2])>>1)</entry></row><row><entry /><entry>high.append(c)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>low =[ ]</entry></row><row><entry /><entry>for i in range((len(data)−4) / 2):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>c = data[2*i+2]+((high[i]+ high[i+1]+2)>>2)</entry></row><row><entry /><entry>low.append(c)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>return (low, high[1:])</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def f53_inv(low, high):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>“““Apply 5-3 forward wavelet transfrom”””</entry></row><row><entry /><entry>high = mirror_53_inv(high)</entry></row><row><entry /><entry>even = [ ]</entry></row><row><entry /><entry>for i in range(len(low)):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>c = low[i]−((high[i]+high[i+1]+2)>>2)</entry></row><row><entry /><entry>even.append(c)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>result = [ ]</entry></row><row><entry /><entry>even_mirror = mirror_53_inv(even)</entry></row><row><entry /><entry>for i in range(len(low)):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>c =</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>high[i+1]+((even_mirror[i+1]+even_mirror [i+2])>>1)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>result.append(even[i])</entry></row><row><entry /><entry>result.append(c)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>return result</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def quant(data, Q):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>“““Quantize and inverse quantize coefficients”””</entry></row><row><entry /><entry>quant = [ ]</entry></row><row><entry /><entry>for i in data:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>if i < 0:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="42pt" align="left" /><colspec colname="1" colwidth="175pt" align="left" /><tbody valign="top"><row><entry /><entry>c = −(−i/Q)</entry></row><row><entry /><entry>if c < 0:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="56pt" align="left" /><colspec colname="1" colwidth="161pt" align="left" /><tbody valign="top"><row><entry /><entry>c = c * Q − (Q >> 1)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>else:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="42pt" align="left" /><colspec colname="1" colwidth="175pt" align="left" /><tbody valign="top"><row><entry /><entry>c =i/Q</entry></row><row><entry /><entry>if c > 0:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="56pt" align="left" /><colspec colname="1" colwidth="161pt" align="left" /><tbody valign="top"><row><entry /><entry>c = c * Q + (Q >> 1)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>quant.append(c)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>return quant</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def redundant_Haar_fwd(data, level):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>“““ Redundant Haar wavelet forward transform. Not</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>normalized.”””</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>data = mirror_Haar_for(data, level)</entry></row><row><entry /><entry>high = [ ]</entry></row><row><entry /><entry>low = [ ]</entry></row><row><entry /><entry>sq2 = math.sqrt(2)</entry></row><row><entry /><entry>for i in range(len(data)−level):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>low.append((data[i]+data[i+level])/sq2)</entry></row><row><entry /><entry>high.append((data[i]−data[i+level])/sq2)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>return (low, high)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def redundant_Haar_inv(low, high, level):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>“““ Redundant Haar wavelet forward transform. Not</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>normalized.”””</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>low = mirror_Haar_inv(low, level)</entry></row><row><entry /><entry>high = mirror_Haar_inv(high, level)</entry></row><row><entry /><entry>data = [ ]</entry></row><row><entry /><entry>sq2 = math.sqrt(2)</entry></row><row><entry /><entry>for i in range(level, len(low)):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>d0 = low[i]+high[i]</entry></row><row><entry /><entry>d1 = low[i−level]−high[i−level]</entry></row><row><entry /><entry>d = (d0 + d1) / (2 * sq2)</entry></row><row><entry /><entry>data.append(int(d+0.5))</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>return data</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def threshold(data, T):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>“““Threshold to denoise”””</entry></row><row><entry /><entry>result = [ ]</entry></row><row><entry /><entry>for i in data:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>if abs(i) < T:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="42pt" align="left" /><colspec colname="1" colwidth="175pt" align="left" /><tbody valign="top"><row><entry /><entry>i = 0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>result.append(i)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>return result</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def simple_threshold(list, Q, prefix):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>result = [ ]</entry></row><row><entry /><entry>level = 1</entry></row><row><entry /><entry>for data in list:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>T = int(Q*0.0707+0.5)</entry></row><row><entry /><entry>r = threshold(data, T)</entry></row><row><entry /><entry>plot (r, prefix+(“level%d_thresh” % level))</entry></row><row><entry /><entry>result.append(r)</entry></row><row><entry /><entry>level = level + 1</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>return result</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def sign(n):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>if n < 0:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>return −1</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>if n > 0:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>return 1</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>return 0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def level2_threshold(list, Q, prefix):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>(data1, data2) = list</entry></row><row><entry /><entry>result1 = [ ]</entry></row><row><entry /><entry>result2 = [ ]</entry></row><row><entry /><entry>T = int(Q*0.0707+0.5)</entry></row><row><entry /><entry>for i in range(len(data1)):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>v1 = data1[i]</entry></row><row><entry /><entry>v2 = data2[i]</entry></row><row><entry /><entry>if abs(v2) < T:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="42pt" align="left" /><colspec colname="1" colwidth="175pt" align="left" /><tbody valign="top"><row><entry /><entry>v1 = 0</entry></row><row><entry /><entry>v2 = 0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>if sign(v1) != sign(v2):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="42pt" align="left" /><colspec colname="1" colwidth="175pt" align="left" /><tbody valign="top"><row><entry /><entry>v1 = 0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>result1.append(v1)</entry></row><row><entry /><entry>result2.append(v2)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>plot (result1, prefix+“level1_thresh”)</entry></row><row><entry /><entry>plot (result2, prefix+“level2_thresh”)</entry></row><row><entry /><entry>return (result1, result2)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def smooth_sharpen(data, multiplier):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>result = [ ]</entry></row><row><entry /><entry>for i in data:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>result.append(i*multiplier)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>return result</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def mse(x1, x2)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>if len(x1) != len(x2):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>return none;</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>mse = 0.0</entry></row><row><entry /><entry>for i in range(len(x1)):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>d = float(x1[i] − x2[i])</entry></row><row><entry /><entry>mse = mse + d * d</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>mse = mse / float(len(x1))</entry></row><row><entry /><entry>return mse</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def WSS(data, Q, threshold_func, sharpen, prefix):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>print “\nHaar forward”</entry></row><row><entry /><entry>(low_Haar1, high_Haar1) = redundant_Haar_fwd(data,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>1)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>plot (low_Haar1, prefix+“_Haar1_low”)</entry></row><row><entry /><entry>plot (high_Haar1, prefix+“_Haar1_high”)</entry></row><row><entry /><entry>(low_Haar2, high_Haar2) =</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>redundant_Haar_fwd(low_Haar1, 2)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>plot (low_Haar2, prefix+“_Haar2 low”)</entry></row><row><entry /><entry>plot (high_Haar2, prefix+“_Haar2_high”)</entry></row><row><entry /><entry>print “\nThreshold”</entry></row><row><entry /><entry>(high_thresh1, high_thresh2) =</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>threshold_func((high_Haar1, high_Haar2),</entry></row><row><entry>prefix)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="182pt" align="left" /><colspec colname="1" colwidth="35pt" align="left" /><tbody valign="top"><row><entry /><entry>Q,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>prefix</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>print “\nSmooth/sharpen”</entry></row><row><entry /><entry>high_ss1 = smooth_sharpen(high_thresh1, sharpen[0])</entry></row><row><entry /><entry>high_ss2 = smooth_sharpen(high_thresh2, sharpen[1])</entry></row><row><entry /><entry>plot (high_ss1, prefix+“_ss1”)</entry></row><row><entry /><entry>plot (high_ss2, prefix+“_ss2”)</entry></row><row><entry /><entry>print “\nHaar inverse”</entry></row><row><entry /><entry>low_Haar1_reconstruct =</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>redundant_Haar_inv(low_Haar2, high_ss2, 2)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>plot (low_Haar1_reconstruct, prefix+“_WSS_2only”)</entry></row><row><entry /><entry>result = redundant_Haar_inv(low_Haar1, high_ss1, 1)</entry></row><row><entry /><entry>plot (result, prefix+“_WSS”)</entry></row><row><entry /><entry>return result</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def j2k(data, Q, prefix):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>print “\n5-3 wavelet transform with Q=%d” % Q</entry></row><row><entry /><entry>(low, high) = f53_for(data)</entry></row><row><entry /><entry>plot (low, prefix + “_53low”)</entry></row><row><entry /><entry>plot (high, prefix + “_53high”)</entry></row><row><entry /><entry>high_quant = quant(high, Q)</entry></row><row><entry /><entry>plot (high_quant, prefix + (“_53_high_Q%d” % Q))</entry></row><row><entry /><entry>reconstructed = f53_inv(low, high_quant)</entry></row><row><entry /><entry>plot (reconstructed, prefix+(“_Q%d” % Q))</entry></row><row><entry /><entry>return reconstructed</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>def example1(data):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>print “Example 1”</entry></row><row><entry /><entry>Q = 16</entry></row><row><entry /><entry>plot(data, “e1_input”)</entry></row><row><entry /><entry>reconstructed = j2k(data, Q, “e1”)</entry></row><row><entry /><entry>print “MSE without denoising = %f” % mse (data,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>reconstructed)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>wss_postprocess = WSS(reconstructed, Q,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>simple_threshold, (1.29, 0.913), “e1”)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>print “MSE with denoising = %f” % mse (data,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>wss_postprocess)</entry></row><row><entry>def example2 (data):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>print “Example 2”</entry></row><row><entry /><entry>plot(data, “e2_input”)</entry></row><row><entry /><entry>j2k(data, 8, “e2”)</entry></row><row><entry /><entry>j2k(data, 16, “e2”)</entry></row><row><entry /><entry>wss_preprocess = WSS(data, 8, level2_threshold,</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>(1.581, 0.791),</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="77pt" align="left" /><colspec colname="1" colwidth="140pt" align="left" /><tbody valign="top"><row><entry /><entry>“e2”)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>j2k(wss_preprocess, 8, “e2_wss_”)</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="217pt" align="left" /><tbody valign="top"><row><entry>##################################################</entry></row><row><entry>#</entry></row><row><entry># MAIN</entry></row><row><entry>#</entry></row><row><entry>##################################################</entry></row><row><entry>if_name_ == ‘_main_’:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>if (len(sys.argv) > 1) and (sys.argv[1] == “-p”):</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>import make_plot</entry></row><row><entry /><entry>plot = make_plot.plot</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>else:</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="28pt" align="left" /><colspec colname="1" colwidth="189pt" align="left" /><tbody valign="top"><row><entry /><entry>plot = print_data</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="2"><colspec colname="offset" colwidth="14pt" align="left" /><colspec colname="1" colwidth="203pt" align="left" /><tbody valign="top"><row><entry /><entry>example1(data_1)</entry></row><row><entry /><entry>print</entry></row><row><entry /><entry>“\n=============================================\n</entry></row><row><entry /><entry>”</entry></row><row><entry /><entry>example2(data_2)</entry></row><row><entry /><entry namest="offset" nameend="1" align="center" rowsep="1" /></row></tbody></tgroup></table></tables><br /> Text Output of Source Code for Examples
<tables id="TABLE-US-00013" num="00013"><table frame="none" colsep="0" rowsep="0" pgwide="1"><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><thead><row><entry namest="1" nameend="1" align="center" rowsep="1" /></row></thead><tbody valign="top"><row><entry>Example 1</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>20</entry><entry>20</entry><entry>20</entry><entry>20</entry><entry>20</entry><entry>80</entry><entry>80</entry><entry>80</entry><entry>80</entry><entry>80</entry><entry>80</entry><entry>20</entry><entry>20</entry><entry>20</entry><entry>20</entry><entry>20</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>5-3 wavelet transform with Q = 16</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>20</entry><entry>20</entry><entry>28</entry><entry>88</entry><entry>80</entry><entry>73</entry><entry>13</entry><entry>20</entry><entry /><entry /><entry /><entry /><entry /><entry /><entry /><entry /></row><row><entry>0</entry><entry>0</entry><entry>30</entry><entry>0</entry><entry>0</entry><entry>−30</entry><entry>0</entry><entry>0</entry></row><row><entry>0</entry><entry>0</entry><entry>24</entry><entry>0</entry><entry>0</entry><entry>−24</entry><entry>0</entry><entry>0</entry></row><row><entry>20</entry><entry>20</entry><entry>20</entry><entry>21</entry><entry>22</entry><entry>76</entry><entry>82</entry><entry>81</entry><entry>80</entry><entry>79</entry><entry>79</entry><entry>25</entry><entry>19</entry><entry>19</entry><entry>20</entry><entry>20</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>MSE without denoising = 3.437500</entry></row><row><entry>Haar forward</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>28.3</entry><entry>28.3</entry><entry>28</entry><entry>30.4</entry><entry>69.3</entry><entry>111.7</entry><entry>115.3</entry><entry>113.8</entry><entry>112.4</entry><entry>111.7</entry><entry>73.5</entry><entry>31.1</entry><entry>26.9</entry><entry>27.6</entry><entry>28.3</entry><entry>28.3</entry></row><row><entry>0</entry><entry>0</entry><entry>−0.7</entry><entry>−0.7</entry><entry>−38.2</entry><entry>−4.2</entry><entry>0.7</entry><entry>0.7</entry><entry>0.7</entry><entry>0</entry><entry>38.2</entry><entry>4.2</entry><entry>0</entry><entry>−0.7</entry><entry>0</entry><entry>0</entry></row><row><entry>40.5</entry><entry>41.5</entry><entry>69.5</entry><entry>100.5</entry><entry>130.5</entry><entry>159.5</entry><entry>160</entry><entry>159.5</entry><entry>131.5</entry><entry>100</entry><entry>70</entry><entry>41.5</entry><entry>38</entry><entry>39.5</entry><entry>39</entry><entry>39</entry></row><row><entry>−0.5</entry><entry>−1.5</entry><entry>−28.5</entry><entry>−57.5</entry><entry>−32.5</entry><entry>−1.5</entry><entry>1</entry><entry>1.5</entry><entry>27.5</entry><entry>56</entry><entry>33</entry><entry>2.5</entry><entry>−1.0</entry><entry>−0.5</entry><entry>0</entry><entry>0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>Threshold</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="14pt" align="char" char="." /><colspec colname="3" colwidth="28pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="28pt" align="char" char="." /><colspec colname="6" colwidth="14pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>−38.20</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>38.2</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry /></row><row><entry>0</entry><entry>0</entry><entry>−28.5</entry><entry>−57.5</entry><entry>−32.5</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>27.5</entry><entry>56</entry><entry>33</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>Smooth/sharpen</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="14pt" align="char" char="." /><colspec colname="2" colwidth="28pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>−49.3</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>49.3</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry></row><row><entry>0</entry><entry>0</entry><entry>−26.0</entry><entry>−52.5</entry><entry>−29.7</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>25.1</entry><entry>52</entry><entry>30.1</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>Haar inverse</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>29</entry><entry>29</entry><entry>30</entry><entry>32</entry><entry>69</entry><entry>110</entry><entry>114</entry><entry>113</entry><entry>112</entry><entry>110</entry><entry>73</entry><entry>32</entry><entry>28</entry><entry>29</entry><entry>28</entry><entry>28</entry></row><row><entry>20</entry><entry>20</entry><entry>20</entry><entry>21</entry><entry>18</entry><entry>81</entry><entry>80</entry><entry>81</entry><entry>80</entry><entry>79</entry><entry>83</entry><entry>20</entry><entry>21</entry><entry>19</entry><entry>20</entry><entry>20</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>MSE with denoising = 1.187500</entry></row><row><entry>=====================================================</entry></row><row><entry>Example 2</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>20</entry><entry>30</entry><entry>20</entry><entry>30</entry><entry>20</entry><entry>30</entry><entry>20</entry><entry>30</entry><entry>70</entry><entry>80</entry><entry>70</entry><entry>80</entry><entry>70</entry><entry>80</entry><entry>70</entry><entry>80</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>5-3 wavelet transform with Q = 8</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>25</entry><entry>25</entry><entry>25</entry><entry>19</entry><entry>69</entry><entry>75</entry><entry>75</entry><entry>75</entry><entry /><entry /><entry /><entry /><entry /><entry /><entry /><entry /></row><row><entry>10</entry><entry>10</entry><entry>10</entry><entry>−15</entry><entry>10</entry><entry>10</entry><entry>10</entry><entry>10</entry></row><row><entry>12</entry><entry>12</entry><entry>12</entry><entry>−12</entry><entry>12</entry><entry>12</entry><entry>12</entry><entry>12</entry></row><row><entry>19</entry><entry>31</entry><entry>19</entry><entry>31</entry><entry>19</entry><entry>31</entry><entry>19</entry><entry>32</entry><entry>69</entry><entry>81</entry><entry>69</entry><entry>81</entry><entry>69</entry><entry>81</entry><entry>69</entry><entry>81</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>5-3 wavelet transform with Q = 16</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>25</entry><entry>25</entry><entry>25</entry><entry>19</entry><entry>69</entry><entry>75</entry><entry>75</entry><entry>75</entry></row><row><entry>10</entry><entry>10</entry><entry>10</entry><entry>−15</entry><entry>10</entry><entry>10</entry><entry>10</entry><entry>10</entry></row><row><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry></row><row><entry>25</entry><entry>25</entry><entry>25</entry><entry>25</entry><entry>25</entry><entry>22</entry><entry>19</entry><entry>44</entry><entry>69</entry><entry>72</entry><entry>75</entry><entry>75</entry><entry>75</entry><entry>75</entry><entry>75</entry><entry>75</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>Haar forward</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>35.4</entry><entry>35.4</entry><entry>35.4</entry><entry>35.4</entry><entry>35.4</entry><entry>35.4</entry><entry>35.4</entry><entry>70.7</entry><entry>106.1</entry><entry>106.1</entry><entry>106.1</entry><entry>106.1</entry><entry>106.1</entry><entry>106.1</entry><entry>106.1</entry><entry>113.1</entry></row><row><entry>−7.1</entry><entry>7.1</entry><entry>−7.1</entry><entry>7.1</entry><entry>−7.1</entry><entry>7.1</entry><entry>−7.1</entry><entry>−28.3</entry><entry>−7.1</entry><entry>7.1</entry><entry>−7.1</entry><entry>7.1</entry><entry>−7.1</entry><entry>7.1</entry><entry>−7.1</entry><entry>0</entry></row><row><entry>49</entry><entry>49</entry><entry>49</entry><entry>49</entry><entry>49</entry><entry>74</entry><entry>99</entry><entry>124</entry><entry>149</entry><entry>149</entry><entry>149</entry><entry>149</entry><entry>149</entry><entry>154</entry><entry>149</entry><entry>159</entry></row><row><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>−25.0</entry><entry>−50.0</entry><entry>−25.0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>−5.0</entry><entry>0</entry><entry>0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>Threshold</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>−7.1</entry><entry>−28.3</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry></row><row><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>−25.0</entry><entry>−50.0</entry><entry>−25.0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>Smooth/sharpen</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>−11.2</entry><entry>−44.7</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry></row><row><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>−19.8</entry><entry>−39.6</entry><entry>−19.8</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>Haar inverse</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>35</entry><entry>35</entry><entry>35</entry><entry>35</entry><entry>35</entry><entry>37</entry><entry>39</entry><entry>71</entry><entry>102</entry><entry>104</entry><entry>106</entry><entry>106</entry><entry>106</entry><entry>108</entry><entry>106</entry><entry>111</entry></row><row><entry>25</entry><entry>25</entry><entry>25</entry><entry>25</entry><entry>25</entry><entry>25</entry><entry>21</entry><entry>26</entry><entry>78</entry><entry>75</entry><entry>75</entry><entry>75</entry><entry>75</entry><entry>75</entry><entry>75</entry><entry>77</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="1"><colspec colname="1" colwidth="336pt" align="left" /><tbody valign="top"><row><entry>5-3 wavelet transform with Q = 8</entry></row></tbody></tgroup><tgroup align="left" colsep="0" rowsep="0" cols="16"><colspec colname="1" colwidth="21pt" align="char" char="." /><colspec colname="2" colwidth="21pt" align="char" char="." /><colspec colname="3" colwidth="21pt" align="char" char="." /><colspec colname="4" colwidth="21pt" align="char" char="." /><colspec colname="5" colwidth="21pt" align="char" char="." /><colspec colname="6" colwidth="21pt" align="char" char="." /><colspec colname="7" colwidth="21pt" align="char" char="." /><colspec colname="8" colwidth="21pt" align="char" char="." /><colspec colname="9" colwidth="21pt" align="char" char="." /><colspec colname="10" colwidth="21pt" align="char" char="." /><colspec colname="11" colwidth="21pt" align="char" char="." /><colspec colname="12" colwidth="21pt" align="char" char="." /><colspec colname="13" colwidth="21pt" align="char" char="." /><colspec colname="14" colwidth="21pt" align="char" char="." /><colspec colname="15" colwidth="21pt" align="char" char="." /><colspec colname="16" colwidth="21pt" align="char" char="." /><tbody valign="top"><row><entry>25</entry><entry>25</entry><entry>26</entry><entry>16</entry><entry>72</entry><entry>75</entry><entry>75</entry><entry>76</entry></row><row><entry>0</entry><entry>0</entry><entry>2</entry><entry>−23</entry><entry>1</entry><entry>0</entry><entry>0</entry><entry>2</entry></row><row><entry>0</entry><entry>0</entry><entry>0</entry><entry>−20</entry><entry>0</entry><entry>0</entry><entry>0</entry><entry>0</entry></row><row><entry>25</entry><entry>25</entry><entry>25</entry><entry>25</entry><entry>26</entry><entry>23</entry><entry>21</entry><entry>29</entry><entry>77</entry><entry>76</entry><entry>75</entry><entry>75</entry><entry>75</entry><entry>75</entry><entry>76</entry><entry>76</entry></row><row><entry namest="1" nameend="16" align="center" rowsep="1" /></row></tbody></tgroup></table></tables><br /> An Exemplary Computer System
One or more of the operations described above may be implemented or performed with a computer system such as shown in <figref idref="DRAWINGS">FIG. 39</figref>. Referring to <figref idref="DRAWINGS">FIG. 39</figref>, computer system <b>3900</b> may comprise an exemplary client or server computer system in which the features described herein may be implemented. Computer system <b>3900</b> comprises a communication mechanism or bus <b>3911</b> for communicating information, and a processor <b>3912</b> coupled with bus <b>3911</b> for processing information. Processor <b>3912</b> includes a microprocessor, but is not limited to a microprocessor, such as Pentium™, PowerPC™, Alpha™, etc.
System <b>3900</b> further comprises a random access memory (RAM), or other dynamic storage device <b>3904</b> (referred to as main memory) coupled to bus <b>3911</b> for storing information and instructions to be executed by processor <b>3912</b>. Main memory <b>3904</b> also may be used for storing temporary variables or other intermediate information during execution of instructions by processor <b>3912</b>.
Computer system <b>3900</b> also comprises a read only memory (ROM) and/or other static storage device <b>3906</b> coupled to bus <b>3911</b> for storing static information and instructions for processor <b>3912</b>, and a data storage device <b>3907</b>, such as a magnetic disk or optical disk and its corresponding disk drive. Data storage device <b>3907</b> is coupled to bus <b>3911</b> for storing information and instructions.
Computer system <b>3900</b> may further be coupled to a display device <b>3921</b>, such as a cathode ray tube (CRT) or liquid crystal display (LCD), coupled to bus <b>3911</b> for displaying information to a computer user. An alphanumeric input device <b>3922</b>, including alphanumeric and other keys, may also be coupled to bus <b>3911</b> for communicating information and command selections to processor <b>3912</b>. An additional user input device is cursor control <b>3923</b>, such as a mouse, trackball, trackpad, stylus, or cursor direction keys, coupled to bus <b>3911</b> for communicating direction information and command selections to processor <b>3912</b>, and for controlling cursor movement on display <b>3921</b>.
Another device that is coupled to bus <b>3911</b> is hard copy device <b>3924</b> operating as a print engine, which may be used for printing images, instructions, data, or other information on a medium such as paper, film, or similar types of media. A scanner <b>3930</b> is coupled to bus <b>3911</b> to generate a scanned image.
Furthermore, a sound recording and playback device, such as a speaker and/or microphone may optionally be coupled to bus <b>3911</b> for audio interfacing with computer system <b>3900</b>.
Note that any or all of the components of system <b>3900</b> and associated hardware may be used in the present invention. However, it can be appreciated that other configurations of the computer system may include some or all of the devices.
Whereas many alterations and modifications of the present invention will no doubt become apparent to a person of ordinary skill in the art after having read the foregoing description, it is to be understood that any particular embodiment shown and described by way of illustration is in no way intended to be considered limiting. Therefore, references to details of various embodiments are not intended to limit the scope of the claims which in themselves recite only those features regarded as essential to the invention.
Contents6
45 sheets
Sheet 1 Sheet 2 Sheet 3 Sheet 4 Sheet 5 Sheet 6 Sheet 7 Sheet 8 Sheet 9 Sheet 10 Sheet 11 Sheet 12 Sheet 13 Sheet 14 Sheet 15 Sheet 16 Sheet 17 Sheet 18 Sheet 19 Sheet 20 Sheet 21 Sheet 22 Sheet 23 Sheet 24 Sheet 25 Sheet 26 Sheet 27 Sheet 28 Sheet 29 Sheet 30 Sheet 31 Sheet 32 Sheet 33 Sheet 34 Sheet 35 Sheet 36 Sheet 37 Sheet 38 Sheet 39 Sheet 40 Sheet 41 Sheet 42 Sheet 43 Sheet 44 Sheet 45
Every citation, both waysCites: the store holds 9 of 10
| Document | Relation | Office | Cited during |
|---|---|---|---|
| US8571117B2 | Cited by | United States of America | Applicant |
| US7809200B2 | Cited by | United States of America | Search report |
| US7778484B2 | Cited by | United States of America | Search report |
| US8538193B2 | Cited by | United States of America | Applicant |
| US7676103B2 | Cited by | United States of America | Search report |
| US8532429B2 | Cited by | United States of America | Search report |
| US8218634B2 | Cited by | United States of America | Search report |
| US9635308B2 | Cited by | United States of America | Applicant |
| US2010225789A1 | Cited by | United States of America | Pre-grant |
| US8358380B2 | Cited by | United States of America | Applicant |
| US9361707B2 | Cited by | United States of America | Applicant |
| US2006045360A1 | Cited by | United States of America | Pre-grant |
| US8781244B2 | Cited by | United States of America | Applicant |
| US8982947B2 | Cited by | United States of America | Applicant |
| US2008166064A1 | Cited by | United States of America | Pre-grant |
| US7253627B1 | Cited by | United States of America | Search report |
| US8600188B2 | Cited by | United States of America | Applicant |
| US9836433B1 | Cited by | United States of America | Search report |
| US9628674B2 | Cited by | United States of America | Applicant |
| US8520731B2 | Cited by | United States of America | Applicant |
| US2010309989A1 | Cited by | United States of America | Pre-grant |
| US2010309990A1 | Cited by | United States of America | Pre-grant |
| US8619881B2 | Cited by | United States of America | Applicant |
| US2012076430A1 | Cited by | United States of America | Pre-grant |
| US9237259B2 | Cited by | United States of America | Applicant |
| US9832351B1 | Cited by | United States of America | Applicant |
| US8175411B2 | Cited by | United States of America | Applicant |
| US2010309979A1 | Cited by | United States of America | Pre-grant |
| US2010309379A1 | Cited by | United States of America | Pre-grant |
| US2010309377A1 | Cited by | United States of America | Pre-grant |
| US2009080518A1 | Cited by | United States of America | Pre-grant |
| US2006153301A1 | Cited by | United States of America | Pre-grant |
| US8615044B2 | Cited by | United States of America | Applicant |
| US2010309991A1 | Cited by | United States of America | Pre-grant |
| US2006245655A1 | Cited by | United States of America | Pre-grant |
| US9342204B2 | Cited by | United States of America | Applicant |
| US2007183677A1 | Cited by | United States of America | Pre-grant |
| US2006034539A1 | Cited by | United States of America | Pre-grant |
| US8472725B2 | Cited by | United States of America | Applicant |
| US8594448B2 | Cited by | United States of America | Search report |
| US8538189B2 | Cited by | United States of America | Search report |
| US7474793B2 | Cited by | United States of America | Search report |
| US8427583B2 | Cited by | United States of America | Applicant |
| US8285068B2 | Cited by | United States of America | Applicant |
| US8638395B2 | Cited by | United States of America | Search report |
| US8031956B2 | Cited by | United States of America | Applicant |
| US9721333B2 | Cited by | United States of America | Applicant |
| US2012195374A1 | Cited by | United States of America | Pre-grant |
| US2009052793A1 | Cited by | United States of America | Pre-grant |
| US2006285767A1 | Cited by | United States of America | Pre-grant |
| US8588535B2 | Cited by | United States of America | Applicant |
| US2010177249A1 | Cited by | United States of America | Pre-grant |
| US9883083B2 | Cited by | United States of America | Applicant |
| US2001014179A1 | Cites | United States of America | Search report |
| JP2001136526A | Cites | Japan | Applicant |
| US2002003905A1 | Cites | United States of America | Search report |
| US5568142A | Cites | United States of America | Applicant |
| US5610729A | Cites | United States of America | Applicant |
| US5974181A | Cites | United States of America | Search report |
| US6985632B2 | Cites | United States of America | Search report |
| JPH09172639A | Cites | Japan | Applicant |
| JPH10507891A | Cites | Japan | Applicant |
| Neelamani, R., et al. “Wavelet-Based Deconvolution for III-Conditioned Systems,” Acoustics, Speech and Signal Processing, 1999. Proceedings 1999 IEEE International Conf. On Phoenix, Az., USA 15-19, Mar. 1999, Piscataway, NJ., pp. 3241-3244. | Non-patent | – | Third party observation |
| Santa Cruz, Diego, et al., “The JPEG 2000 Image Coding Standard A Powerful Algorithm and Data Format,” Dr. Dobb's Journal, M&T Publ., Redwood City, CA., vol. 26, No. 4, Apr. 2001, pp. 46-54. | Non-patent | – | Third party observation |
| Shen, Mei-Yen, et al., “Review of Postprocessing Techniques for Compression Artificat Removal,” Journal of Visual Communication and Image Representation, Academic Press, Inc. vol. 9, No. 1, Mar. 1998, pp. 2-14. | Non-patent | – | Third party observation |
| Xiong, Ziziang, et al., “A Simple Deblocking Algorithm for JPEG Compressed Images Using Overcomplete Wavelet Representations,” Circuits and Systems, Proceedings of 1997 IEEE International Symposium on Hong Kong Jun. 9-12, 1997, NY, NY, pp. 1077-1080. | Non-patent | – | Third party observation |
| Choi, Hyuk, et al., “Blocking-Artifact Reduction in Block-Coded Images Using Wavelet-Based Subband Decomposition,” IEEE Transactions on Circuits and Systems for Video Technology, IEEE Inc., NY, vol. 10, No. 5, Aug. 2000, pp. 801-805. | Non-patent | – | Third party observation |
| Neelamani, R., et al. "Wavelet-Based Deconvolution for III-Conditioned Systems," Acoustics, Speech and Signal Processing, 1999. Proceedings 1999 IEEE International Conf. On Phoenix, Az., USA 15-19, Mar. 1999, Piscataway, NJ., pp. 3241-3244. | Non-patent | – | Applicant |
| Santa Cruz, Diego, et al., "The JPEG 2000 Image Coding Standard A Powerful Algorithm and Data Format," Dr. Dobb's Journal, M&T Publ., Redwood City, CA., vol. 26, No. 4, Apr. 2001, pp. 46-54. | Non-patent | – | Applicant |
| Shen, Mei-Yen, et al., "Review of Postprocessing Techniques for Compression Artificat Removal," Journal of Visual Communication and Image Representation, Academic Press, Inc. vol. 9, No. 1, Mar. 1998, pp. 2-14. | Non-patent | – | Applicant |
| Xiong, Ziziang, et al., "A Simple Deblocking Algorithm for JPEG Compressed Images Using Overcomplete Wavelet Representations," Circuits and Systems, Proceedings of 1997 IEEE International Symposium on Hong Kong Jun. 9-12, 1997, NY, NY, pp. 1077-1080. | Non-patent | – | Applicant |
| Choi, Hyuk, et al., "Blocking-Artifact Reduction in Block-Coded Images Using Wavelet-Based Subband Decomposition," IEEE Transactions on Circuits and Systems for Video Technology, IEEE Inc., NY, vol. 10, No. 5, Aug. 2000, pp. 801-805. | Non-patent | – | Applicant |
10 members in 3 offices
Priority claims2
| Document | Office | Kind | Date |
|---|---|---|---|
| 92000301 | United States of America | A | |
| US20010920003 | – | – | – |
Members10
| Document | Office | Kind | |
|---|---|---|---|
| EP1282075A2 | European Patent Office (EPO) | A2 | |
| EP1282075A3 | European Patent Office (EPO) | A3 | |
| JP2003046785A | Japan | A | |
| US2003086623A1 | United States of America | A1 | |
| US7206459B2This record | United States of America | B2 | |
| JP2007116728A | Japan | A | |
| US2007160304A1 | United States of America | A1 | |
| JP4041683B2 | Japan | B2 | |
| US7957599B2 | United States of America | B2 | |
| JP4714668B2 | Japan | B2 |
51 transactions on the USPTO file
Allowed after 2 non-final rejections and 1 final rejection.
- Non-final rejections
- 2
- Final rejections
- 1
- RCEs
- 0
- Appeals
- 0
Over time
Point at a mark for the transactionTransactions
| Event | Code | |
|---|---|---|
| Expire PatentEXP. | EXP. | |
| Recordation of Patent Grant MailedPGM/ | PGM/ | |
| Patent Issue Date Used in PTA CalculationAllowedPTAC | PTAC | |
| Issue Notification MailedAllowedWPIR | WPIR | |
| Dispatch to FDCD1935 | D1935 | |
| Application Is Considered Ready for IssuePILS | PILS | |
| Issue Fee Payment VerifiedN084 | N084 | |
| Issue Fee Payment ReceivedIFEE | IFEE | |
| Mail Notice of AllowanceAllowedMN/=. | MN/=. | |
| Notice of Allowance Data Verification CompletedAllowedN/=. | N/=. | |
| Date Forwarded to ExaminerFWDX | FWDX | |
| Information Disclosure Statement consideredIDSC | IDSC | |
| Reference capture on IDSRCAP | RCAP | |
| Information Disclosure Statement (IDS) Filed | – | |
| Information Disclosure Statement (IDS) Filed | – | |
| Response after Final ActionA.NE | A.NE | |
| Mail Final Rejection (PTOL - 326)Final rejectionMCTFR | MCTFR | |
| Final RejectionFinal rejectionCTFR | CTFR | |
| Date Forwarded to ExaminerFWDX | FWDX | |
| Response after Non-Final ActionA... | A... | |
| Case Docketed to Examiner in GAUDOCK | DOCK | |
| Mail Non-Final RejectionNon-final rejectionMCTNF | MCTNF | |
| Non-Final RejectionNon-final rejectionCTNF | CTNF | |
| Date Forwarded to ExaminerFWDX | FWDX | |
| Response after Non-Final ActionA... | A... | |
| New or Additional Drawing FiledC614 | C614 | |
| Request for Extension of Time - GrantedXT/G | XT/G | |
| Mail Non-Final RejectionNon-final rejectionMCTNF | MCTNF | |
| Non-Final RejectionNon-final rejectionCTNF | CTNF | |
| IFW TSS Processing by Tech Center CompleteTSSCOMP | TSSCOMP | |
| Date Forwarded to ExaminerFWDX | FWDX | |
| Response to Election / Restriction FiledELC. | ELC. | |
| Workflow incoming amendment IFWWAMD | WAMD | |
| Mail Restriction RequirementMCTRS | MCTRS | |
| Restriction/Election RequirementCTRS | CTRS | |
| Case Docketed to Examiner in GAUDOCK | DOCK | |
| Mail-Petition Decision - GrantedMPTGR | MPTGR | |
| Petition EnteredPET. | PET. | |
| Mail-Petition Decision - DismissedMPTDI | MPTDI | |
| Petition EnteredPET. | PET. | |
| Case Docketed to Examiner in GAUDOCK | DOCK | |
| Information Disclosure Statement (IDS) Filed | – | |
| Information Disclosure Statement (IDS) Filed | – | |
| Case Docketed to Examiner in GAUDOCK | DOCK | |
| Application Dispatched from OIPEOIPE | OIPE | |
| Application Is Now CompleteCOMP | COMP | |
| Oath or Declaration Filed (Including Supplemental)C602 | C602 | |
| Notice Mailed--Application Incomplete--Filing Date AssignedINCD | INCD | |
| Correspondence Address ChangeC.AD | C.AD | |
| IFW Scan & PACR Auto Security Review | – | |
| Initial Exam Team nnIEXX | IEXX |
10 legal events, as the office reported them to INPADOC
Over the term
Point at a mark for the eventEvents
| Event | Code | |
|---|---|---|
| Lapsed due to failure to pay maintenance feeLapsedFP | FP | |
| Information on status: patent discontinuationPATENT EXPIRED DUE TO NONPAYMENT OF MAINTENANCE FEES UNDER 37 CFR 1.362STCH | STCH | |
| Information on status: patent discontinuationPATENT EXPIRED DUE TO NONPAYMENT OF MAINTENANCE FEES UNDER 37 CFR 1.362STCH | STCH | |
| Lapse for failure to pay maintenance feesLapsedLAPS | LAPS | |
| Maintenance fee reminder mailedREMI | REMI | |
| Fee paymentFPAY | FPAY | |
| Fee payment procedurePAYER NUMBER DE-ASSIGNED (ORIGINAL EVENT CODE: RMPN); ENTITY STATUS OF PATENT OWNER: LARGE ENTITYFEPP | FEPP | |
| Fee payment procedurePAYOR NUMBER ASSIGNED (ORIGINAL EVENT CODE: ASPN); ENTITY STATUS OF PATENT OWNER: LARGE ENTITYFEPP | FEPP | |
| Fee payment procedurePAYOR NUMBER ASSIGNED (ORIGINAL EVENT CODE: ASPN); ENTITY STATUS OF PATENT OWNER: LARGE ENTITYFEPP | FEPP | |
| AssignmentAS | AS |
Numbers
- Publication
- 07206459
- Publication, DOCDB
- 7206459
- Publication, EPODOC
- US7206459
- Application
- 9920003
- Application, DOCDB
- 92000301
- Application, EPODOC
- US20010920003
Titles
- English
- Enhancement of compressed images
Patent term adjustment
- A delay
- +800 daysthe office missed an examination deadline
- B delay
- +190 dayspendency past three years
- Applicant delay
- −71 days
- Net adjustment
- 919 days
Classification
- CPC, 9
- G06T5/70
- G06T5/10
- G06T2207/20064
- H04N19/48
- H04N19/635
- H04N19/527
- H04N19/86
- H04N19/90
- G06T5/73
- IPC, 13
- G06K9 36
- G06K9 38
- G06K9 46
- G06K9 40
- G06T5 00
- H03M7 30
- H04N1 41
- H04N19 147
- H04N19 423
- H04N19 60
- H04N19 635
- H04N19 85
- H04N19 91
- USPC, 9
- 382251000
- 375E07043
- 375E07187
- 375E07190
- 375E07206
- 375E07241
- 382233000
- 382235000
- 382275000