您的位置:首页 > 编程语言 > MATLAB

Matlab 直方图均衡化

2016-11-16 09:40 162 查看

Matlab 直方图均衡化

1. 直方图均衡化介绍

直方图均衡化是图像增强的一种基本方法,可提高图像的对比度,即:将较窄的图像灰度范围以一定规则拉伸至较大(整个灰度级范围内)的范围。

目的是在得到在整个灰度级范围内具有均匀分布的图像。

实现步骤如下:

读入图像

对每个通道分别统计像素值[0,255]出现的次数。

对每个通道分别求像素值[0,255]出现的概率,得到概率直方图。

对每个通道分别求像素值[0,255]概率的前缀和,得到累计直方图。

对每个通道根据累计直方图分别求像素映射函数。

对每个通道完成每个像素点的映射。

输出直方图均衡化的图像。

2. 灰度图直方图均衡化

2.1 参考代码

RGB = imread('1.png'); % 读取彩色图
subplot(131);
imshow(RGB);
title('彩色图');

I=rgb2gray(RGB); % 将彩色图转化为灰度图
subplot(132);
imshow(I);
title('灰度图');

[R, C] = size(I);

% 统计每个像素值出现次数
cnt = zeros(1, 256);
for i = 1 : R
for j = 1 : C
cnt(1, I(i, j) + 1) = cnt(1, I(i, j) + 1) + 1;
end
end

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

% 统计每个像素值出现的概率, 得到概率直方图
for i = 1 : 256
f(1, i) = cnt(1, i) / (R * C);
end

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

% 用f数组实现像素值[0, 255]的映射。
for i = 1 : 256
f(1, i) = f(1, i) * 255;
end

% 完成每个像素点的映射
I = double(I);
for i = 1 : R
for j = 1 : C
I(i, j) = f(1, I(i, j) + 1);
end
end

% 输出
I = uint8(I);
subplot(133);
imshow(I);
title('直方图均衡化');


2.2 运行截图



3. 彩色图直方图均衡化

3.1 参考代码

RGB = imread('1.png'); % 读取彩色图
subplot(121);
imshow(RGB);
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

% 完成每个像素点的映射
I = double(I);
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(122);
imshow(RGB);
title('彩色直方图均衡化');


3.2 运行截图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: