天天看點

模糊算法增強圖檔對比度

昨天看到一個模糊算法介紹,感覺挺有趣的正好用到就實驗了一下

很多概念都是模糊的,如果把像素的概念模糊化,有時候可以這種模糊解決很多實際問題,比如增強圖檔對比度

讓黑的更黑亮的更亮灰的微處理

但是這個局限性有點大,适合處理對比度不大的圖檔

#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;
}
           

對比強的圖檔效果:

模糊算法增強圖檔對比度

可以看出雖然圖檔均衡了,但是品質變差了

對比度不好的:

模糊算法增強圖檔對比度

因為我處理範例圖檔時不是對比度,是以效果不是那麼明顯

繼續閱讀