Histogram equalization

Question:

實現一個對灰度圖做直方圖均衡化的函數(不允許直接調用現成的直方圖均衡化接口,例如 Matlab 的“histeq”接口)。函數的格式爲“equalize_hist(input_img)  output_img”,該函數返回一張灰度級分佈均勻的灰度圖。如有必要,你可以修改該函數的格式。請載入對應你學號的輸入圖像,並用你實現的程序來完成以下任務:

1. 計算並顯示圖像的直方圖,並把結果粘貼到報告裏。注意:你必須用你自己實現的函數來計算直方圖,但是允許調用現成的 API 來顯示直方圖。(例如,你不能調用 Matlab 的“imhist”來計算直方圖,但是可以調用“subplot”, “hist”來顯示直方圖。)

2. 進行直方圖均衡化,將均衡化後的結果和相應的直方圖粘貼到報告裏。

3. 分析直方圖均衡化後的結果,字數不能超過一頁。

4. 詳細描述你是如何實現直方圖均衡化操作的,也就是說,針對“equalize_hist”函數進行算法說明,字數不能超過兩頁。請集中在算法描述方面,不要過多地複製/粘貼代碼到報告上。

Answer:

function [new] = equalize_hist(I)  
if isstr(I)
    img = imread(I);
end  
[height,width] = size(img);
new = zeros(height,width); %% 創建新圖像
figure  
subplot(221)  
imshow(img)%顯示原始圖像
axis on
title(['原圖像']);
  
%統計像素灰度  
NumPixel = zeros(1,256);%用長度爲256的一維數組統計各灰度值的數目
for i = 1:height  
    for j = 1: width  
        NumPixel(img(i,j) + 1) = NumPixel(img(i,j) + 1) + 1;  
    end  
end  
subplot(222)
bar(NumPixel)%顯示原始圖像直方圖
axis on
title(['原圖像直方圖']);
%計算PDA 
PDA = zeros(1,256);  
for i = 1:256  
    PDA(i) = NumPixel(i) / (height * width * 1.0);  
end  
%計算CDA 
CDA = zeros(1,256);  
for i = 1:256  
    if i == 1  
        CDA(i) = PDA(i);  
    else  
        CDA(i) = CDA(i - 1) + PDA(i);  
    end  
end  
%將CDA乘上最大灰度255並且向上取整  
CDA = uint8(255 .* CDA + 0.5);  
%將原圖像各個位置灰度值映射到新值  
for i = 1:height  
    for j = 1: width  
        new(i,j) = CDA(img(i,j)+1);  
    end  
end  
new = uint8(new);
subplot(223)  
imshow(new)%顯示均衡化圖像
axis on
title(['均衡化圖像']);
NewNumPixel = zeros(1,256); 
for i = 1:height  
    for j = 1: width  
        NewNumPixel(new(i,j) + 1) = NewNumPixel(new(i,j) + 1) + 1;  
    end  
end
subplot(224)
bar(NewNumPixel)%顯示均衡化圖像直方圖
axis on
title(['均衡化圖像直方圖']);

Algorithm description:

根據書本上的直方圖均衡化公式
一步步計算出各個變量即可。簡單來說就是將原圖像任意(x,y)處的灰度值 r
通過公式所述函數映射到均衡化圖像相應位置上的灰度值 s。
第一步:
創建長度爲 256 的數組,統計原圖像各個灰度值的數目;
NumPixel = zeros(1,256);%用長度爲 256 的一維數組統計各灰度值的數目
for i = 1:height
for j = 1: width
NumPixel(img(i,j) + 1) = NumPixel(img(i,j) + 1) + 1;
end
end
第二步:
計算各個灰度值 PDA;
PDA = zeros(1,256);
for i = 1:256
PDA(i) = NumPixel(i) / (height * width * 1.0);
end
第三步:
計算累積分佈函數 CDA,並且乘上 255 取整。
CDA = zeros(1,256);
for i = 1:256
if i == 1
CDA(i) = PDA(i);
else
CDA(i) = CDA(i - 1) + PDA(i);
end
end
第四步:
直接將原圖各個位置像素灰度值映射到均衡化圖像上即可。
for i = 1:height
for j = 1: width
new(i,j) = CDA(img(i,j)+1);
end
end

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