延展增加对比度

/*
延伸直方图均衡增加图像的对比度
*/
#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;
}

效果图:

延展增加对比度_第1张图片

你可能感兴趣的:(延展增加对比度)