草庐IT

【Matlab 常用图像处理函数 汇总】

LPY。 2023-04-05 原文

Matlab 常用图像处理函数 汇总

一、图像的读取

A=imread(‘1.bmp’); %读入图像

二、图像的写入

imwrite(A,‘test.bmp’);

三、图像的显示

imshow(I,[low high]);
I为要显示的图像矩阵。[low high]为指定显示灰度图像的灰度范围。 高于high的像素被显示成白色;低于low的像素被显示成黑色;介于 High和low之间的像素被按比例拉伸后显示为各种等级的灰色。

四、创建窗口

figure;%创建一个新的窗口
subplot(m,n,p); 打开一个有m行n列图像位置的窗口,并将焦点位于第p个位置上。

五、图像的格式转换

A=im2bw(I,LEVEL); //阈值法从灰度图、RGB图创建二值图。LEVEL为指定的阈值(0,1)。
A=rgb2gray(I);从RGB图创建灰度图
A=im2uint8(I);将图像转换成uint8类型
A=im2double(I); 将图像转换成double类型

六、灰度直方图

imhist(I);

[M,N]=size(I); %计算图像大小
[counts,x]=imhist(I,32);%计算有32个小区间的灰度直方图 
counts=counts/M/N;%计算归一化灰度直方图各区间的值 
stem(x,counts);%绘制归一化直方图

七、伽马变换

J=imadjust(I,[low_in high_in],[low_out high_out],gamma)

I=imread('1.bmp'); 
I = rgb2gray(I);
I = imadjust(I,[],[],0.5);
figure;imshow(I); %gamma=0.5 
title('Gamma 0.5');


八、图像二值化

BW=im2bw(I,level);%level为人工设定阈值范围为[0 ,1]

九、阈值变换

thresh=graythresh(I);%自动设定所需的最优化阈值

十、直方图均衡化

[J,T]=histeq(I); %J为输出图像,T为变换矩阵

十一、图像平移

strel(); //创建形态学结构元素
translate(SE,[y x])%原结构元素SE上y和x方向平移
imdilate%形态学膨胀

