auto import from //depot/cupcake/@135843
[android/platform/external/neven.git] / Embedded / common / src / b_ImageEm / HistoEq.c
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /* ---- includes ----------------------------------------------------------- */
18
19 #include "b_BasicEm/Int16Arr.h"
20 #include "b_BasicEm/Math.h"
21 #include "b_ImageEm/HistoEq.h"
22 #include "b_ImageEm/UInt8Image.h"
23
24 /* ---- typedefs ----------------------------------------------------------- */
25
26 /* ---- constants ---------------------------------------------------------- */
27
28 /* ------------------------------------------------------------------------- */
29
30 /* ========================================================================= */
31 /*                                                                           */
32 /* ---- \ghd{ auxiliary functions } ---------------------------------------- */
33 /*                                                                           */
34 /* ========================================================================= */
35
36 /** Computes grey level histogram of given image. */
37 void bim_createHisto( struct bbs_Context* cpA,
38                                           uint16* histoPtrA, 
39                                           const struct bim_UInt8Image* imagePtrA )
40 {
41         uint32 iL;
42         uint16* dstPtrL;
43         const uint8* srcPtrL;
44         
45         /* init histogram array with 0 */
46         dstPtrL = histoPtrA;
47         for( iL = 256; iL > 0; iL-- )
48         {
49                 *dstPtrL++ = 0;
50         }
51         
52         /* calculate histogram */
53         srcPtrL = imagePtrA->arrE.arrPtrE;
54         dstPtrL = histoPtrA;
55         for( iL = imagePtrA->arrE.sizeE; iL > 0; iL-- ) 
56         {
57                 dstPtrL[ *srcPtrL++ ]++;        
58         }
59 }
60
61 /* ------------------------------------------------------------------------- */
62
63 /** Computes grey level histogram of given image. */
64 void bim_createHistoOfSection( struct bbs_Context* cpA,
65                                                            uint16* histoPtrA,
66                                                            const struct bts_Int16Rect* sectionPtrA, 
67                                                            const struct bim_UInt8Image* imagePtrA )
68 {
69         uint32 xL, yL;
70         const uint8* srcPtrL;
71         uint16* dstPtrL;
72         struct bts_Int16Rect sectionL = *sectionPtrA;
73         uint32 sectWidthL;
74         uint32 sectHeightL;
75         int32 imgWidthL = imagePtrA->widthE;
76         int32 imgHeightL = imagePtrA->heightE;
77
78         /* adjustments */
79         sectionL.x1E = bbs_max( 0, sectionL.x1E );
80         sectionL.x1E = bbs_min( imgWidthL, sectionL.x1E );
81         sectionL.x2E = bbs_max( 0, sectionL.x2E );
82         sectionL.x2E = bbs_min( imgWidthL, sectionL.x2E );
83         sectionL.y1E = bbs_max( 0, sectionL.y1E );
84         sectionL.y1E = bbs_min( imgHeightL, sectionL.y1E );
85         sectionL.y2E = bbs_max( 0, sectionL.y2E );
86         sectionL.y2E = bbs_min( imgHeightL, sectionL.y2E );
87
88         sectWidthL = sectionL.x2E - sectionL.x1E;
89         sectHeightL = sectionL.y2E - sectionL.y1E;
90
91         /* init histogram with 0 */
92         dstPtrL = histoPtrA;
93         for( xL = 256; xL > 0; xL-- )
94         {
95                 *dstPtrL++ = 0;
96         }
97         
98         /* calculate histogram */
99         srcPtrL = imagePtrA->arrE.arrPtrE + sectionL.y1E * imgWidthL + sectionL.x1E;
100         dstPtrL = histoPtrA;
101         for( yL = 0; yL < sectHeightL; yL++ )
102         {
103                 for( xL = 0; xL < sectWidthL; xL++ )
104                 {
105                         dstPtrL[ *srcPtrL++ ]++;        
106                 }
107                 srcPtrL += imgWidthL - sectWidthL;
108         }
109 }
110
111 /* ------------------------------------------------------------------------- */
112
113 /** equalize image using given histogram */
114 void bim_equalize( struct bbs_Context* cpA,
115                                    struct bim_UInt8Image* imagePtrA, 
116                                    const uint16* histoPtrA )
117 {
118         uint32 kL;
119         uint32 sumL = 0;
120         uint32 totalSumL = 0;
121         const uint16* histoArrPtrL;
122         uint8* dstPtrL;
123         uint8 mappingL[ 256 ];
124
125         /* determine number of counts in histogram */
126         histoArrPtrL = histoPtrA;
127         for( kL = 256; kL > 0; kL-- )
128         {
129                 totalSumL += *histoArrPtrL++;
130         }
131
132         if( totalSumL == 0 ) totalSumL = 1;
133         
134         /* compute transfer function (cumulative histogram) */
135         histoArrPtrL = histoPtrA;
136         for( kL = 0; kL < 256; kL++ )
137         {
138                 sumL += *histoArrPtrL++;
139                 mappingL[ kL ] = ( sumL * 255 ) / totalSumL;
140         }
141
142         /* remap pixel values */
143         dstPtrL = imagePtrA->arrE.arrPtrE;
144         for( kL = imagePtrA->arrE.sizeE; kL > 0; kL-- )
145         {
146                 *dstPtrL = mappingL[ *dstPtrL ];
147                 dstPtrL++;
148         }
149 }
150
151 /* ------------------------------------------------------------------------- */
152
153 /* ========================================================================= */
154 /*                                                                           */
155 /* ---- \ghd{ external functions } ----------------------------------------- */
156 /*                                                                           */
157 /* ========================================================================= */
158
159 /* ------------------------------------------------------------------------- */
160
161 void bim_UInt8Image_equalize( struct bbs_Context* cpA,
162                                                           struct bim_UInt8Image* imagePtrA )
163 {
164         uint16 histogramL[ 256 ];
165         bim_createHisto( cpA, histogramL, imagePtrA );
166         bim_equalize( cpA, imagePtrA, histogramL );
167 }
168
169 /* ------------------------------------------------------------------------- */
170
171 void bim_UInt8Image_equalizeSection( struct bbs_Context* cpA,
172                                                                          struct bim_UInt8Image* imagePtrA,
173                                                                          const struct bts_Int16Rect* sectionPtrA )
174 {
175         uint16 histogramL[ 256 ];
176         bim_createHistoOfSection( cpA, histogramL, sectionPtrA, imagePtrA );
177         bim_equalize( cpA, imagePtrA, histogramL );
178 }
179
180 /* ========================================================================= */