大家好,欢迎来到IT知识分享网。
要求
对一幅灰度图像进行灰度变换,使变换后的图像的直方图与另外给定的一幅图像的直方图相匹配(近似相同)。
灰度图像:灰度图像在黑色与白色之间还有许多级的颜色深度。
原理及算法
原理参看下图,直方规范化的理论思路。
离散情况,参看下一个图,介绍实际图像中,直方规范化的步骤,看懂即可。
算法步骤:(具体可参看源码中注释)
1. 读取标准图像变成灰度图像,得到累计直方图
2. 读取原图变成灰度图像,得到累计直方图
3. 比较每个灰度级,得到映射关系:方法找到两个累积直方图距离最近的点
4. 原图灰度映射到新的灰度
测试结果
对比两个结果截图,自己写直方图匹配效果还是可观的.
源代码:
clear all;
close all;
% 扩展原图像形成中间图像的高斯滤波
orgin=imread('lena.jpg');
orgin=rgb2gray(orgin); %读入原图像
[m_o,n_o]=size(orgin);
orgin_hist=imhist(orgin)/(m_o*n_o);
standard = imread('mars_moon_phobos.jpg');% 读入标准图
standard=rgb2gray(standard);
[m_s,n_s]=size(standard);
standard_hist=imhist(standard)/(m_s*n_s);
startdard_value=[]; % 标准图累积直方
orgin_value=[]; % 原图像累积直方
for i=1:256
startdard_value=[startdard_value sum(standard_hist(1:i))];
orgin_value=[orgin_value sum(orgin_hist(1:i))];
end
for i=1:256
value{i}=startdard_value-orgin_value(i);
value{i}=abs(value{i});
[temp index(i)]=min(value{i});
end
newimg=zeros(m_o,n_o);
for i=1:m_o
for j=1:n_o
newimg(i,j)=index(orgin(i,j)+1)-1;
end
end
newimg=uint8(newimg);
subplot(2,3,1);imshow(orgin);title('原图');
subplot(2,3,2);imshow(standard);title('标准图');
subplot(2,3,3);imshow(newimg);title('myself匹配到标准图');
subplot(2,3,4);imhist(orgin);
title('原图');
subplot(2,3,5);imhist(standard);
title('标准图');
subplot(2,3,6);imhist(newimg);
title('myself匹配到标准图');
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24152.html