图像增强之空域变换增强(2)

     上一次内容是讲空域变换增强里的直接灰度调整方法,这次讲另外两种:直方图处理和图像间的代数运算   。

一、直方图处理

1.直方图均衡化

基本思想:把原始图像的直方图变换成均匀分布的形式,增加图像灰度值的动态范围,从而达到增强图像整体对比度的效果。本质是扩大了量化间隔,而量化级别反而减少了

作用:把给定图像的直方图分布改成均匀直方图的分布,使输出像素灰度的概率密度均匀分布。直观地说,会导致对比度增加。

局限性:具体增强效果不易控制,处理的结果总是得到全局均衡化的直方图。

缺点:

a.变换后图像的灰度级减少,某些细节消失
b.某些图像,如直方图有高峰,经处理后对比度过分增强
c.原来灰度不同的像素经处理后可能变得相同,形成一片相同灰度的区域,各区域之间有明显的边界,从而出现了伪轮廓。

这里我们用histeq函数实现对输入图像的直方图均衡化。

语法格式:

1) J=histeq(I);     2) [J,T]=histeq(I),T为转移函数,即由I变换成J的函数

例子:

I=imread('tire.tif');
J=histeq(I);   %进行直方图均衡化
subplot(2,2,1);
imshow(I);
title('原始图像');
subplot(2,2,2);
imshow(J);   
title('直方图均衡图像');
subplot(2,2,3);
imhist(I);
title('原始图像直方图');
subplot(2,2,4);
imhist(J);
title('均衡化图像直方图');   
I=imread('tire.tif');
[J,T]=histeq(I);
figure,plot((0:255)/255,T);   %绘制转移函数的变换曲线

运行后如下:



 



 

这里注意下最后一句:figure,plot((0:255)/255,T);在有些教材里面,打错成了:

figure,plot((0:255/255),T);

运行后会报错:


2.gamma校正

gamma为何物?其实在前面我们已经提过了,在讲用imadjust实现灰度级变换的时候。

语法格式:J=imadjust(I,[low_in high_in],[low_out high_out],gamma)

gamma取值决定了映射的方式,即决定了对图像的变换是进行增强低灰度还是增强高灰度。取值范围是0到无穷。默认情况下gamma参数为1,采用的是线性变换。 

当gamma<1,输出像素灰度值比原来;(变亮)
当gamma>1,输出像素灰度值比原来。(变暗)
 

依旧举个例子:

[X,map]=imread('1.bmp');    %X是索引图像数据矩阵,map是颜色图,文件filename读取到X的map向量中,如果要图片显示,imshow(X.map)就可以了
I=ind2gray(X,map);          %将索引图像转化为灰度图像        
J1=imadjust(I,[],[],0.5);   %gamma取值为0.5的变换
J2=imadjust(I,[],[],1);     %gamma取值为1的变换
J3=imadjust(I,[],[],2);     %gamma取值为2的变换
subplot(2,2,1);imshow(I);title('原始图像');
subplot(2,2,2);imshow(J1);title('gamma为0.5的变换');
subplot(2,2,3);imshow(J2);title('gamma为1的变换');
subplot(2,2,4);imshow(J3);title('gamma为2的变换');

 

 

 如此我们就可以仅仅通过改变gamma控制图像的明亮,而不必扩大灰度值的范围。

3.直方图规定化

前面提到了直方图均衡化,它是对图像的灰度值作了全局均匀化处理,而直方图规定化则是有选择地增强某个灰度值范围的对比度,即可人为地控制灰度值的分布。

这里来我们要用到histeq的一种语法格式:J=histeq(I,hgram)

注:hgram是用户指定的向量,规定将原始图像I的直方图近似变换成hgram,每一个元素都在[0,1]中。

例:

I=imread('tire.tif');
hgram=0:255;         %直方图变换的规定化函数
J=histeq(I,hgram);   %将图像向指定的直方图变换

二、图像间的代数运算

图像间其实也可以像数字那样做加减乘除的运算,但是由于结果容易超出数据类型允许的范围,故采取相应的截取规则:

(1)超出数据类型运行的范围的值用数据类型的最大值代替;分数的结果采用四舍五入的方法取整。
(2)使用这些函数的时候,不用进行数据类型的转换,这些函数可以接受uint8和unit16数据类型,并返回相同格式的图像结果。
(3)可以使用基本算数运算符来进行图像的算数操作运算,但是不同于函数,必须在运算前将图像转换为适合进行算数运算的双精度数据类型
(4)任何一个代数运算,都必须保证输入图像的大小相等,且数据类型一致。

同时还要知道,运算的两个对象必须是相同类型,而且是相同大小!!

1.相加运算

相加运算的作用非常多,既能使图像亮度增加,又能使图像叠加,还能够降低噪声。

用到的函数为imadd函数,语法格式为K=imadd(I,J,'unit8');

例1:

%使图像亮度增加

RGB=imread('2.jpg');
RGB2=imadd(RGB,50);     %对图像的每个像素加上一个常数

例2:

%将两个图像叠加在一起

I=imread('tire.tif');
J=imread('cameraman.tif');
K=imadd(I,J,'unit8');   %实现两幅图像的叠加
imshow(k,[]);

例3: 

首先先解释下降噪的原理,图像相加运算是采取求平均值降噪的。在求平均值的过程中,图像的静止部分不会改变;而对每一副图像,各不相同的噪声图案则累积得很慢,通过对这些图像求平均值,可以有效地降低随机噪声的影响。

下面我们先对原始图像添加高斯噪声,然后再通过求平均值降噪。

代码如下:

clear;                     %图像代数运算有相同大小,所以先清除变量
I=imread('1.bmp');
subplot(2,2,1);
imshow(I);title('原始图像');
[m,n]=size(I);
J(m,n)=0;
J=double(J);
X=imnoise(I,'gaussian');Y=double(X);  %加入高斯噪声
subplot(2,2,2);
imshow(X);title('加噪图像一');
J=J+Y/10;
X=imnoise(I,'gaussian');Y=double(X);
subplot(2,2,3);
imshow(X);title('加噪图像二');
J=J+Y/10;
for i=1:8                         %循环运算,对噪声的图像取平均值
    X=imnoise(I,'gaussian');
    Y=double(X);
    J=J+Y/10;
end
subplot(2,2,4);
imshow(mat2gray(J));
title('10幅噪声图像平均结果');

不信,你看


 
 2.相减运算

相减运算的作用也不少,取出一幅图像中不需要的加性团,也可以用于检测同一场景的两幅图像间的变化。

注:加性团可能是缓慢变化的背景阴影、周期性的噪声,或在图像上每个像素处均一致的附加污染等。

相减运算用的函数是imsubtract函数,语法格式为I3=imsubtract(I,I2); 

例:

%去掉背景亮度图像
clear,close all
I=imread('1.bmp');
subplot(1,2,1);
imshow(I);
title('原始图像');
background=imopen(I,strel('disk',15));  %得到背景图像
I2=imsubtract(I,background);  %得到代数减法去掉图像中的背景图像
subplot(1,2,2);
imshow(I2);
title('去除背景的图像');



 

值得提醒的是:进行减法运算时,可能导致某些像素值结果为负数。此时imsubtract函数会自动将这些赋为0。这里你也可以用imasbdiff函数,它计算的是两幅图像像素差值的绝对值。

乘除法就不作介绍了,空域变换增强部分如此就大致讲完了。

猜你喜欢

转载自459838660.iteye.com/blog/2197313