爲了保證色彩的不失真,所以把RGB圖像,轉爲HSV進行處理,對其中的亮度S進行操作,先進行直方圖均衡化,後進行高斯-拉普拉斯濾波器的銳化處理,進行改進亮度。
銳化處理可以用空間微分來完成. 微分算子的響應強度與圖像在該點的突變程度有關,圖像微分增強了邊緣和其他突變(如噪聲)而消弱了灰度變化緩慢的區域.。
代碼如下:
其中的直方圖均衡化函數可以參考:直方圖均衡化
img = imread('');
figure;
imshow(img);
title('原圖')
%轉hsv
img_hsv = rgb2hsv(img);
%提取亮度
img_v = img_hsv( :,:,3);
%先進行直方圖均衡化處理
img_hist = hist_1(img_v);
%再進行銳化處理
% w = fspecial('laplacian', 0.8);%生成拉普拉斯濾波器
w = fspecial('log', [5 5], 0.4);%生成高斯-拉普拉斯濾波器
img_ruihua = filter(img_hist, w, 5);
img_hsv(:,:,3) = img_hist;
img_after = hsv2rgb(img_hsv);
figure;
imshow(img_after);
title('處理後')
%%
%銳化函數
function img_result = filter(img_v, w, muban_size)
moban_size = muban_size;
[M, N] = size(img_v);
img_lap = zeros(M, N);
expand_img = double(wextend('2D','zpd', img_v, floor(moban_size/2)));%擴展0,轉double爲了矩陣運算
for i=1:M
for j=1:N
ave = sum( sum( expand_img(i:i+moban_size-1,j:j+moban_size-1) .* w)); %取出擴展元素與模板相乘,並求矩陣元素之和
img_lap(i,j) = ave;
end
end
img_result = img_v - img_lap;
end
%%
%直方圖均衡化函數
function hist_img = hist_1(I)
I = floor(I.*255);
[M, N] = size(I);
size_img = M*N;
c = zeros(1,256);%統計每個每個像素值的個數
b= c;%轉化前後的對照表
temp = I(:);
temp = sort(temp);
for i = 1:size_img
c(temp(i)+1) = c(temp(i)+1)+1;
end
a = c;%求和
for i = 2:256
a(i) = c(i) + a(i-1);
end
min_cdf = 10000;
for i = 1:256
if a(i)>0
if a(i) < min_cdf
min_cdf = a(i);
end
end
end
for j = 1:256
if a(j) > 0
b(j) = round(255*(a(j)-min_cdf)/(size_img-min_cdf));
end
end
for i = 1:M
for j = 1:N
I(i,j) = b(I(i,j)+1);
end
end
hist_img = I./255;
end
首先對夜景照片進行試驗:
可以看到對夜景照片的暗部增強明顯,但是天空會有些過曝。
再對霧天照片進行試驗:
整體的亮度有了一些增強,有部分去霧功能,但是不是很完美。
對於暗光下的人像處理試驗:
對於人像效果較好,臉部亮度提升明顯,細節增強明顯。
代碼肯定還有很多不完善的地方,歡迎批評指正。