equalizeHist的源码
时间: 2024-03-12 12:50:06 浏览: 12
以下是OpenCV中`equalizeHist`函数的源码实现:
```cpp
void cv::equalizeHist( InputArray _src, OutputArray _dst )
{
Mat src = _src.getMat();
int depth = src.depth(), cn = src.channels();
CV_Assert( depth == CV_8U && cn <= 4 );
_dst.create( src.size(), src.type() );
Mat dst = _dst.getMat();
if( cn == 1 )
{
equalizeHist_8u(src, dst);
return;
}
int bins[4]={256,256,256,256}, d = 0;
int i, j, c, accumulate_val;
int* hist[4];
uchar lut[4][256];
const int hist_size = 256*cn*sizeof(int);
AutoBuffer<int> _hist(hist_size + 16);
AutoBuffer<uchar> _lut(cn*256);
for( i = 0; i < cn; i++ )
{
hist[i] = _hist + i*256;
for( j = 0; j < 256; j++ )
_lut[i*256 + j] = (uchar)j;
}
for( i = 0; i < src.rows; i++ )
{
const uchar* s = src.ptr<uchar>(i);
for( j = 0; j < src.cols; j++ )
{
for( c = 0; c < cn; c++ )
hist[c][s[j*cn + c]]++;
}
}
for( c = 0; c < cn; c++ )
{
accumulate_val = 0;
const double scale = 255./(src.cols*src.rows);
uchar* lut_ptr = _lut + c*256;
for( i = 0; i < 256; i++ )
{
accumulate_val += hist[c][i];
lut_ptr[i] = cv::saturate_cast<uchar>(accumulate_val*scale + 0.5);
}
}
for( i = 0; i < src.rows; i++ )
{
const uchar* s = src.ptr<uchar>(i);
uchar* d = dst.ptr<uchar>(i);
for( j = 0; j < src.cols; j++ )
{
for( c = 0; c < cn; c++ )
d[j*cn + c] = lut[c][s[j*cn + c]];
}
}
}
```
其中,`_src`表示输入图像,`_dst`表示输出图像。函数首先进行输入图像的判断,确保图像深度为`CV_8U`且通道数不大于4;然后根据通道数的不同进行灰度图像和彩色图像的处理;最后进行直方图均衡化操作,将处理后的像素值存入输出图像中。