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);

猜你喜欢

转载自www.cnblogs.com/sexlyboy/p/10057816.html
今日推荐