KeeneWoo's cnblogs

"Hello World !!!"

导航

一些图像处理函数用法(精华)

Posted on 2011-04-14 14:51  KeeneWoo  阅读(8732)  评论(0编辑  收藏  举报

% imshow
imshow是用来显示图片的,如
>> I = imread('moon.tif');
>> figure,imshow(I);

而有时为了数据处理,要把读取的图片信息转化为更高的精度,
>> I = double(imread('moon.tif'));

为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型。如果直接运行imshow(I),我们会发现显示的是一个白色的图像。这是因为imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0~255范围。而经过运算的范围在0-255之间的double型数据就被不正常得显示为白色图像了。
有两个解决方法:                 
1> imshow(I/256); -----------将图像矩阵转化到0-1之间                 
2> imshow(I,[]);   -----------自动调整数据的范围以便于显示.
从实验结果看两种方法都解决了问题,但是从显示的图像看,第二种方法显示的图像明暗黑白对比的强烈些!

+++++++++++++++++++++++++++++++++++++++
IMSHOW(I) displays the grayscale image I.

IMSHOW(I,[LOW HIGH]) displays the grayscale image I, specifying the display range for I in [LOW HIGH]. The value LOW (and any value less than LOW) displays as black, the value HIGH (and any value greater than HIGH) displays as white. Values in between are displayed as intermediate shades of gray,using the default number of gray levels. 
If you use an empty matrix ([]) for[LOW HIGH], IMSHOW uses [min(I(:)) max(I(:))]; that is, the minimum value in I is displayed as black, and the maximum value is displayed as white.

+++++++++++++++++++++++++++++++++++++++
图像为y,为何用imshow(uint8(y))和imshow(y,[])时的图像显示结果不同?

回答:
imshow(uint8(y))是按照256级灰度显示y得绝对数据。0表示黑色,255表示白色,y中大于255的值强制为255。 
imshow(y,[]),将y中的最小值看作0(black),最大值看作255(white) -->增加图像的对比度。 
所以两者不同。

% padarray
功能:填充图像或填充数组
用法:B = padarray(A,padsize,padval,direction)

      A为输入图像,B为填充后的图像,
      padsize给出了给出了填充的行数和列数,通常用[r c]来表示,
      padval和direction分别表示填充方法和方向。
它们的具体值和描述如下:
   padval:'symmetric' 表示图像大小通过围绕边界进行镜像反射来扩展;
                       'replicate' 表示图像大小通过复制外边界中的值来扩展;
                       'circular' 图像大小通过将图像看成是一个二维周期函数的一个周期来进行扩展。
      direction:'pre' 表示在每一维的第一个元素前填充;
                        'post' 表示在每一维的最后一个元素后填充;
                       'both' 表示在每一维的第一个元素前和最后一个元素后填充,此项为默认值。
若参量中不包括direction,则默认值为'both';若参量中不包含padval,则默认用零来填充。若参量中不包括任何参数,则默认填充为零且方向为'both'。在计算结束时,图像会被修剪成原始大小。
举例:
      A = [1 2; 3 4];
      B = padarray(A,[3 2],'replicate','post')

imfinfo
imfinfo函数用于读取图象文件的有关信息,其语法格式
imfinfo(filename,fmt)
imfinfo函数返回一个结构info,它反映了该图象的各方面信息,其主要数据包括:文件名(路径)、文件格式、文件格式版本号、文件的修改时间、文件的大小、文件的长度、文件的宽度、每个像素的位数、图象的类型等。

imhist
MATLAB图象处理工具箱提供了imhist函数来计算和显示图象的直方图,imhist函数的语法格式为:
imhist(I,n)
imhist(X,map)
其中imhist(I,n)计算和显示灰度图象I的直方图,n为指定的灰度级数目,默认值为256。imhist(X,map)计算和显示索引色图象X的直方图,map为调色板。
例:
I = imread('rice.tif');
imshow(I)
figure, imhist(I)

imadjust —>对比度增强
   如果原图象f(x,y)的灰度范围是[m,M],我们希望调整后的图象g(x,y)的灰度范围是[n,N],那么下述变换就可以实现这一要求。
MATLAB图象处理工具箱中提供的imadjust函数,可以实现上述的线性变换对比度增强。Imadjust函数的语法格式为:
J = imadjust(I,[low_in high_in],[low_out high_out])
J = imadjust(I,[low_in high_in],[low_out high_out])返回图象I经过直方图调整后的图象J,[low_in high_in]为原图象中要变换的灰度范
围,[low_out high_out]指定了变换后的灰度范围。
例:
I = imread('pout.tif');
J = imadjust(I,[0.3 0.7],[]);
imshow(I), figure, imshow(J)

imresize
几何运算可改变图像中各物体之间的空间关系。这种运算可以被看成是将(各)物体在图像内移动。一个几何运算需要两个独立的算法。首先,需要一个算法来定义空间变换本身,用它来描述每个像素如何从其初始位置“移动”到终止位置,即每个像素的“运动”。同时,还需要一个用于灰度插值的算法,这是因为,在一般情况下,输入图像的位置坐标(x,y)为整数,而输出图像的位置坐标为非整数,反过来也如此。因此插值就是对变换之后的整数坐标位置的像素值进行估计。MATLAB提供了一些函数实现这些功能。
   插值是常用的数学运算,通常是利用曲线拟合的方法,通过离散的采样点建立一个连续函数来逼近真实的曲线,用这个重建的函数便可以求出任意位置的函数值。
   最近邻插值是最简便的插值,在这种算法中,每一个插值输出像素的值就是在输入图像中与其最临近的采样点的值。最近邻插值是工具箱函数默认使用的插值方法,而且这种插值方法的运算量非常小。当图像中包含像素之间灰度级变化的细微结构时,最近邻插值法会在图像中产生人工的痕迹。
   双线性插值法的输出像素值是它在输入图像中2×2领域采样点的平均值,它根据某像素周围4个像素的灰度值在水平和垂直两个方向上对其插值。
   双三次插值的插值核为三次函数,其插值邻域的大小为4×4。它的插值效果比较好,但相应的计算量也比较大。
   MATLAB图像处理工具箱中的函数imresize可以用上述的3种方法对图像进行插值缩放,如果不指定插值方法,则默认为最邻近插值法。
Imresize函数的语法格式为:
B = imresize(A,m,method)
   参数method用于指定插值的方法,可选用的值为'nearest'(最邻近法),'bilinear'(双线性插值),'bicubic'(双三次插值),默认为'nearest'。
B = imresize(A,m,method)返回原图A的m倍放大的图像(m小于1时效果是缩小)。

imnoise
在MATLAB中提供了给图像加入噪声的函数imnoise
imnoise的语法格式为
J = imnoise(I,type)
J = imnoise(I,type,parameters)
其中J = imnoise(I,type)返回对原始图像I添加典型噪声的有噪图像J。
参数type和parameters用于确定噪声的类型和相应的参数。
下面的命令是对图像eight.tif分别加入高斯噪声、椒盐噪声和乘性噪声,其结果如图所示:
例:
I=imread('eight.tif');
J1=imnoise(I,'gaussian',0,0.02);
J2=imnoise(I,'salt & pepper',0.02);
J3=imnoise(I,'speckle',0.02);
subplot(2,2,1),imshow(I),title('原图像');
subplot(2,2,2),imshow(J1),title('加高斯噪声');
subplot(2,2,3),imshow(J2),title('加椒盐噪声');
subplot(2,2,4),imshow(J3),title('加乘性噪声');

MATLAB提供的快速傅立叶变换函数
(1)fft2

fft2函数用于计算二维快速傅立叶变换,其语法格式为:
B = fft2(I)
B = fft2(I)返回图象I的二维fft变换矩阵,输入图象I和输出图象B大小相同。
例如,计算图象的二维傅立叶变换,并显示其幅值的结果,其命令格式如下
load imdemos saturn2
imshow(saturn2)
B = fftshift(fft2(saturn2));
imshow(log(abs(B)),[],'notruesize')
(2)fftshift
MATLAB提供的fftshift函数用于将变换后的图象频谱中心从矩阵的原点移到矩阵的中心,其语法格式为:
  B = fftshift(I)
对于矩阵I,B = fftshift(I)将I的一、三象限和二、四象限进行互换。
(3)ifft2
ifft2函数用于计算图象的二维傅立叶反变换,其语法格式为:
B = ifft2(I)
B = ifft2(A)返回图象I的二维傅立叶反变换矩阵,输入图象I和输出图象B大小相同。其语法格式含义与fft2函数的语法格式相同,可以参考fft2函数的说明。

conv2
MATLAB中提供了卷积运算的函数命令conv2,其语法格式为:
  C = conv2(A,B)
C = conv2(A,B)返回矩阵A和B的二维卷积C。若A为ma×na的矩阵,B为mb×nb的矩阵,则C的大小为(ma+mb+1)×(na+nb+1)。
例:
A=magic(5)
A =
  17  24  1   8  15
  23  5   7  14  16
   4    6  13  20  22
    10  12    19  21  3
  11 18    25   2   9
>> B=[1 2 1 ;0 2 0;3 1 3]
B =
   1   2   1
   0   2   0
   3   1   3
>> C=conv2(A,B)
C =
  17  58  66  34  32  38  15
  23  85  88  35  67  76  16
  55  149  117  163  159  135  67
  79  78  160  161  187  129  51
  23  82  153  199  205  108  75
  30  68  135  168  91  84   9
  33  65  126  85  104  15  27

imfilter
语法:g=imfilter(f, w, filtering_mode, boundary_options, size_options)
说明:此函数用指定的模板实现对指定图像的空间滤波。f为待进行空间滤波的图像,w为滤波模板


滤波类型(filtering_mode)
'corr'    滤波器通过使用相关来完成。该值是默认值。
'conv'    滤波器通过使用卷积来完成

边界填充选项(boundary_options)
     P   输入图像的边界通过用值P来扩展。P的默认值为0。
'replicate'    图像大小通过复制外边界的值来扩展。
'symmetric'    图像大小通过反射其边界来扩展。
'circular'     图像大小通过将图像看成是二维周期函数的一个周期来扩展

大小选项(size_options)
'full'    输出图像的大小与被填充后图像的大小相同
'same'    输出图像的大小与输入图像的大小相同

注:imfilter与filter2区别
imfilter 可进行多维图像(RGB等)进行空间滤波,且可选参数较多
filter2 只能对二维图像(灰度图)进行空间滤波
%例程
clc
originalRGB = imread('peppers.png'); 
h = fspecial('laplacian'); 
filteredRGB = imfilter(originalRGB,h); 
figure, imshow(originalRGB)
figure, imshow(filteredRGB)



filter2
MATLAB图像处理工具箱提供了基于卷积的图象滤波函数filter2,filter2的语法格式为:
Y = filter2(h,X)
其中Y = filter2(h,X)返回图像X经滤波算子h滤波后的结果,默认返回图像Y与输入图像X大小相同。其实filter2和conv2是等价的。MATLAB在计算filter2时先将卷积核旋转180度,再调用conv2函数进行计算。 

fspecial
fspecial函数用于创建预定义的滤波算子(掩膜),其语法格式为:
h = fspecial(type)
h = fspecial(type,parameters)
参数type制定算子类型,parameters指定相应的参数,具体格式为:
type='average',fspecial('average',[r c]),大小为rxc的矩形均值滤波器,默认值为[3 3]。
type= 'gaussian',fspecial('gaussian',[r c],sigma),大小为rxc的高斯低通滤波器,参数有两个,[r c]表示模版尺寸,默认值为[3 3],sigma表示滤波器的标准差,单位为像素,默认值为0.5。
type= 'laplacian',fspecial('laplacian',alpha)大小为3x3为拉普拉斯滤波器,参数为alpha,用于控制拉普拉斯算子的形状,取值范围为[0,1],默认值为0.2。
type= 'log',fspecial('log',[r c],sigma),为拉普拉斯-高斯(LoG)算子,参数有两个,[r c]表示模版尺寸,默认值为[5 5],sigma为滤波器的标准差,单位为像素,默认值为0.5
type= 'prewitt',fspecial('prewitt'),大小为为3x3的prewitt算子掩膜Pv,它仅为垂直梯度(并非计算完整的Prewitt梯度),用于边缘提取,水平梯度掩膜为其转置。
type= 'sobel',fspecial('sobel'),为著名的sobel算子,大小为为3x3的sobel算子掩膜Sv,仅为垂直梯度(并非计算完整的Sobel梯度),用于边缘提取,水平梯度掩膜为其转置。
type= 'unsharp',为对比度增强滤波器,参数alpha用于控制滤波器的形状,范围为[0,1],默认值为0.2。

注:fspecial仅仅是定义了滤波算子h,要想进行以该算子为掩膜的二维图像卷积运算(滤波),还需要使用filter2。

综合例程:

clc 
%对原图象进行加噪 
A=imread('cameraman.tif'); 
B=imnoise(A,'salt & pepper') ;

%用fspecial和filter2命令实现'gaussian','laplacian'滤波 
h=fspecial('gaussian',[3,3],0.5)    % 定义滤波算子h
X=filter2(h,B)/255;   % 卷积/滤波运算
figure,imshow(X),title('gaussian滤波'); 
k=fspecial('laplacian',0.2)    % 定义滤波算子k
Y=filter2(k,B); 
figure,imshow(Y),title('laplacian滤波');

medfilt2
在MATLAB图像处理工具箱中,提供了medfilt2函数用于实现中值滤波。
medfilt2函数的语法格式为:
B = medfilt2(A)       用3×3的滤波窗口对图像A进行中值滤波。
B = medfilt2(A,[m n])       用指定大小为m×n的窗口对图像A进行中值滤波。

edge
MATLAB的图像处理工具箱中提供的edge函数可以实现检测边缘的功能,其语法格式如下:
BW = edge(I,'sobel')
BW = edge(I,'sobel',direction)
BW = edge(I,'roberts')
BW = edge(I,'log')
这里BW = edge(I,'sobel')采用Sobel算子进行边缘检测。BW = edge(I,'sobel',direction)可以指定算子方向,即:
direction=’horizontal’,为水平方向;
direction=’vertical’,为垂直方向;
direction=’both’,为水平和垂直两个方向。
BW = edge(I,'roberts')和BW = edge(I,'log')分别为用Roberts算子和拉普拉斯高斯算子进行边缘检测。
例:用三种算子进行边缘检测。
I=imread('eight.tif');
imshow(I)
BW1=edge(I,'roberts');
figure ,imshow(BW1),title('用Roberts算子')
BW2=edge(I,'sobel');
figure,imshow(BW2),title('用Sobel算子 ')
BW3=edge(I,'log');
figure,imshow(BW3),title('用拉普拉斯高斯算子')