1. 对给定图像 001.png (上图)进行直方图均衡化处理。画出原图及其直方图,以及直方图均衡化后的图像及其直方图。
代码实现:
(1)编写myHist函数用来计算图像的直方图:
function A = myHist(image)
% image:要统计直方图的图像
% A:直方图
A = zeros(1,256);
% 遍历矩阵
for i = 1:size(image, 1)
for j = 1:size(image, 2)
% 统计数目
A(image(i,j)+1) = A(image(i,j)+1)+1;
end
end
x = 0:255;
bar(A);
end
(2)对原图像进行均衡化:
I = imread('lena.bmp');
% 计算灰度直方图
A = myHist(I);
% cumsum函数计算出CDF
% numel函数计算像素点的总数
pdf = cumsum(A)/numel(I);
% 得出均衡化变换
eq = pdf*255;
% 根据eq将原图中的像素均衡化
I_eq = uint8(eq(double(I+1)));
% 按题目要求绘图
subplot(2,2,1);imshow(I);title('原图');
subplot(2,2,2);imshow(I_eq);title('均衡化后的图像');
subplot(2,2,3);myHist(I);title('原直方图');
subplot(2,2,4);myHist(I_eq);title('均衡化后的直方图');
结果
2. 对给定原图像 original.bmp 进行直方图匹配,匹配图像为 reference.jpg,画出原图、匹配图像、原图匹配后的图像及其各自直方图。下图分别为 originaly、reference
代码实现
% 注意:其中 myHist函数的实现与第一题相同
I1 = imread('original.bmp');
I2 = rgb2gray(imread('reference.jpg'));
% 这里发现直接读入I2会有三个维度,故使用rgb2gray函数先进行转化
% 分别得到两张图片的直方图
o_hist = myHist(I1);
r_hist = myHist(I2);
% 计算均衡分布
cdf1 = 255*cumsum(o_hist)/numel(I1);
% 计算 G(z)
cdf2 = 255*cumsum(r_hist)/numel(I2);
% 建立映射关系
maps = zeros(1, 256);
for i = 1:256
[~, index] = min(abs(cdf1(i) - cdf2));
maps(i) = index - 1;
end
% 把原图映射为匹配后的直方图
I_sp = uint8(maps(double(I1)+1));
% 画出图像
subplot(1,3,1); imshow(I1); title('原图');
subplot(1,3,2); imshow(I2); title('匹配图像');
subplot(1,3,3); imshow(I_sp); title('匹配结果');
% 画出对应的直方图
figure;
subplot(1,3,1); myHist(I1); title('原图');
subplot(1,3,2); myHist(I2); title('匹配图像');
subplot(1,3,3); myHist(I_sp); title('匹配结果');
结果
图片:
对应的直方图: