1. 程式人生 > 其它 >【影象處理演算法】直方圖均衡化

【影象處理演算法】直方圖均衡化

轉:https://blog.csdn.net/qq_15971883/article/details/88699218

直方圖均衡化的介紹

直方圖均衡化是一種簡單有效的影象增強技術,通過改變影象的直方圖來改變影象中各畫素的灰度,主要用於增強動態範圍偏小的影象的對比度。原始影象由於其灰度分佈可能集中在較窄的區間,造成影象不夠清晰。例如,過曝光影象的灰度級集中在高亮度範圍內,而曝光不足將使影象灰度級集中在低亮度範圍內。採用直方圖均衡化,可以把原始影象的直方圖變換為均勻分佈(均衡)的形式,這樣就增加了畫素之間灰度值差別的動態範圍,從而達到增強影象整體對比度的效果。換言之,直方圖均衡化的基本原理是:對在影象中畫素個數多的灰度值(即對畫面起主要作用的灰度值)進行展寬,而對畫素個數少的灰度值(即對畫面不起主要作用的灰度值)進行歸併,從而增大對比度,使影象清晰,達到增強的目的。舉個例子,如圖1所示,左圖為原始影象,右圖為直方圖均衡化後的影象。

圖1 直方圖均衡化前後效果對比
### 直方圖的概念 對一幅灰度影象,其直方圖反映了該影象中不同灰度級出現的統計情況。圖2給出了一個直方圖的示例,其中圖(a)是一幅影象,其灰度直方圖可表示為圖(b),其中橫軸表示影象的各灰度級,縱軸表示影象中各灰度級畫素的個數。(需要注意,灰度直方圖表示了在影象中各個單獨灰度級的分佈,而影象對比度則取決於相鄰近畫素之間灰度級的關係。)
圖 2 影象及其直方圖
在MATLAB中可以使用函式imhist()來計算灰度影象的直方圖。我們計算一下圖1中左圖的灰度直方圖,結果如圖3所示。 ``` I = imread('pout.tif'); figure; subplot(121), imshow(I); subplot(122), imhist(I); axis([0, 256, 0, 4000]); ```
圖 3 灰度影象及其直方圖

直方圖均衡化的理論基礎

手工實現直方圖均衡化

MATLAB上實現直方圖均衡化

在MATLAB中提供了現成的函式histeq()來實現灰度影象的直方圖均衡化,如下例所示:

close all; 
clear; 
clc; 
 
I = imread('pout.tif');
J = histeq(I,256);
imshowpair(I,J,'montage');
圖 9 使用函式histeq()進行直方圖均衡化
但為了演示說明演算法的原理,下面將在MATLAB中自行編碼實現灰度影象的直方圖均衡化。通過程式碼來演示這個演算法顯然更加直觀,更加易懂。 ``` close all; clear; clc;

% 首先讀入灰度影象,並提取影象的高度和寬度
image = imread('pout.tif');
[height, width] = size(image);

% 然後統計每個灰度的畫素值的累計數目
NumPixel = zeros(1,256); % 建立一個256列的行向量,以統計各灰度級的畫素個數
for i = 1 : height
for j = 1 : width
k = image(i,j); % k是畫素點(i,j)的灰度值
% 因為NumPixel陣列的下標是從1開始的,但是影象畫素的取值範圍是0~255
% 所以用NumPixel(k+1)
NumPixel(k+1) = NumPixel(k+1) + 1; % 對應灰度值畫素點數量加1
end
end

% % 這裡我們將陣列NumPixel顯示出來,以觀測效果
% figure;
% subplot(121), imshow(image);
% subplot(122), bar(NumPixel); % 灰度影象的直方圖可以正確顯示出來

% 接下來,將頻數值算為頻率
ProbPixel = zeros(1,256); % 統計各灰度級出現的頻率
for i = 1 : 256
ProbPixel(i) = NumPixel(i) / (height * width);
end

% % 這裡我們將陣列ProbPixel顯示出來,以觀測效果
% figure;
% subplot(121), imshow(image);
% subplot(122), bar(ProbPixel); % 灰度影象的歸一化直方圖可以正確顯示出來

% 再用函式cumsum()來計算累積分佈函式(CDF),並將頻率(取值範圍是01)對映到0255的無符號整數
CumPixel = cumsum(ProbPixel); % 這裡的陣列CumPixel大小也是1×256
CumPixel = uint8((256-1) .* CumPixel + 0.5);

% % 這裡我們將陣列CumPixel顯示出來,以觀測效果
% figure;
% subplot(121), imshow(image);
% subplot(122), bar(CumPixel); % 陣列CumPixel可以正確顯示出來

% 在下列用作直方圖均衡化實現的賦值語句右端,image(i,j)被用來作為CumPixel的索引
% 例如,image(i,j)=120,則從CumPixel中取出第120個值作為image(i,j)的新畫素值
outImage = uint8(zeros(height, width)); % 預分配陣列
for i = 1 : height
for j = 1 : width
outImage(i,j) = CumPixel(image(i,j));
end
end

% 顯示直方圖均衡化前後的影象,可以發現,與呼叫函式histeq()的效果一致
imshowpair(image, outImage, 'montage');

實驗效果如圖10所示。
![123](https://img2020.cnblogs.com/blog/1209802/202112/1209802-20211231103428950-703654865.png)
首先在RGB空間進行直方圖均衡化處理。這裡為了簡便,直接呼叫MATLAB函式histeq()。
``` matlab
close all; 
clear; 
clc; 
 
