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 << "";
}
效果:
原圖:
處理後的圖: