去光照不均勻

論文地址:http://journal.bit.edu.cn/zr/ch/reader/create_pdf.aspx?file_no=20160216&year_id=2016&quarter_id=2&falg=1

 

Matlab代碼:

clc, close all; tic;
im = imread('test.png'); 
figure; imshow(im); 
title('原圖');
[h, s, v] = rgb2hsv(im);    %轉到hsv空間,對亮度h處理% 高斯濾波
HSIZE = min(size(im, 1), size(im, 2)); %高斯卷積核尺寸
q = sqrt(2);
SIGMA1 = 15; %論文裏面的c
SIGMA2 = 80; 
SIGMA3 = 250; 
F1 = fspecial('gaussian', HSIZE, SIGMA1 / q);
F2 = fspecial('gaussian', HSIZE, SIGMA2 / q);
F3 = fspecial('gaussian', HSIZE, SIGMA3 / q); 
gaus1 = imfilter(v, F1, 'replicate'); 
gaus2 = imfilter(v, F2, 'replicate');
gaus3 = imfilter(v, F3, 'replicate');
gaus = (gaus1 + gaus2 + gaus3) / 3;    %多尺度高斯卷積,加權,權重爲1 / 3 
% gaus = (gaus * 255); 
figure; imshow(gaus, []); 
title('光照分量'); 
%二維伽馬卷積
m = mean(gaus(:)); 
[w, height] = size(v); 
out = zeros(size(v)); 
gama = power(0.5, ((m - gaus) / m)); %根據公式gamma校正處理,論文公式有誤
out = (power(v, gama)); 
figure; imshow(out, []); 
rgb = hsv2rgb(h, s, out);   %轉回rgb空間顯示
figure; imshow(rgb); 
title('處理結果')
imwrite(rgb, 'test1.png');
toc;

C++代碼:

void ImageInhomogeneity(Mat & src, Mat &dst)
{
	Mat src_hsv, src_h, src_s, src_v;
	cvtColor(src, src_hsv, COLOR_BGR2HSV);
	vector<Mat> rgb_planes;
	split(src_hsv, rgb_planes);
	src_h = rgb_planes[0];
	src_s = rgb_planes[1];
	src_v = rgb_planes[2];


	Mat v = Mat::zeros(src_v.size(), CV_64FC1);
	for (int i = 0; i < src_v.rows; i++)
	{
		for (int j = 0; j < src_v.cols; j++)
		{
			v.at<double>(i, j) = (double)src_v.at<uchar>(i, j) / 255;
		}
	}

	double hsize = min(src.cols, src.rows);
	double q = sqrtf(2);
	double SIGMA1 = 15;
	double SIGMA2 = 80;
	double SIGMA3 = 250;

	Mat F1 = getGaussianKernel(hsize, SIGMA1 / q);
	Mat F2 = getGaussianKernel(hsize, SIGMA2 / q);
	Mat F3 = getGaussianKernel(hsize, SIGMA3 / q);

	Mat F1_1 = Mat::zeros(Size(hsize, hsize),CV_64FC1);
	Mat F2_1 = Mat::zeros(Size(hsize, hsize), CV_64FC1);
	Mat F3_1 = Mat::zeros(Size(hsize, hsize), CV_64FC1);
	for (int i = 0; i < hsize; i++)
	{
		for (int j = 0; j < hsize; j++)
		{
			F1_1.at<double>(i, j) = F1.at<double>(i, 0) * F1.at<double>(j, 0);
			F2_1.at<double>(i, j) = F2.at<double>(i, 0) * F2.at<double>(j, 0);
			F3_1.at<double>(i, j) = F3.at<double>(i, 0) * F3.at<double>(j, 0);
		}
	}


	Mat gaus1, gaus2, gaus3;


	filter2D(v, gaus1, v.type(), F1_1);
	filter2D(v, gaus2, v.type(), F2_1);
	filter2D(v, gaus3, v.type(), F3_1);
	Mat gaus = (gaus1 + gaus2 + gaus3) / 3;


	Scalar mm = mean(gaus);
	double m = mm[0];

	Mat gama = gaus.clone();
	Mat out = gaus.clone();
	for (int i = 0; i < gama.rows; i++)
	{
		for (int j = 0; j < gama.cols; j++)
		{
			gama.at<double>(i, j) = pow(0.5, ((m - gaus.at<double>(i, j)) / m));
			out.at<double>(i, j) = pow(v.at<double>(i, j), gama.at<double>(i, j));
		}
	}

	for (int i = 0; i < src_v.rows; i++)
	{
		for (int j = 0; j < src_v.cols; j++)
		{
			src_v.at<uchar>(i, j) = out.at<double>(i, j)*(double)255;
		}
	}


	Mat outtt, outtt1;
	vector<Mat> hsv_planes;
	hsv_planes.push_back(src_h);
	hsv_planes.push_back(src_s);
	hsv_planes.push_back(src_v);
	merge(hsv_planes, outtt);
	cvtColor(outtt, dst, COLOR_HSV2BGR);

	cout << "";
}

效果:

原圖:

 

處理後的圖:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章