OpenCV2 直方图均衡化


直方图的均衡化

我们先来看看原图的直方图

我们发现高亮区域的像素点很少,主要像素点集中在中低亮度区域

我们先设置一个阈值,也就是图中的那根粉色的线,

当某一亮度值的像素点的个数低于这个值时,我们认为这些像素点是无关紧要的。

灰度图的亮度值范围是0-255,若亮度值为1的像素点的个数低于阈值,我们可简单的把亮度为1的像素点的亮度

全设为0,同理,我们从高往低找,若亮度值为254的像素点的个数低于阈值,我们可以把这些像素点的亮度设为255

这样我们可以从小到大,从大到小分别找到两个亮度,它们的像素点的个数恰大于阈值

他们之间的区域,我们可以认为是有效区域,也就是蓝色框出来的区域

我们把这一区域扩展到0-255的区域去,可实现均衡化效果

编程实现为

cv::Mat Histogram::stretch1(const cv::Mat& image, int minValue) {
cv::MatND hist
= getHistogram(image);
int imin =0;
for (; imin < histSize[0]; imin++) {
if (hist.at<float>(imin) > minValue) {
break;
}
}
int imax = histSize[0] -1;
for (; imax >=0; imax--) {
if (hist.at<float>(imax) > minValue) {
break;
}
}
cv::Mat lookup(cv::Size(
1, 256), CV_8U);
for (int i =0; i <256; i++) {
if (i < imin) {
lookup.at
<uchar>(i) =0;
}
elseif (i > imax) {
lookup.at
<uchar>(i) =255;
}
else {
lookup.at
<uchar>(i) = static_cast<uchar>(255.0* (i - imin)
/ (imax - imin) +0.5);}
}
cv::Mat result;
cv::LUT(image, lookup, result);
return result;
}
  • 1
  • 2
  • 3
  • 下一页

相关内容