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/Functions.h" 20 #include "b_BasicEm/Int16Arr.h" 21 #include "b_BasicEm/Math.h" 22 #include "b_ImageEm/HistoEq16.h" 23 #include "b_ImageEm/UInt16ByteImage.h" 24 25 /* ---- typedefs ----------------------------------------------------------- */ 26 27 /* ---- constants ---------------------------------------------------------- */ 28 29 /* ------------------------------------------------------------------------- */ 30 31 /* ========================================================================= */ 32 /* */ 33 /* ---- \ghd{ auxiliary functions } ---------------------------------------- */ 34 /* */ 35 /* ========================================================================= */ 36 37 /** Computes grey level histogram of given image. */ 38 void bim_createHisto16( uint16* histoPtrA, 39 const struct bim_UInt16ByteImage* imagePtrA ) 40 { 41 uint32 iL; 42 uint16* dstPtrL; 43 const uint16* 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 srcPtrL = imagePtrA->arrE.arrPtrE; 53 dstPtrL = histoPtrA; 54 /* calculate histogram (assuming even image width) */ 55 for( iL = imagePtrA->arrE.sizeE; iL > 0; iL-- ) 56 { 57 dstPtrL[ ( *srcPtrL & 0x0FF ) ]++; 58 dstPtrL[ ( *srcPtrL >> 8 ) ]++; 59 srcPtrL++; 60 } 61 } 62 63 /* ------------------------------------------------------------------------- */ 64 65 /** Computes grey level histogram of given image. */ 66 void bim_createHistoOfSection16( uint16* histoPtrA, 67 const struct bts_Int16Rect* sectionPtrA, 68 const struct bim_UInt16ByteImage* imagePtrA ) 69 { 70 uint32 xL, yL; 71 const uint16* srcPtrL; 72 uint16* dstPtrL; 73 struct bts_Int16Rect sectionL = *sectionPtrA; 74 uint32 sectWidthL; 75 uint32 sectHeightL; 76 int32 imgWidthL = imagePtrA->widthE; 77 int32 imgHeightL = imagePtrA->heightE; 78 79 bbs_ERROR0( "bim_createHistoOfSection16(...): not implemented" ); 80 81 /* adjustments */ 82 sectionL.x1E = bbs_max( 0, sectionL.x1E ); 83 sectionL.x1E = bbs_min( imgWidthL, sectionL.x1E ); 84 sectionL.x2E = bbs_max( 0, sectionL.x2E ); 85 sectionL.x2E = bbs_min( imgWidthL, sectionL.x2E ); 86 sectionL.y1E = bbs_max( 0, sectionL.y1E ); 87 sectionL.y1E = bbs_min( imgHeightL, sectionL.y1E ); 88 sectionL.y2E = bbs_max( 0, sectionL.y2E ); 89 sectionL.y2E = bbs_min( imgHeightL, sectionL.y2E ); 90 91 sectWidthL = sectionL.x2E - sectionL.x1E; 92 sectHeightL = sectionL.y2E - sectionL.y1E; 93 94 /* init histogram with 0 */ 95 dstPtrL = histoPtrA; 96 for( xL = 256; xL > 0; xL-- ) 97 { 98 *dstPtrL++ = 0; 99 } 100 101 /* calculate histogram */ 102 srcPtrL = imagePtrA->arrE.arrPtrE + sectionL.y1E * imgWidthL + sectionL.x1E; 103 dstPtrL = histoPtrA; 104 for( yL = 0; yL < sectHeightL; yL++ ) 105 { 106 for( xL = 0; xL < sectWidthL; xL++ ) 107 { 108 dstPtrL[ ( *srcPtrL & 0x0FF ) ]++; 109 dstPtrL[ ( *srcPtrL >> 8 ) ]++; 110 srcPtrL++; 111 /* dstPtrL[ *srcPtrL++ ]++; */ 112 } 113 srcPtrL += imgWidthL - sectWidthL; 114 } 115 } 116 117 /* ------------------------------------------------------------------------- */ 118 119 /** equalize image using given histogram */ 120 void bim_equalize16( struct bim_UInt16ByteImage* imagePtrA, 121 const uint16* histoPtrA ) 122 { 123 uint32 kL; 124 uint32 sumL = 0; 125 uint32 totalSumL = 0; 126 const uint16* histoArrPtrL; 127 uint16* dstPtrL; 128 uint16 mappingL[ 256 ]; 129 130 /* determine number of counts in histogram */ 131 histoArrPtrL = histoPtrA; 132 for( kL = 256; kL > 0; kL-- ) 133 { 134 totalSumL += *histoArrPtrL++; 135 } 136 137 if( totalSumL == 0 ) totalSumL = 1; 138 139 /* compute transfer function (cumulative histogram) */ 140 histoArrPtrL = histoPtrA; 141 for( kL = 0; kL < 256; kL++ ) 142 { 143 sumL += *histoArrPtrL++; 144 mappingL[ kL ] = ( sumL * 255 ) / totalSumL; 145 } 146 147 /* remap pixel values */ 148 dstPtrL = imagePtrA->arrE.arrPtrE; 149 for( kL = imagePtrA->arrE.sizeE; kL > 0; kL-- ) 150 { 151 *dstPtrL = mappingL[ *dstPtrL & 0x00FF ] | ( mappingL[ *dstPtrL >> 8 ] << 8 ); 152 dstPtrL++; 153 } 154 } 155 156 /* ------------------------------------------------------------------------- */ 157 158 /* ========================================================================= */ 159 /* */ 160 /* ---- \ghd{ external functions } ----------------------------------------- */ 161 /* */ 162 /* ========================================================================= */ 163 164 /* ------------------------------------------------------------------------- */ 165 166 void bim_UInt16ByteImage_equalize( struct bim_UInt16ByteImage* imagePtrA ) 167 { 168 uint16 histogramL[ 256 ]; 169 bim_createHisto16( histogramL, imagePtrA ); 170 bim_equalize16( imagePtrA, histogramL ); 171 } 172 173 /* ------------------------------------------------------------------------- */ 174 175 void bim_UInt16ByteImage_equalizeSection( struct bim_UInt16ByteImage* imagePtrA, 176 const struct bts_Int16Rect* sectionPtrA ) 177 { 178 uint16 histogramL[ 256 ]; 179 bim_createHistoOfSection16( histogramL, sectionPtrA, imagePtrA ); 180 bim_equalize16( imagePtrA, histogramL ); 181 } 182 183 /* ========================================================================= */ 184