直方圖的均衡化
我們先來看看原圖的直方圖
我們發現高亮區域的像素點很少,主要像素點集中在中低亮度區域
我們先設置一個阈值,也就是圖中的那根粉色的線,
當某一亮度值的像素點的個數低於這個值時,我們認為這些像素點是無關緊要的。
灰度圖的亮度值范圍是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;
}