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