17f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* 27f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 37f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 47f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 57f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * you may not use this file except in compliance with the License. 67f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * You may obtain a copy of the License at 77f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 87f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 97f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * See the License for the specific language governing permissions and 147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * limitations under the License. 157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */ 167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- includes ----------------------------------------------------------- */ 187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Int16Arr.h" 207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Math.h" 217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_ImageEm/HistoEq.h" 227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_ImageEm/UInt8Image.h" 237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- typedefs ----------------------------------------------------------- */ 257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- constants ---------------------------------------------------------- */ 277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ auxiliary functions } ---------------------------------------- */ 337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** Computes grey level histogram of given image. */ 377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_createHisto( struct bbs_Context* cpA, 387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* histoPtrA, 397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bim_UInt8Image* imagePtrA ) 407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 iL; 427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* dstPtrL; 437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const uint8* srcPtrL; 447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* init histogram array with 0 */ 467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstPtrL = histoPtrA; 477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 256; iL > 0; iL-- ) 487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *dstPtrL++ = 0; 507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* calculate histogram */ 537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project srcPtrL = imagePtrA->arrE.arrPtrE; 547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstPtrL = histoPtrA; 557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = imagePtrA->arrE.sizeE; iL > 0; iL-- ) 567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstPtrL[ *srcPtrL++ ]++; 587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** Computes grey level histogram of given image. */ 647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_createHistoOfSection( struct bbs_Context* cpA, 657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* histoPtrA, 667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bts_Int16Rect* sectionPtrA, 677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bim_UInt8Image* imagePtrA ) 687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 xL, yL; 707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const uint8* srcPtrL; 717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* dstPtrL; 727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Int16Rect sectionL = *sectionPtrA; 737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 sectWidthL; 747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 sectHeightL; 757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 imgWidthL = imagePtrA->widthE; 767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 imgHeightL = imagePtrA->heightE; 777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* adjustments */ 797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sectionL.x1E = bbs_max( 0, sectionL.x1E ); 807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sectionL.x1E = bbs_min( imgWidthL, sectionL.x1E ); 817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sectionL.x2E = bbs_max( 0, sectionL.x2E ); 827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sectionL.x2E = bbs_min( imgWidthL, sectionL.x2E ); 837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sectionL.y1E = bbs_max( 0, sectionL.y1E ); 847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sectionL.y1E = bbs_min( imgHeightL, sectionL.y1E ); 857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sectionL.y2E = bbs_max( 0, sectionL.y2E ); 867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sectionL.y2E = bbs_min( imgHeightL, sectionL.y2E ); 877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sectWidthL = sectionL.x2E - sectionL.x1E; 897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sectHeightL = sectionL.y2E - sectionL.y1E; 907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* init histogram with 0 */ 927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstPtrL = histoPtrA; 937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( xL = 256; xL > 0; xL-- ) 947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *dstPtrL++ = 0; 967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* calculate histogram */ 997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project srcPtrL = imagePtrA->arrE.arrPtrE + sectionL.y1E * imgWidthL + sectionL.x1E; 1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstPtrL = histoPtrA; 1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( yL = 0; yL < sectHeightL; yL++ ) 1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( xL = 0; xL < sectWidthL; xL++ ) 1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstPtrL[ *srcPtrL++ ]++; 1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project srcPtrL += imgWidthL - sectWidthL; 1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** equalize image using given histogram */ 1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_equalize( struct bbs_Context* cpA, 1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bim_UInt8Image* imagePtrA, 1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const uint16* histoPtrA ) 1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 kL; 1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 sumL = 0; 1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 totalSumL = 0; 1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const uint16* histoArrPtrL; 1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint8* dstPtrL; 1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint8 mappingL[ 256 ]; 1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* determine number of counts in histogram */ 1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project histoArrPtrL = histoPtrA; 1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( kL = 256; kL > 0; kL-- ) 1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project totalSumL += *histoArrPtrL++; 1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( totalSumL == 0 ) totalSumL = 1; 1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* compute transfer function (cumulative histogram) */ 1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project histoArrPtrL = histoPtrA; 1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( kL = 0; kL < 256; kL++ ) 1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sumL += *histoArrPtrL++; 1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project mappingL[ kL ] = ( sumL * 255 ) / totalSumL; 1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* remap pixel values */ 1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstPtrL = imagePtrA->arrE.arrPtrE; 1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( kL = imagePtrA->arrE.sizeE; kL > 0; kL-- ) 1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *dstPtrL = mappingL[ *dstPtrL ]; 1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstPtrL++; 1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ external functions } ----------------------------------------- */ 1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_UInt8Image_equalize( struct bbs_Context* cpA, 1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bim_UInt8Image* imagePtrA ) 1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16 histogramL[ 256 ]; 1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bim_createHisto( cpA, histogramL, imagePtrA ); 1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bim_equalize( cpA, imagePtrA, histogramL ); 1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bim_UInt8Image_equalizeSection( struct bbs_Context* cpA, 1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bim_UInt8Image* imagePtrA, 1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bts_Int16Rect* sectionPtrA ) 1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16 histogramL[ 256 ]; 1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bim_createHistoOfSection( cpA, histogramL, sectionPtrA, imagePtrA ); 1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bim_equalize( cpA, imagePtrA, histogramL ); 1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 181