问题一: 对给定图像001.png进行直方图均衡化处理。画出原图及其直方图,以及直方图均衡化后的图像及其直方图。
代码:
I = imread('001.png');
figure,
subplot(2,2,1);
imshow(I);
title('原图');
subplot(2,2,2);
histogram(I,0:255);
title('原图的直方图');
p=count(I);%计算归一化值
s=cum(p);%计算累加归一化值
s=uint8(s*255);%计算具体值
R=transform(I,s);%灰度级映射,得到目标图像
R=uint8(R);
subplot(2,2,3);
imshow(R);
title('直方图均衡化后图像');
subplot(2,2,4);
histogram(R,0:255);
title('直方图均衡化后图像直方图');
%% 函数定义:计算图像的归一化直方图
function p = count(srcImg)
[rows,cols] = size(srcImg);
h = zeros(1,256);% 保存各灰度级对应的像素点数
for k = 0:255
bw = (srcImg==k);% 原图像中值为k的像素点变为1,值不为k的像素点变为0,矩阵bw中所有元素的和即为灰度级k对应的像素点数
h(k+1) = sum(bw(:));
end
p = h/(rows*cols);% 归一化,保存各灰度级出现的频率
end
%% 函数定义:计算图像的累积归一化直方图
function s = cum(p)
s = zeros(1,256);
for i = 1:256
if (1==i)
s(i) = p(1);
continue;
end
s(i) = s(i-1)+p(i);
end
end
%% 函数定义:灰度级映射
function dstImg = transform(srcImg,s)
[rows,cols] = size(srcImg);
dstImg = zeros(rows,cols);
for k = 0:255
bw = (srcImg==k);% 原图像中值为k的像素点变为1,值不为k的像素点变为0
dstImg(bw) = s(k+1);% 原图像中值为k的像素点变为s(k+1)
end
end
运行结果:
问题二: 对给定原图像original.bmp进行直方图匹配,匹配图像为reference.jpg,画出原图、匹配图像、原图匹配后的图像及其各自直方图。
代码:
img = imread('original.bmp');
match_img = imread('reference.jpg');
figure,
subplot(2,3,1);
imshow(img);
title('原图');
subplot(2,3,2);
imshow(match_img);
title('匹配图');
subplot(2,3,4);
P1=histogram(img,0:255);
title('原图的直方图');
subplot(2,3,5);
P2=histogram(match_img,0:255);
title('匹配图的直方图');
[M,N] = size(img);
img_hist = imhist(img);
match_img_hist = imhist(match_img);
% 下面计算每幅图像的累积概率密度分布
img_cal = cumsum(img_hist)/numel(img);
match_img_cal = cumsum(match_img_hist)/numel(match_img);
new_img = ones(M,N);
% 计算匹配结果
t=zeros(1,256);
for i=1:256
[tmp,index] = min(abs(img_cal(i)-match_img_cal));
t(i) = index-1;
end
% 遍历图像,计算每个像素对应的匹配像素值
for j=1:M
for k=1:N
new_img(j,k) = t(img(j,k)+1);
end
end
new_img=uint8(new_img);
subplot(2,3,3);
imshow(new_img);
title('原图');
subplot(2,3,6);
histogram(new_img,0:255);
title('规格化后直方图');
运行结果:
001.png
original.bmp
reference.bmp