16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cv.h"
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if 0
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI(CvStatus, icvCalcContrastHist8uC1R, ( uchar** img, int step, CvSize size,
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              CvHistogram* hist, int dont_clear ))
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI(CvStatus, icvCalcContrastHistMask8uC1R, ( uchar** img, int step,
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                  uchar*  mask, int mask_step, CvSize size,
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                  CvHistogram* hist, int dont_clear ))
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*F///////////////////////////////////////////////////////////////////////////////////////
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Name:       icvCalcContrastHist8uC1R
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Purpose:    Calculating the histogram of contrast from one-channel images
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Context:
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Parameters:
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Returns:
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Notes:      if dont_clear parameter is NULL then histogram clearing before
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                calculating (all values sets to NULL)
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//F*/
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCalcContrastHist8uC1R( uchar** img, int step, CvSize size,
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          CvHistogram* hist, int dont_clear )
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, j, t, x = 0, y = 0;
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int dims;
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !hist || !img )
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dims = hist->c_dims;
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( dims != 1 )
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADSIZE_ERR;
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( hist->type != CV_HIST_ARRAY )
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFLAG_ERR;
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < dims; i++ )
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !img[i] )
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_NULLPTR_ERR;
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < hist->c_dims; i++ )
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !hist->thresh[i] )
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_NULLPTR_ERR;
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( hist->chdims[i] );
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    j = hist->dims[0] * hist->mdims[0];
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int *n = (int *)cvAlloc( (size_t)hist->dims[0] * sizeof( int ));
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( hist->type == CV_HIST_ARRAY )
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !dont_clear )
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < j; i++ )
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                hist->array[i] = 0;
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                n[i] = 0;
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        switch (hist->c_dims)
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case 1:
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                uchar *data0 = img[0];
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int *array = (int *) hist->array;
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int *chdims = hist->chdims[0];
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( i = 0; i < j; i++ )
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    array[i] = cvRound( hist->array[i] );
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( y = 0; y < size.height; y++, data0 += step )
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    for( x = 0; x <= size.width - 1; x += 2 )
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        int v1_r = MIN( data0[x], data0[x + 1] );
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        int v2_r = MAX( data0[x], data0[x + 1] );
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    calculate contrast for the right-left pair
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        for( t = v1_r; t < v2_r; t++ )
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            int val0 = chdims[t + 128];
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            array[val0] += MIN( t - v1_r, v2_r - t );
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            n[val0]++;
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        if( y < size.height - 1 )
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            int v1_d = MIN( data0[x], data0[x + step] );
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            int v2_d = MAX( data0[x], data0[x + step] );
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    calculate contrast for the top-down pair
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            for( t = v1_d; t < v2_d; t++ )
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            {
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                int val0 = chdims[t + 128];
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                array[val0] += MIN( t - v1_d, v2_d - t );
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                n[val0]++;
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            }
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  convert int to float
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( i = 0; i < j; i++ )
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( n[i] != 0 )
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        hist->array[i] = (float) array[i] / n[i];
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    else
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        hist->array[i] = 0;
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        default:
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_BADSIZE_ERR;
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvFree( &n );
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*F///////////////////////////////////////////////////////////////////////////////////////
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Name:       icvCalcContrastHistMask8uC1R
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Purpose:    Calculating the mask histogram of contrast from one-channel images
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Context:
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Parameters:
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Returns:
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Notes:      if dont_clear parameter is NULL then histogram clearing before
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                calculating (all values sets to NULL)
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//F*/
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCalcContrastHistMask8uC1R( uchar** img, int step, uchar* mask, int mask_step,
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              CvSize size, CvHistogram * hist, int dont_clear )
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, j, t, x = 0, y = 0;
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int dims;
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !hist || !img || !mask )
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dims = hist->c_dims;
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( dims != 1 )
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADSIZE_ERR;
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( hist->type != CV_HIST_ARRAY )
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFLAG_ERR;
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < dims; i++ )
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !img[i] )
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_NULLPTR_ERR;
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < hist->c_dims; i++ )
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !hist->thresh[i] )
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_NULLPTR_ERR;
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( hist->chdims[i] );
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    j = hist->dims[0] * hist->mdims[0];
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int *n = (int *)cvAlloc( (size_t) hist->dims[0] * sizeof( int ));
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( hist->type == CV_HIST_ARRAY )
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !dont_clear )
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < j; i++ )
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                hist->array[i] = 0;
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                n[i] = 0;
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        switch (hist->c_dims)
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case 1:
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                uchar *data0 = img[0];
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                uchar *maskp = mask;
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int *array = (int *) hist->array;
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int *chdims = hist->chdims[0];
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( i = 0; i < j; i++ )
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    array[i] = cvRound( hist->array[i] );
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( y = 0; y < size.height; y++, data0 += step, maskp += mask_step )
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    for( x = 0; x <= size.width - 2; x++ )
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        if( maskp[x] )
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            if( maskp[x + 1] )
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            {
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                int v1_r = MIN( data0[x], data0[x + 1] );
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                int v2_r = MAX( data0[x], data0[x + 1] );
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                //    calculate contrast for the right-left pair
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                for( t = v1_r; t < v2_r; t++ )
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                {
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    int val0 = chdims[t + 128];
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    array[val0] += MIN( t - v1_r, v2_r - t );
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    n[val0]++;
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                }
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            }
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            if( y < size.height - 1 )
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            {
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                if( maskp[x + mask_step] )
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                {
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    int v1_d = MIN( data0[x], data0[x + step] );
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    int v2_d = MAX( data0[x], data0[x + step] );
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    //    calculate contrast for the top-down pair
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    for( t = v1_d; t < v2_d; t++ )
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    {
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        int val0 = chdims[t + 128];
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        array[val0] += MIN( t - v1_d, v2_d - t );
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        n[val0]++;
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    }
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                }
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            }
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  convert int to float
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( i = 0; i < j; i++ )
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( n[i] != 0 )
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        hist->array[i] = (float) array[i] / n[i];
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    else
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        hist->array[i] = 0;
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        default:
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_BADSIZE_ERR;
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvFree( &n );
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void cvCalcContrastHist( IplImage** img, CvHistogram* hist, int dont_clear )
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCalcContrastHist" );
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar*   data[CV_HIST_MAX_DIM];
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int      step = 0;
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize roi = {0,0};
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {for( int i = 0; i < hist->c_dims; i++ )
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( CV_CHECK_IMAGE( img[i] ) );}
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {for( int i = 0; i < hist->c_dims; i++ )
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvGetImageRawData( img[i], &data[i], &step, &roi );}
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(img[0]->nChannels != 1)
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( IPL_BadNumChannels, "bad channels numbers" );
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(img[0]->depth != IPL_DEPTH_8U)
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( IPL_BadDepth, "bad image depth" );
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    switch(img[0]->depth)
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case IPL_DEPTH_8U:
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvCalcContrastHist8uC1R( data, step, roi, hist, dont_clear ) );
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    default:  CV_ERROR( IPL_BadDepth, "bad image depth" );
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __CLEANUP__;
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCalcContrastHist( IplImage ** img, CvHistogram * hist, int dont_clear, IplImage * mask )
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCalcContrastHist" );
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar *data[CV_HIST_MAX_DIM];
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar *mask_data = 0;
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int step = 0;
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int mask_step = 0;
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize roi = { 0, 0 };
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( int i = 0; i < hist->c_dims; i++ )
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( CV_CHECK_IMAGE( img[i] ));
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( mask )
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( CV_CHECK_IMAGE( mask ));
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mask->depth != IPL_DEPTH_8U )
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadDepth, "bad mask depth" );
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvGetImageRawData( mask, &mask_data, &mask_step, 0 );
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( int i = 0; i < hist->c_dims; i++ )
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvGetImageRawData( img[i], &data[i], &step, &roi );
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( img[0]->nChannels != 1 )
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadNumChannels, "bad channels numbers" );
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( img[0]->depth != IPL_DEPTH_8U )
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadDepth, "bad image depth" );
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    switch (img[0]->depth)
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case IPL_DEPTH_8U:
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !mask )
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( icvCalcContrastHist8uC1R( data, step, roi, hist, dont_clear ));
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            IPPI_CALL( icvCalcContrastHistMask8uC1R( data, step, mask_data,
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                     mask_step, roi, hist, dont_clear ));
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    default:
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadDepth, "bad image depth" );
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __CLEANUP__;
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
386