1. 程式人生 > >matlab直方圖均衡化

matlab直方圖均衡化

% 彩色影象直方圖均衡化函式


% ----------------------
% 實現步驟如下:
% 
% 讀入影象
% 對每個通道分別統計畫素值[0,255]出現的次數。
% 對每個通道分別求畫素值[0,255]出現的概率,得到概率直方圖。
% 對每個通道分別求畫素值[0,255]概率的字首和,得到累計直方圖。
% 對每個通道根據累計直方圖分別求畫素對映函式。
% 對每個通道完成每個畫素點的對映。
% 輸出直方圖均衡化的影象。
% --------------------- 


function [ RGB ] = histEquSelf(image)
%UNTITLED9 此處顯示有關此函式的摘要
%   此處顯示詳細說明
RGB = image;

subplot(221),imshow(RGB),title('原圖');
subplot(222), imhist(RGB,64) ,title('原圖直方圖');

[R, C, K] = size(RGB); % 新增的K表示顏色通道數

% 統計每個畫素值出現次數
cnt = zeros(K, 256);
for i = 1 : R
    for j = 1 : C
        for k = 1 : K
            cnt(k, RGB(i, j, k) + 1) = cnt(k, RGB(i, j, k) + 1) + 1;
        end
    end
end

f = zeros(3, 256);
f = double(f); cnt = double(cnt);

% 統計每個畫素值出現的概率, 得到概率直方圖
for k = 1 : K
    for i = 1 : 256
        f(k, i) = cnt(k, i) / (R * C);
    end
end

% 求累計概率,得到累計直方圖
for k = 1 : K
    for i = 2 : 256
        f(k, i) = f(k, i - 1) + f(k, i);
    end
end

% 用f陣列實現畫素值[0, 255]的對映。 
for k = 1 : K
    for i = 1 : 256
        f(k, i) = f(k, i) * 255;
    end
end

% 完成每個畫素點的對映
RGB = double(RGB);
for i = 1 : R
    for j = 1 : C
        for k = 1 : K
            RGB(i, j, k) = f(k, RGB(i, j, k) + 1);
        end
    end
end

% 輸出
RGB = uint8(RGB);
subplot(223);
imshow(RGB);
title('直方圖均衡化');
subplot(224), imhist(RGB,64) ,title('均衡化後直方圖');




end

測試結果圖:


測試程式碼:

A = imread('lena.jpg');
histEquSelf(A);