matlab中的imshow函数使用

转自 http://hi.baidu.com/redaiyu1989/item/3f39fe151b446fc039cb3087

网上搜的好东西 一些图像处理函数用法

% 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('用拉普拉斯高斯算子')

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值