索引地址:系列索引
直方图变换是通过改变和调整图像的直方图形状来实现改变图像灰度阶分布与结构的增强方法。
图像直方图反映图像的对比度、明暗等细节特征,如果直方图集中在某一区间,画面呈现出来彩色单一,不利于观察分析。常见的直方图变换是通过灰度变换s=T(r)=255*(r-a)/(b-a),将[a,b]映射到[0,255]实现的。另外,根据直方图均衡的原理,为尽可能使像素点均匀分布,可以通过累计平均分配的方式计算出均衡化的像素。
直方图变换—查找
- 将源图像转换为灰度图,计算图像的灰度直方图。
- 根据预设阈值参数由低到高查找iLow,再由高到低找iHigh。
- 根据上步得到直方图iLow与iHihg并进行查找表变换。
- 通过查找表进行映射变换,完成直方图查找方法变换。
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
#include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> int main() { cv::Mat srcImage = cv::imread("..\\images\\flower3.jpg"); if( !srcImage.data ) return 1; cv::Mat srcGray; cvtColor(srcImage, srcGray, CV_BGR2GRAY); const int channels[1]={0}; const int histSize[1]={256}; float hranges[2]={0,255}; const float* ranges[1]={hranges}; cv::MatND hist; calcHist(&srcGray,1,channels,cv::Mat(), hist,1,histSize,ranges); int segThreshold = 50; int iLow =0; for (; iLow < histSize[0]; iLow++) { if (hist.at<float>(iLow) > segThreshold) { break; } } int iHigh = histSize[0] -1; for (; iHigh >=0; iHigh--) { if (hist.at<float>(iHigh) > segThreshold) { break; } } cv::Mat lookUpTable(cv::Size(1, 256), CV_8U); for (int i =0; i <256; i++) { if (i < iLow ){ lookUpTable.at<uchar>(i) =0; } else if (i > iHigh) { lookUpTable.at<uchar>(i) = 255; } else { lookUpTable.at<uchar>(i) = static_cast<uchar>( 255.0 * (i - iLow) / (iHigh - iLow + 0.5)); } } cv::Mat histTransResult; cv::LUT(srcGray, lookUpTable, histTransResult); cv::imshow("srcGray",srcGray); cv::imshow("histTransResult",histTransResult); cv::waitKey(0); return 0; }
|
效果为