天天看点

模糊算法增强图片对比度

昨天看到一个模糊算法介绍,感觉挺有趣的正好用到就实验了一下

很多概念都是模糊的,如果把像素的概念模糊化,有时候可以这种模糊解决很多实际问题,比如增强图片对比度

让黑的更黑亮的更亮灰的微处理

但是这个局限性有点大,适合处理对比度不大的图片

#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
Mat img;
float* findValue(float intensity) {

	float* value = new float[3];

	if (intensity <= 0.27) {
		value[0] = 1.0;           //黑
	}
	if (intensity >= 0.5) {
		value[0] = 0.0;
	}
	else {
		value[0] = (0.5 - intensity) / (0.22);
	}

	if (intensity >= 0.72) {
		value[1] = 1.0;           //白
	}
	if (intensity <= 0.5) {
		value[1] = 0;
	}
	else {
		value[1] = (intensity - 0.5) / 0.22;
	}

	if (intensity >= 0.72) {
		value[2] = 0.0;               //灰
	}
	if (intensity <= 0.27) {
		value[2] = 0.0;
	}
	if (intensity <= 0.5) {
		value[2] = (intensity - 0.27) / 0.22;
	}
	else {
		value[2] = (0.72 - intensity) / 0.22;
	}

	return value;
}

void dealValue() {

	float* value = new float[3];
	for (int i = 0; i < img.rows; i++) {
		float* pr = img.ptr<float>(i);
		for (int j = 0; j < img.cols; j++) {
			for (int k = 0; k < 3; k++) {
				value = findValue(pr[j * 3 + k]);   
				pr[j * 3 + k] = ((value[0] * 0) + (value[2] * 0.5) + (value[1] * 1)) / (value[0] + value[1] + value[2]);
			}
		}
	}
	delete[]value;
}

void histogramcalculation(const Mat & img, Mat & histoImage)   
{
	int histSize = 255;
	float range[] = { 0,256 };   
	const float* histRange = { range };
	bool uniform = true;
	bool accumulate = false;

	Mat b_hist, g_hist, r_hist;
	vector<Mat> bgr_channels;
	split(img, bgr_channels);     

	calcHist(&bgr_channels[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate);  
	calcHist(&bgr_channels[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate);
	calcHist(&bgr_channels[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate);

	int hist_w = 600, hist_h = 400;  
	int bin_w = cvRound((double)hist_w / histSize);        

	Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(120, 55, 133));       

	normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());    
	normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
	normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());

	for (int i = 1; i < histSize; i++) {   
		line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))), Point(bin_w*i, hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2);
		line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))), Point(bin_w*i, hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2);
		line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))), Point(bin_w*i, hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2);
	}
	histoImage = histImage;     
}

int main() {
	img = imread("D://图片//999.jpg");
	if (img.empty()) {
		return -1;
	}
	Mat result1(img.size(), img.type());
	Mat result2(img.size(), img.type());

	imshow("org", img);
	histogramcalculation(img, result1);
	imshow("result1", result1);

	img.convertTo(img, CV_32F, 1 / 255.0);

//	int num = 30;
//	while (num--) {
		dealValue();
	//}
	img.convertTo(img, CV_32F, 255.0);
	histogramcalculation(img, result2);
	imshow("result2", result2);

	img.convertTo(img, CV_8U);
	imshow("result", img);
	waitKey(0);
	return 0;
}
           

对比强的图片效果:

模糊算法增强图片对比度

可以看出虽然图片均衡了,但是质量变差了

对比度不好的:

模糊算法增强图片对比度

因为我处理范例图片时不是对比度,所以效果不是那么明显

继续阅读