延展增加对比度

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

效果图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值