直方图均衡化和规格化

问题一: 对给定图像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
运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wqWideyD-1678886677931)(C:\Users\zdsss\AppData\Roaming\Typora\typora-user-images\image-20230310111718910.png)]

问题二: 对给定原图像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
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值