灰度直方圖匹配(灰度直方圖規定化)matlab代碼

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
% % % 直方圖規定化(直方圖匹配)的具體代碼
% % % 
%     [value,index] = min(x) min返回最小值及其對應的下標
% % % 
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
clc;
clear;
close all;
% % % % % % % % % %讀入原始圖 % % % % % % % % % % % % % % 
orgin = imread('fusion/images/lena.jpg');
orgin=rgb2gray(orgin);           
[m_o,n_o]=size(orgin);

% imshit函數返回的是灰度圖的各灰度出現的次數組成的矩陣是num*1的矩陣
% 在除以像素總數之後就變成各灰度的出現【頻率】
orgin_hist=imhist(orgin)/(m_o*n_o);

% % % % % % % % % % 讀入標準圖% % % % % % % % % % % % % % % % % % 
standard = imread('fusion/images/woman.jpg');
% standard=rgb2gray(standard);  
[m_s,n_s]=size(standard);
standard_hist=imhist(standard)/(m_s*n_s);

% 求累計頻率
startdard_value = cumsum(standard_hist)';
orgin_value = cumsum(orgin_hist)';

% 下面的for循環主要是將原始圖像中灰度映射到標準圖的灰度上去
% index的下標代表的是原始圖的灰度,值代表映射到標準圖上的灰度
for i=1:256
%     將原始圖中的各累積頻率匹配到標準圖中最接近的累積頻率上去
% 標準圖直方圖累積頻率同時減去原始圖中一個累積頻率
% 每個cell內容納一個矩陣同orgin_value一樣尺寸
    value{i}=startdard_value-orgin_value(i);
    value{i}=abs(value{i});

% 找到原始圖中累積頻率最接近標準圖的累積頻率的值和下標
% 並將下標i存到矩陣index中即index(i)
    [temp, index(i)]=min(value{i});
end

newimg=zeros(m_o,n_o);
% 因爲index元素下標從1始
for i=1:m_o
    for j=1:n_o
        newimg(i,j)=index(orgin(i,j)+1)-1;
    end
end

newimg=uint8(newimg);
% 顯示圖像
subplot(2,3,1);imshow(orgin);title('原圖');
subplot(2,3,2);imshow(standard);title('標準圖');
subplot(2,3,3);imshow(newimg);title('myself匹配到標準圖');

% 顯示灰度直方圖
subplot(2,3,4);imhist(orgin);title('原圖');
subplot(2,3,5);imhist(standard);title('標準圖');
subplot(2,3,6);imhist(newimg);title('直方圖匹配到標準圖');

結果

這裏寫圖片描述
可以看到經過直方圖規定化之後,原始圖變得和標準圖一樣的整體亮度提高了。

發佈了104 篇原創文章 · 獲贊 260 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章