I=imread(1.bmp'); 
se=translate(strel(1),[180 190]); 
B=imdilate(I,se); 
figure;
subplot(1,2,1);
subimage(I);
title('原图像');
subplot(1,2,2);
subimage(B);
title('平移后图像');

十二、图像镜像

B=imtransform(A,tform,method);
tform=makeform(transformtype,matrix);%空间变换结构

Method合法值含义
‘bicubic’双三次插值
‘bilinear’双线性插值
‘nearest’最近邻插值

参数transformtype指定了变换的类型,常见的’affine’为二维或 多维仿射变换,包括平移、旋转、比例、拉伸和错切等。 matrix为相应的仿射变换矩阵。

A=imread(1.bmp'); 
[height,width,dim]=size(A); 
tform=maketform('affine',[-1 0 0;0 1 0;width 0 1]); 
B=imtransform(A,tform,'nearest'); 
tform2=maketform('affine',[1 0 0;0 -1 0;0 height 1]); 
C=imtransform(A,tform2,'nearest'); 
figure;imshow(B); //水平镜像
figure;imshow(C); //垂直镜像

十三、图像转置

A=imread(1.bmp'); 
tform=maketform('affine',[0 1 0;1 0 0;0 0 1]); 
B=imtransform(A,tform,'nearest'); 
figure;imshow(B);

十四、图像中心旋转

B=imrotate(A,angle,method,’crop’);
angle为旋转角度,正值为逆时针旋转。可选参数method为imrotate函数指定 插值方法。‘crop’选项会裁减旋转后增大的图像,保持和原图像同样大小

A=imread('nir.bmp'); 
B=imrotate(A,30,'nearest','crop'); 
figure;imshow(B); //逆时针旋转30°

十五、添加噪声

h=imnoise(I,type,parameters);

type合法值含义
‘gaussian’高斯白噪声
‘salt&pepper’椒盐噪声

十六、图像滤波

B=imfilter(f,w,option1,option2,…);
f 为要进行滤波操作的图像。
w为滤波操作使用的模板,为一个二维数组,可自己定义。
option1……是可选项,包括:
1、边界选项(’symmetric’、’replicate’、’circular’)
2、尺寸选项(’same’、’full’)
3、模式选项(’corr’、’conv’)

十七、滤波器设计

h=fspecial(type,parameters)
parameters为可选项,是和所选定的滤波器类型type相关的 配置参数,如尺寸和标准差等。 type为滤波器的类型。其合法值如下:

type合法值含义
‘average’平均模板
‘disk’圆形领域的平均模板
‘gaussian’高斯模板
‘laplacian’拉普拉斯模板
‘log’高斯-拉普拉斯模板
‘prewitt’Prewitt水平边缘检测算子
‘sobel’Sobel水平边缘检测算子

十八、中值滤波

I=medfilt2(I1,[m,n]);
m和n为中值滤波处理的模板大小,默认3*3

十九、图像锐化

1、Robert交叉梯度

I=imread(1.bmp'); 
I=double(I);%双精度化 
w1=[-1 0;0 1]; 
w2=[0 -1;1 0]; 
G1=imfilter(I,w1,‘corr’,‘replicate’);%45°梯度 
G2=imfilter(I,w2,‘corr’,‘replicate’);%45°梯度 
G=abs(G1)+abs(G2);%计算Robert梯度 
figure;imshow(G,[]); 
figure;imshow(abs(G1),[]); 
figure;imshow(abs(G2),[]);

2、高斯-拉普拉斯锐化

I=imread('1.bmp'); 
J=double(I);%双精度化 
h1=fspecial('log',5,0.5);%大小为5,sigma=0.5的LOG算子 
I1=imfilter(J,h1,'corr','replicate'); 
figure;imshow(uint8(abs(I1)),[]); 
h2=fspecial('log',5,2);%大小为5,sigma=2的LOG算子 
I2=imfilter(J,h2,'corr','replicate'); 
figure;imshow(uint8(abs(I2)),[]);

二十、傅里叶变换

I=fft2(x);%快速傅里叶变换
I=fft2(x,m,n); x为输入图像;
m和n分别用于将x的第一和第二维规整到指定的长度。

I1=abs(I);%计算I的幅度谱
I2=angle(I);%计算I的相位谱
Y=fftshift(I);%频谱平移

I=ifft2(x);%快速傅里叶逆变换
I=ifft2(x,m,n);

二十一、图像腐蚀

I2=imerode(I,SE);
SE=strel(shape,parameters);
I为原始图像,可以是二值或者灰度图像。
shape指定了结构元素的形状。
parameters是和输入shape有关的参数。

shape合法值含义
‘arbitrary’或为空任意自定义结构元素
‘disk’圆形结构元素
‘square’正方形结构元素
‘rectangle’矩形结构元素
‘line’线性结构元素
‘pair’包含2个点的结构元素
‘diamond’菱形的结构元素

二十二、图像膨胀

J=imdilate(I,SE);
SE=strel(shape,parameters);
I为原始图像,可以是二值或者灰度图像。
shape指定了结构元素的形状。
parameters是和输入shape有关的参数

二十二、开闭运算

SE=strel(shape,parameters);
I2=imopen(I,SE);%开运算
I3=imclose(I,SE);%闭运算

二十三、连通分量提取

[L num]=bwlabel(Ibw,conn);
Ibw为一幅输入二值图像。
conn为可选参数,指明提取连通分量是4连通还是8连通。默认为8。
L为连通分量标注图像。
num为二值图像Ibw中连通分量个数。

二十四、形态学处理

I=bwmorph(I,operation,n)

operation合法值含义
‘bridge’桥接有单个像素缝隙分割的前景像素
‘diag’围绕对角线相连的前景像素进行填充
‘clean’清楚孤立的前景像素
‘fill’填充单个像素的孔洞
‘hbreak’去掉前景中的H形连接
‘majority’如果点P的8领域中一半以上像素为前景像素,则 P为前景像素,否则为背景。

二十五、图像分割

1、基于梯度算子的边缘检测

BW=edge(I,type,thresh,direction,’nothinning’) ;

type合法值含义
‘sobel’sobel算子
‘prewitt’prewitt算子
‘rebert’rebert算子

thresh是敏感度阈值参数,任何灰度值低于此阈值的边缘将不 会被检测到。默认值为空矩阵[],此时算法自动计算阈值。
direction指定了我们感兴趣的边缘方向,edge函数将只检测direction中指定方 向的边缘,其合法值如下:

direction合法值边缘方向
‘horizontal’水平方向
‘vertical’竖直 方向
‘both’所有方向

可选参数’nothinning’,指定时可以通过跳过边缘细化算法来加快算法 运行的速度。默认是’thinning’,即进行边缘细化。

2、基于高斯-拉普拉斯算子的边缘检测

BW=edge(I,’log’,thresh,sigma) ;
sigma指定生成高斯滤波器所使用的标准差。默认时,标准差为2。

3、基于Canny算子的边缘检测

BW=edge(I,’canny’,thresh,sigma) ;
thresh是敏感度阈值参数,默认值为空矩阵[]。此处为一列向量,为算法指 定阈值的上下限。第一个元素为阈值下限,第二个元素为阈值上限。如果 只指定一个阈值元素,则默认此元素为阈值上限,其0.4倍的值作为阈值下 限。如阈值参数没有指定,则算法自行确定敏感度阈值上下限。

a=imread(1.bmp'); 
c=fspecial('gaussian',5,0.8); 
b=imfilter(a,c); 
bw1=edge(b,‘sobel’);%sobel算子 
bw2=edge(b,‘prewitt’);%prewitt算子 
bw3=edge(b,‘roberts’);%roberts算子 
bw4=edge(b,‘log’); %log算子 
bw5=edge(b,‘canny’);%canny算子 
figure;imshow(bw1);imwrite(bw1,'bwsobel.bmp'); figure;imshow(bw2);imwrite(bw2,'bwprewitt.bmp'); figure;imshow(bw3);imwrite(bw3,'bwroberts.bmp'); figure;imshow(bw4);imwrite(bw4,'bwlog.bmp'); figure;imshow(bw5);imwrite(bw5,'bwcanny.bmp');

二十六、霍夫变换

1、霍夫变换(针对二值图像)

[H,theta,rho]=hough(BW,param1,val1,param2,val2);

2、寻找峰值—houghpeaks

peaks=houghpeaks(H,numpeaks,param1,val1,param2,val2);

3、提取直线段—houghlines

lines=houghlines(BW,theta,rho,peaks,param1,val1,param2,val2);

————————————————————————————————

有关【Matlab 常用图像处理函数 汇总】的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  5. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  6. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  7. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  8. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  9. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  10. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

随机推荐