空域图像增强
图像增强是为了增强图像中用户感兴趣的某些特征。在一般情况下为了得到一个满意的图像处理结果,需要根据所要达到的处理目标和原图像的实际情况采取一系列处理方法,这些处理过程都属于图像增强的范畴。可以说,一切处理原始图像使其适合于特定应用的手段都可以称为图像增强。
图像增强根据其处理域的不同可以分为空域图像增强和变换域图像增强。
1、空域增强的概述
所谓空间域是指图像本身,在空间域内处理图像的方法是直接对图像的像素进行处理。其操作的本质是:
G` ( x , y ) = f( G( x , y ) )
接下来详细介绍图像的算术运算、灰度变换、直方图运算以及空间滤波的知识。
2、图像算术增强
(1)图像加减增强
图像加减增强属于图像的代数运算,它指的是对两幅或者两副以上输入图像的对应像素进行加减运算。
a. 图像相加
将多幅图像的对应像素相加得到一副新图像的操作。一般表达式为:
Z(x,y)=a1*X1(x,y)+a2*X2(x,y)+…+an*Xn(x,y)+c ………….. (ⅰ)
Z(x,y)为结果图像,Xn(x,y)为进行加法运算的图像,an为进行图像相加运算时权重,c为一常数。
应用:
(1) 把同一景物的多重影像相加求平均,可降低图像中的随机噪声
(2) 在图像上叠加上指示框,说明文字等信息
(3) 对图像进行特定的补偿,如增强亮度等
b. 图像相减
图像相减是指对两幅图像的对应像素相减得到一副新图像。其公式为:
Z(x,y) =X1(x,y) – X2(x,y)
很多时候为了得到非负图像像素值,会在结果上求绝对值。
Z(x,y) =|X1(x,y) – X2(x,y)|
应用:
(1)在背景容易获得时,直接减出图像背景
(2)对同一景物的不同时间拍摄的图像或同一景物在不同时间的图像进行减法运算,可用来减去背景,如刑事中提取指纹,在实时运动中进行运动检测
(3)将处理前后的两幅图像进行对比,找出处理效果
(4)进行梯度运算,通过灰度值变化大的地方找到物体的边界
c. MATLAB实现
MATLAB中涉及到的函数有imadd、imlincomb、imsubstract、imabsdiff函数。
(1) imadd函数,可将两幅图像相加或在图像上加上一个常量。
Z = imadd(X,Y);
其中,X为图像数据矩阵,Y可以是一个与X格式类型完全相同(维数和数据类型)的图像数据矩阵或者是一个double类的数值。Z的数据类型与X一样,但当X,Y数据类型都是double时,返回值可能超出1.
① 利用imadd函数对图像亮度进行补偿
>>X =imread('D:\Mymatlab\picture\6\moon.tif');
>>Z = imadd(X,50);
>> imshow(X),figure,imshow(Z);
② 利用imadd函数完成字符叠加
>> C = imread('D:\Mymatlab\picture\6\cameraman.tif');
>> D = imread('D:\Mymatlab\picture\6\rice.png');
>> E = imadd(C,D)
(2) Imlincomb函数
该函数可以完成式(ⅰ)一般加法操作,调用形式如下:
Imlincomb(k1,x1,k2,x2,,,kn,xn,K,output_class)
其中,k1,k2,kn为合并时各图像的权重,数据类型是double,x1,x2,xn是待合并的图像,这些图像数据类型格式必须相同,K是double类型,output_class为指定最终输出类型,如‘uint8’等。该函数执行过程中不丢失数据精度。
>>E = imlincomb(0.3,C,0.7,D);
>>imshow(C),figure,imshow(D),figure,imshow(E)
Imlincomb不容易丢失数据
(3) Imsubtract函数
此函数能完成 式
Z(x,y) =X1(x,y) – X2(x,y)
的功能,调用形式如下:
Z = imsubtract(X,Y)
其中,x是图像矩阵,可以是M*N的灰度图像矩阵,也可以是M*N*3的RGB图像矩阵。Y可以是与X格式类型完全相同的图像数据矩阵或者是一个double类型的数值。函数返回值Z的数据类型与X相同,除非X是logical类型,返回值Z是double类型。
在X,Y的数据类型是整数时,返回值会进行饱和处理,保证不溢出;但是当X,Y的数据类型是double时,返回值可能超过[0,1]的范围,即,相减为负数时,若X的数据类型是整数,则Z返回的结果是0,若X的数据类型是double时,Z的结果是负数。
例:利用函数imsubtract来消除背景。
>>X = imread('D:\Mymatlab\picture\6\rice.png');
>>Y = imopen(X,strel('disk',15)); %形态学开运算,剔出图像目标,得到图像背景
>> Z = imsubtract(X,Y)
>>imshow(X),figure,imshow(Y),figure,imshow(Z)
上图,X是原始图像,图像上部偏亮,下部偏暗,这会给以后的处理带来麻烦,比如图像分割时无法使用准确单一的阈值来分割图像。Y是通过形态学处理得到的背景亮度,Y能很好地体现背景的亮度变化。Z是原始图像减去背景色的结果,由于出去北京的亮度变化,剩下的米粒的亮度更加统一。
(4)imabsdiff函数
Imabsdiff函数能完成式
Z(x,y) =|X1(x,y) – X2(x,y)|
的功能,其调用形式如下:
Z =imabsdiff(X,Y)
例:大家来找茬。
图1 图2
用图2减去图1,
>> A =imread('D:\Mymatlab\picture\6\1.jpg');
>> B =imread('D:\Mymatlab\picture\6\2.jpg');
>> A = rgb2gray(A);
>> B = rgb2gray(B);
>> Z= imabsdiff(A,B); %A,B图像的大小要一样
>> imshow(Z)
2、图像乘除增强
图像乘除指将两幅图像对应像素进行乘除。
a、 图像相乘操作
将两幅图像对应像素分别相乘得到一幅图像的操作,一般表达式为:
Z(x,y) = X1(x,y) * X2(x,y)
Z是结果图像,X2可以是一个常数。
图像相乘引入非线性运算,应用范围:
(1) 求一副图像各像素点的平方值,使图像高亮区进一步增强,低亮区进一步减弱。
(2) 对图像亮度进行补偿
(3) 图像掩膜处理
b、 图像相处操作
图像相除是指将两幅图像的对应像素分别相除得到一副新图像。一般表达式为:
Z(x,y) = X1 (x.y)/X2(x.y)
其中,Z为结果图像,X2可以是一个常数。
c、 MATLAB实现
注:进行乘除操作时,由于数据易丢失,应尽量使用double类型。
(1)immultiply函数
该函数可将X和Y矩阵中的对应像素分别相乘,调用格式如下:
Z= immultiply(X,Y)
其中,x是图像矩阵,可以是M*N的灰度图像矩阵,也可以是M*N*3的RGB图像矩阵。Y可以是与X格式类型完全相同的图像数据矩阵或者是一个double类型的数值。函数返回值Z的数据类型与X相同。
利用immultiply可以将每个像素进行平方处理,可使高亮的区域更亮,低亮区进一步减弱。
>> X = imread('D:\Mymatlab\picture\7\cameraman.tif');
>> X = im2double(X); %将图像的数据类型转换为double类型
>> Z = immultiply(X,X);
>>imshow(X),figure,imhist(X),figure,imshow(Z),figure,imhist(Z)
从图像中可以明显看到,亮区域被展开,暗区域进一步压缩。
(2)imdicide函数
该函数可以将X和Y矩阵中对应的像素分别相除,调用格式如下:
Z= imdivide(X,Y)
其中,x是图像矩阵,可以是M*N的灰度图像矩阵,也可以是M*N*3的RGB图像矩阵。Y可以是与X格式类型完全相同的图像数据矩阵或者是一个double类型的数值。函数返回值Z的数据类型与X相同。
下面给出使用imdivide函数对图像进行归一化的实例。通过归一化操作可将图像直方图有效拉伸,使对比度增强。
X =imread('D:\Mymatlab\picture\9\liftingbody.png');
imshow(X),figure,imhist(X)
X = double(X);
maxv = max(X(:));%计算最大灰度
Z = imdivide(X,maxv);
figure,imshow(Z),figure,imhist(Z)
由直方图可以看出,图像的灰度得到了拉伸,进入到了[0,1]之间。
3、图像取反增强
(1)取补操作是指对原图像的每个像素都取补,即用像素的数据类型的最大值减去像素值,得到结果。变换公式为:
Z(x,y) =  ̄X(x,y)
取反操作简单,用途为:
a. 将目标和背景调换,即将原先的目标变成背景,将原先的背景变成目标
b. 将相机底片图像进行取补,可得到真实图像。
(2)MATLAB实现
MATLAB使用imcomplement函数对图像实现取补操作,调用格式为:
Z = imcomplement(X)
其中,X是二值图像数据矩阵,输出值Z与X拥有相同的数据格式。如果X是logical类型,则函数进行0-1的互换;如果X 是uint8,uint16等,则函数用该数据类型的最大值减去输入像素值;如果X为double类型,则函数用1减去输入像素值。
>> X=imread('D:\Mymatlab\picture\be.jpg');
>> Z =imcomplement(X);
>>imshow(X),figure,imshow(Z)
4、图像逻辑运算增强
(1)逻辑运算原理
逻辑运算主要针对对二值图像,它指的是对两幅或多幅二值图像的对应位置的像素进行逻辑操作,操作包括与、或、非、异或、同或,其公式分别表示为:
Z(x,y) = X(x,y) and Y(x,y)
Z(x,y) = X(x,y) or Y(x,y)
Z(x,y) = not X(x,y)
Z(x,y) = X(x,y) xor Y(x,y)
Z(x,y) = X(x,y) == Y(x,y)
逻辑运算在图像形态学处理、图像分割和图像分析等领域有相当广泛的应用,可以说有二值图像的地方就一定能用到逻辑运算。
(2)MATLAB实现
MATLAB针对与、或、非、异或、同或的逻辑运算,对应的函数分别是and ,or ,not ,xor ,==。
例: Z = and(X,Y)
其中,X,Y,Z都是二值图像矩阵。Or,not ,xor 函数调用形式与此相同。
同或运算的形式如下:
Z= (X ==Y)
其中,X,Y,Z都是二值图像矩阵。
>> X =imread('D:\Mymatlab\picture\tian.jpg');
>> X = rgb2gray(X);
>> imshow(X);
>> mask1 = roicolor(X,0,110);
>> mask2 =roipoly(X);
>> mask =and(mask1,mask2);
>> figure,imshow(mask1),figure,imshow(mask2),figure,imshow(mask)
>> X = im2double(X);
>> mask = double(mask);
>> Z = immultiply(X,mask);
>> figure,imshow(Z)
该程序用roicolor得到灰度值在[0,110]的范围内的区域的二值掩膜,mask1,mask1中为1(白色)的元素表示其对应的图像像素的灰度值落在[0,110]的范围之内,仅使用此掩膜还不足以完全去掉周围的环境,所以使用roiploy函数得到目标的大致区域掩膜mask2,这个掩膜是用户自己在图像上选择。对mask1和mask2进行逻辑与操作即可得到最终的二值掩膜mask.
原图 灰度要求满足的区域掩膜
用户选择的区域掩膜 分离出来的图像