I = imread('baby.jpg');
% figure,imshow(I);
 
% 分別提取R、G、B三個分量
R = I(:, :, 1); 
G = I(:, :, 2); 
B = I(:, :, 3); 
 
% 分別對三個分量進行直方圖均衡化
R = histeq(R, 256); 
G = histeq(G, 256); 
B = histeq(B, 256); 
 
J = I;
J(:, :, 1) = R; 
J(:, :, 2) = G; 
J(:, :, 3) = B; 
 
imshowpair(I, J, 'montage'); 

在RGB空間進行直方圖均衡化的前後影象如圖12所示。


接下來,我們在HSV空間對V分量進行直方圖均衡化處理。這裡的程式碼可以採用呼叫MATLAB函式histeq()的方式,但是我們使用自行編碼的方式進行處理。

close all; 
clear; 
clc; 
 
I = imread('baby.jpg'); 
 
% 將RGB空間轉換為HSV空間
hsvImage = rgb2hsv(I); 
 
% 提取V分量
v = hsvImage(:, :, 3);  % 這裡的v是double型別的矩陣
 
% 以下程式碼與前面介紹基本一致,這裡不再做過多註釋
[height, width] = size(v); 
 
v = uint8(v .* 255 + 0.5); % 這裡的0.5有必要加上,以免矩陣v中出現0
 
N = zeros(1, 256); 
for i = 1 : height
   for j = 1 : width
      k = v(i,j);
      N(k+1) = N(k+1) + 1; 
   end
end
 
ProbPixel = zeros(1, 256);
for i = 1 : 256
    ProbPixel(i) = N(i) / (height * width); 
end
 
CumPixel = cumsum(ProbPixel);
CumPixel = uint8(255 .* CumPixel + 0.5); % 四捨五入
 
for i = 1 : height
   for j = 1 : width
      v(i,j) = CumPixel(v(i,j));  % 這裡的v(i,j)不能為0,否則陣列索引出錯
   end
end
 
v = im2double(v); 
hsvImage(:, :, 3) = v; 
outImage = hsv2rgb(hsvImage); 
 
imshowpair(I, outImage, 'montage');

在HSV空間進行直方圖均衡化的前後影象如圖13所示。

圖 13 HSV空間直方圖均衡化前後效果對比
### 直方圖均衡化的缺點 如果一幅影象整體偏暗或者偏亮,那麼直方圖均衡化的方法很適用。但直方圖均衡化是一種全域性處理方式,它對處理的資料不加選擇,可能會增加背景干擾資訊的對比度並且降低有用訊號的對比度(如果影象某些區域對比度很好,而另一些區域對比度不好,那採用直方圖均衡化就不一定適用)。此外,均衡化後圖像的灰度級減少,某些細節將會消失;某些影象(如直方圖有高峰),經過均衡化後對比度不自然的過分增強。針對直方圖均衡化的缺點,已經有區域性的直方圖均衡化方法出現。