/*
延伸直方图均衡增加图像的对比度
*/
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
Mat stretch(const Mat& img, int minValue);
Mat stretchV3(const Mat & img, int minValue);
int main() {
double t = getTickCount();
Mat img = imread("D://图片//5.jpg");
if (img.empty()) {
cout << "加载失败" << endl;
return -1;
}
int minVal = 0;
cout << "请输入门槛值:" << endl;
cin >> minVal;
Mat result = stretch(img, minVal);
Mat result2 = stretch(img, minVal);
imshow("show_result", result);
imshow("show_result2", result2);
double Time = ((double)getTickCount() - t) / getTickFrequency();
cout << "Time = " << Time << endl;
waitKey(0);
destroyAllWindows;
return 0;
}
Mat stretch(const Mat & img, int minValue){
Mat result;
vector<Mat> channels;
split(img, channels); //这里只处理一个通道,多通道类似
int min = 0;
int max = 255;
for ( ; min <= 255; min++) {
if (channels[0].at<uchar>(min) > minValue)
break;
}
for ( ; max >= 0; max--) {
if (channels[0].at<uchar>(max) > minValue)
break;
}
int dim(256);
Mat lookUp(1, &dim, CV_8UC1);
for (int i = 0; i < 256; i++) {
if (i < min)
lookUp.at<uchar>(i) = 0;
else if (i > max)
lookUp.at<uchar>(i) = 255;
else {
lookUp.at<uchar>(i) = 255 * (i - min) / (max - min);
}
}
LUT(channels[0], lookUp, result);
return result;
}
Mat stretchV3(const Mat & img, int minValue) { //这里先转换成灰度图再执行全部的变换
Mat result;
Mat tem(img.size(), img.depth());
cvtColor(img, tem, CV_BGR2GRAY);
int min = 0;
int max = 255;
for (; min <= 255; min++) {
if (tem.at<uchar>(min) > minValue)
break;
}
for (; max >= 0; max--) {
if (tem.at<uchar>(max) > minValue)
break;
}
int dim(256);
Mat lookUp(1, &dim, CV_8UC1);
for (int i = 0; i < 256; i++) {
if (i < min)
lookUp.at<uchar>(i) = 0;
else if (i > max)
lookUp.at<uchar>(i) = 255;
else {
lookUp.at<uchar>(i) = 255 * (i - min) / (max - min);
}
}
LUT(tem, lookUp, result);
return result;
}
效果图: