您的位置:首页 > 其它

灰度变换增强

2015-08-22 16:30 274 查看
空域内的图像增强就是调整图像的明暗对比度,对每个像素的灰度值直接处理,一般来说包括灰度变换增强和直方图增强。下面谈谈,灰度变换增强

一、直方图

先了解直方图,即统计每个像素出现的次数,下面的代码可以实现直方图

close all;
clear;
clc;
I=imread('images.jpg');
I=rgb2gray(I);

[m,n]=size(I);
z=zeros(1,256);
for i=1:m
for j=1:n
k=I(i,j);%每个灰度值
z(k+1)=z(k+1)+1;%索引从1开始,所以是k+1
end
end
bar(z);
figure,imshow(z)


当然,Matlab图像处理工具箱提供了直接处理图像直方图的函数imhist,直接调用就可以,但是该函数只能画灰度图,实现彩色图像,可以这样进行:

R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);


再利用imhist函数,分别画出各分量的直方图;

二、灰度变换增强

1、线性灰度变换

从直方图中,我们可以了解到图像的灰度值主要的集中范围,通常如果图像的灰度值充满整个灰度级,则图像的对比度较好,如果只在某个小区间,则效果不好,因此,需要调整。比如,我们先得到一副的直方图,该图的灰度值主要集中范围是80-150,下面设Y为0-255之间的灰度值,X为80-150之间的灰度值,则满足如下公式:

(x-80)/(150-x)=(y-0)/(255-y)


那么,我们就可以得到相应的映射函数

y=255(x-80)/70


代码实现灰度值调整

I1=double(I);
J=(I1-80)*255/70;
for n=1:row
for m=1:column
if J(i,j)<0
J(i,j)=0;
end
if J(i,j)>255
J(i,j)=255;
end
end
end
figure,
imshow(uint8(J))


当然,matlab也自带了调整对比度的函数imadjust,这是一种线性变换,输入图像为double,uint8,uint16,输入与输出图像有着相同的类,默认值均为[0 1],matlab中几种调用方式为:

%J = IMADJUST(I)
%J = IMADJUST(I,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT])
%J = IMADJUST(I,[LOW_IN; HIGH_IN],[LOW_OUT;HIGH_OUT],GAMMA)
%RGB2 = IMADJUST(RGB1,...)


比如
这J1=imadjust(I,[0.2,0.5],[0,1])
,该函数意思是将灰度值小于255*0.2的灰度值设为0,将灰度值大于255*0.5的灰度值设为255,而在255*0.2—255*0.5之间的值映射到0-255;其中有种GAMMA变换的调用方式,GAMMA大于1,变暗,小于1,变明亮;此外,该函数还支持彩色图像;利用该函数时最好配合stretchlim函数使用,stretchlim能得到最佳的输入区间,然后通过imadjust调整灰度

2、分段线性变换

有时为了突出感兴趣的目标或者灰度区间,通常是扩大感兴趣的灰度范围,抑制不感兴趣的目标或者灰度区间



3、非线性灰度变换

非线性变换常见的的有对数变换,和指数变换;对数变换主要应用于动态范围的压缩,能扩展图像低灰度区域,同时压缩高灰度区域,试图像分布均匀,其公式为g=a*log(1+f),a是一个参数

f=imread('1.jpg');
g=mat2gray(log(1+double(f)))%mat2gray将值限定在[0 1]内
imshow(g)


部分参考:MATLAB图像处理实例详解(杨丹编),清华大学出版社
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: