matlab实现直方图规定化

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

要求

对一幅灰度图像进行灰度变换,使变换后的图像的直方图与另外给定的一幅图像的直方图相匹配(近似相同)。

灰度图像:灰度图像在黑色与白色之间还有许多级的颜色深度。

原理及算法

原理参看下图,直方规范化的理论思路。

离散情况,参看下一个图,介绍实际图像中,直方规范化的步骤,看懂即可。

算法步骤:(具体可参看源码中注释)

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});endnewimg=zeros(m_o,n_o);for i=1:m_o    for j=1:n_o        newimg(i,j)=index(orgin(i,j)+1)-1;    endendnewimg=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匹配到标准图');

点这里可以跳转到人工智能网站

发表评论