直方圖均衡化這種方法通常用來增加許多圖像的全局對比度,尤其是當圖像的有用數據的對比度相當接近的時候。通過這種方法,亮度可以更好地在直方圖上分佈。這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現這種功能。
這種方法對於背景和前景都太亮或者太暗的圖像非常有用,這種方法尤其是可以帶來X光圖像中更好的骨骼結構顯示以及曝光過度或者曝光不足照片中更好的細節。這種方法的一個主要優勢是它是一個相當直觀的技術並且是可逆操作,如果已知均衡化函數,那麼就可以恢復原始的直方圖,並且計算量也不大。這種方法的一個缺點是它對處理的數據不加選擇,它可能會增加背景噪聲的對比度並且降低有用信號的對比度。
代碼中的直方圖均衡化函數爲自己編寫,可參看:自己編寫直方圖均衡化函數
對RGB通道
通過這種方式取出RGB三通道,分別進行直方圖均衡化,最後進行合成,再輸出。
OutImg(:,:,1)=R;
OutImg(:,:,2)=G;
OutImg(:,:,3)=B;
完整的代碼如下:
%%
clc
clear all
I=imread('D:\提高文化修養的文件\數圖處理\第三章圖像增強 第1次作業\fireworks.jpg');
%%
%%變化前灰度值
OutImg=I;
R=I(:,:,1);
subplot(2,3,1)
imhist(R);
title('R')
G=I(:,:,2);
subplot(2,3,2)
imhist(G);
title('G')
B=I(:,:,3);
subplot(2,3,3)
imhist(B);
title('B')
%%
%%變化後灰度值
R=hist_1(R);
subplot(2,3,4)
imhist(R);
title('after R')
G=hist_1(G);
subplot(2,3,5)
imhist(G);
title('after G')
B=hist_1(B);
subplot(2,3,6)
imhist(B);
title('after B')
%%
%變化後圖像
OutImg(:,:,1)=R;
OutImg(:,:,2)=G;
OutImg(:,:,3)=B;
figure,
imshow(I);
title('原圖像')
figure,
imshow(OutImg);
title('直方圖均衡化後的圖像')
%%
%直方圖均衡化函數
function hist_img = hist_1(I)
[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;
end
但是這種方式會對原來的顏色造成破壞,還會出現過曝等,適用性一般。
示例煙花圖如下:
ps:圖片拍攝於湖南師範大學體育館二樓,2019.10.1
可以看出天空等出現了過曝,而且相應的顏色都有部分失真,特別是煙花附近過曝嚴重。
對HSV通道
HSV(Hue, Saturation, Value)是根據顏色的直觀特性由A. R. Smith在1978年創建的一種顏色空間, 也稱六角錐體模型(Hexcone Model)。
這個模型中顏色的參數分別是:色調(H),飽和度(S),明度(V)。
對於夜晚圖像的增強,可以只對亮度通道進行增強。
通過rgb2hsv轉換爲hsv通道
通過hsv2rgb轉換爲rgb通道
V通道通常小於1,但是直方圖均衡化爲0-255,故:
floor(v * 255)
變換後:
v/255
綜上代碼如下:
%%
clc
clear all
I=imread('D:\QQ接收文件夾\MobileFile\IMG_20191001_204030.jpg');
%%
%%HSV
OutImg=rgb2hsv(I);
V=OutImg(:,:,3);
V = floor(V * 255);
%%
%%變化後V
V=hist_1(V);
V = V / 255;
%%
%變化後圖像
OutImg(:,:,3) = V;
OutImg = hsv2rgb(OutImg);
imshow(I);
title('原圖像')
figure,
imshow(OutImg);
title('直方圖均衡化後的圖像')
%%
%直方圖均衡化函數
function hist_img = hist_1(I)
[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;
end
對剛纔的圖像進行處理,結果如下:
可以看出對色彩的還原比較高,但是在燈的附近還是出現了過曝,整體來說畫面的亮度有了較大的提升,且下方的座椅效果很好,比RGB通道的直方圖均衡化要好。適用於沒有特別亮的暗色照片增強。
綜合對比:
左邊爲RGB,右邊爲HSV
推薦使用HSV通道。
參考鏈接,可參看:自己編寫直方圖均衡化函數