MATLAB--数字图像处理图像直⽅图规定化
直⽅图规定化
原理:
所谓直⽅图规定化,就是通过⼀个灰度映像函数,将原灰度直⽅图改造成所希望的直⽅图。说的通俗⼀点就是,原图像的灰度是从0~255的,其分布是随机的,在⼀些情况下,我们可能需要⼀些特定的灰度值,⽐如我们只需要灰度值为0 3 40 240 255 这些值,除此之外的灰度值我们不需要,那么从原图像到我们需要的图像就可以理解成图像的规定化。
具体事例:
左图是原图像的灰度直⽅图,右图是我们需要的图(这⾥的需要是指需要灰度由原来的0~7变成规定的1 3 6,规定化后图像的纵坐标是会变的,这⾥只需要横坐标吻合就⾏!)
规定化后的图像(横坐标和规定⼀样,纵坐标是会变化的):
实现步骤:
1. 分别计算出原图像和规定图像的累加直⽅图
2. 利⽤SML或者GML映射灰度值
3. 利⽤更新后的映射表转换原图像的灰度值
看完之后,应该还是不懂?那么直接实战⼀题!题⽬见下图:
解题步骤:
1. 这⾥是直接给出的原图像各灰度的像素个数,为了得到我们需要的直⽅累加图(其实是概率累加值,当然也可以不⽤概率,直接⽤像
素点数也⾏,就是看起来数字⽐较⼤),需要先算出原图像各灰度的概率(占总像素个数的⽐例),然后在计算累加值
2. 根据给出的规定直⽅图,同样的⽅法计算累加直⽅图,见下图
3. 利⽤SML映射规则得出结果
4. 利⽤映射变化表,更新原图像
提⽰:
这⾥可能不懂SML映射规则,我说说⾃⼰简单的理解(⾃⼰也可以⾃⾏百度):
SML就是单映射,这⾥我们关注原图累加直⽅图和规定累加直⽅图,所谓SML,就是从原图累加直⽅图开始,在规定累加直⽅图寻和⾃⼰最接近的值,然后把它的灰度值变成⾃⼰的。具体来说,原图第⼀个累加概率是0.19,在规定累加直⽅图中,最接近它的就是0.15,那么原图的灰度0变成规定的3,第⼆个累加概率是0.44,最接近规定累加直⽅图的0.35,所以由1变成4,同理,依次遍历完原图累加直⽅图的概率就⾏,在规定累加直⽅图到最靠近⾃⼰的值,最后进⾏灰度变化。
SML规则懂了,GML规则也就好理解了(GML规则其实编程更难):
SML中,我们是依次遍历原图累加直⽅图,在规定累加直⽅图寻最靠近⾃⼰的。在GML(组映射)中,就变成了依次从规定累加直⽅图中,对⽐原图累加直⽅图,也是到最靠近的值,进⾏灰度变换,
只是这⾥的变换规则变了。
具体举例来说,从上图看,这⾥我们这⾥从规定累加直⽅图的0.15看,前⾯的0其实不⽤看,再从原始累加直⽅图到最接近0.15的值,是0.19,那么0.19对应和它对应灰度值前⾯的灰度变成规定累加直
⽅图中0.15所对应的灰度值:3;第⼆个看规定累加直⽅图的0.35,靠近原图的0.44,那么原图的1变成4(假设这⾥0.44对应的原图灰度值为4,那么在前⼀个不为0和4之间变成4)
这⾥有的不好理解,举个例⼦:
原数组:1 0 0 2 0 3 0 0 0 4 0 0 6
GML映射变化规则的⽬标数组就是:1 2 2 2 3 3 4 4 4 4 6 6 6
解释:1前⾯的数变为1,1和2之间变成2,2和3之间变成3,3和4之间变成4,4和6之间变成6,简单的说就是变0变成后⾯最靠近的⼀个不为0的数。(这⾥算法⾃⼰需要掌握,即如何从原数组变成⽬标数组,这⾥先给个C++的验证算法)
#include<iostream>
using namespace std;
int main()
{
int t[8]={2,0,1,0,3,0,0,6};
int i,j;
int tem;
int flag=0;
for (i=0;i<8;i++)
{
if(t[i]==0)
{
for(j=i;j<8;j++)
{
if(t[j]!=0)
{
tem=t[j];
break;}
}
t[i]=tem;
}
}
for(i=0;i<8;i++)
cout<<t[i]<<" ";
return 0;
}
如果还是不懂SML和GML规则的话?那⾃⼰根据下⾯两种图⽚再理解理解吧。
MATLAB实战
原理懂了,肯定就是要开始实战了啊!
这⾥我先上全部代码:
t=imread('a1.jpg')
%获取图⽚的长和宽,⽤于计算总像素,即m*n
[m,n]=size(t);
[m,n]=size(t);
%n_1 这⾥是先统计各灰度的像素数,后⾯会变换为概率
n_1=zeros(1,256);
%统计各灰度的像素数
for i=1:m
for j=1:n
n_1(t(i,j)+1)=n_1(t(i,j)+1)+1;
end
end
%转换为概率
n_1=n_1/m/n; %计算各个灰度级的概率
matlab直方图%p_1  记录原图的累积直⽅图概率
p_1=zeros(1,256);
%p_1 计算原始累积直⽅图的概率
for i=1:256
for j=1:i
p_1(i)=p_1(i)+n_1(j);
end
end
%n_2  规定直⽅图的灰度概率分布
n_2=[zeros(1,50),0.1,zeros(1,50),0.2,zeros(1,50),0.3,zeros(1,50),0.2,zeros(1,20),0.1,zeros(1,30),0.1];
%p_2 记录规定直⽅图的累积概率
p_2=zeros(1,256);
% 计算规定直⽅图累积概率
for i=1:256
for j=1:i
p_2(i)=p_2(i)+n_2(j);
end
end
%SML映射算法
data_1=zeros(1,256);%data_1 SML映射表
for i=1:256
min=abs(p_1(i)-p_2(1));
for j=2:256
if  abs(p_1(i)-p_2(j))<min
min=abs(p_1(i)-p_2(j));
data_1(i)=j-1;
end
end
end
%GML
data_2=zeros(1,256); %data_2记录GML映射表
for i=1:256
if n_2(i)~=0
tem=1;
min=abs(p_2(i)-p_1(1));
for j=2:256
if abs(p_2(i)-p_1(j))<min
min=abs(p_2(i)-p_1(j));
tem=j;
end
end
data_2(tem)=i-1;
end

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。