Matlab實現直方圖規定化


直方圖規定化

算法分析

  1. 求出原圖的累積概率分布
  2. 求出規定圖的累積概率分布
  3. 求出原圖中每一個灰度級累積概率與規定圖的累積概率最接近的灰度級
  4. 根據第3步的方法將原圖的灰度映射到標准圖中距離最近的灰度值

偽代碼

function outputimg = my_histspec(A,B)
% 灰度圖的直方圖規定化
% 輸入:A是讀入的原圖,B是讀入的規定化的標准圖
% 輸出:outputimg是將A規定化到B之后的圖像

[HA,WA] = 原圖的大小
[HB,WB] = 標准圖的大小

統計原圖灰度級頻數
統計標准圖灰度級頻數
計算原圖灰度級概率
計算標准圖灰度級概率
計算原圖灰度級累積概率分布
計算標准圖灰度級累積概率分布

%求原圖和標准圖的映射關系,找到兩個累積概率最接近的灰度級
遍歷原圖的每個灰度級    
    value{j} = 求標准圖當前灰度級累積概率與原圖所有灰度級累積概率之差的絕對值
    [temp{j},index(j)] = index中存的是vlaue中最小值的下標
outputimg = 開辟一個和原圖大小一致的新矩陣存放規定化后的圖像
遍歷outputimg   
         outputimg(i,j) = 根據映射關系為每一個新矩陣的像素點賦灰度值
轉換outputimg成uint8數據類型
end

代碼

function outputimg = my_histspec(A,B)
% 灰度圖的直方圖規定化
% 輸入:A是讀入的原圖,B是讀入的規定化的標准圖
% 輸出:outputimg是將A規定到B之后的圖像

[HA,WA] = size(A);
[HB,WB] = size(B);
PA = imhist(A) / (HA * WA);
PB = imhist(B) / (HB * WB);

%求累積概率分布
for i = 2 : 256
    PA(i) = PA(i - 1) + PA(i);
    PB(i) = PB(i - 1) + PB(i);
end
%求原圖和映射圖的映射關系,找到兩個累積直方圖距離最近的點
for j = 1:256    
    value{j} = abs(PB - PA(j));
    [temp{j},index(j)] = min(value{j}) %index中存的是最小值的下標,temp中存的是最小值
end

outputimg = zeros(HA, WA);
for i = 1:HA   
     for j = 1:WA    
         outputimg(i,j) = index(A(i,j) + 1)-1;
     end
end
outputimg = uint8(outputimg);
end

實驗結果

%調用示例:
A = imread('pout.tif');
B = imread('coins.png');
C = my_histspec(A,B);
subplot(2,3,1);imshow(A);title('原圖');
subplot(2,3,2);imshow(B);title('標准圖');
subplot(2,3,3);imshow(C);title('匹配到標准圖后');

subplot(2,3,4);imhist(A);title('原圖直方圖');
subplot(2,3,5);imhist(B);title('標准圖直方圖');
subplot(2,3,6);imhist(C);title('匹配到標准圖后直方圖');

實驗分析

  • 直方圖均衡化是直方圖規定化的特例,理想狀態下原圖直方圖均衡化和標准圖均衡化后對應的直方圖應該是相等的,通過求得原圖累積概率和標准圖累積概率最接近的灰度值映射,最后的效果是原圖的直方圖和標准圖的直方圖接近


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM