ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

matlab图像处理基础

2021-03-25 21:59:22  阅读:282  来源: 互联网

标签:滤波器 矩阵 元素 基础 像素 图像处理 灰度 matlab 图像


图像是以矩阵方式存贮的。

matlab中图像索引方式

像素索引;空间索引。
像素索引的像素点位置同矩阵表达,相当于平面直角坐标系的第四象限排布方式。坐标值必须为整数。
空间索引则以图像中心为原点,整个图像在四个象限中均分。所有坐标指向像素块的中心。

matlab支持的文件格式

BMP,GIF,TIFF,PCX,JPEG,PSD,WMF等

matlab图像类型

二进制图,索引图,灰度图,RGB图
二进制图:像素取值只有0或1,0为黑,1为白。
索引图:索引图分为两个矩阵,第一个矩阵记录位置,第二个记录颜色,颜色矩阵分为三列,其值均在0-1之间,分别记录RGB。
灰度图:通常由unit8,unit16,单精度类型或者双精度类型数组描述。0表示黑色,白色取决于数据类型,1或255或65535表示白色,其间的数值表示介于黑与白之间,就是不同灰度。
RGB图:三维数据组,第三维存储RGB值,RGB分量各占8位。最多有224种颜色。

图像类型转换

灰度图转索引图gray2ind
索引图转灰度图ind2gray
RGB图转灰度图rgb2gray
RGB图转索引图rgb2gray
索引图转RGB图ind2rgb
矩阵变灰度图mat2gray

图像基础操作

image显示带有坐标的图像。
imshow显示图像,不带坐标,显示灰度图可以指定灰度值。可用subplot定位图像显示位置。用colormap定义图像显示用的颜色查找表。可以将图像适应窗口大小,详细内容使用doc查看。
imfinfo函数来获取图像文件信息,此信息包含文件格式,文件格式版本,文件修改日期,文件大小,横向像素数量,纵向像素数量,箱数值位数,图像类型等
imread图像数据的加载
imwrite写图像数据
colorbar添加图像的颜色条
subimage显示子图像,可以是灰度图、索引图、RGB、二进制等,具体看函数内输入的内容,详细语法查看帮助。会显示坐标。
subplot将窗口分隔成几个区域,并选中指定区域
warp纹理映射,将图像映射到其他物体表面

图像的代数操作

因为matlab中图像即矩阵,所以可以进行加减乘除这些代数操作。
要注意操作图像数据时避免1.数据溢出 2.数据类型无效
matlab中额外设置了图像代数操作的语句,用来防止出现数据错误,会在数据溢出时及时截断。需要整数类型而结果是小数时自动四舍五入。

imadd(x,y)
默认要求xy这两个图像的像素长宽是一样的。对应位置的像素会相加。
这里面的x或y也可以是一个常数,这样就是所有元素都加一个常数。

imsubtruct(x,y)
也成为差分方法,通过x-y找出不同

immultiply(x,y)
可以屏蔽图像某一部分,类似于PS中蒙版的效果(但不可恢复)。或者改变图像的亮度,但可以维持原图像对比度。

imdivide(x,y)

图像的空间变换

图像插值 在图像空间变换时一般需要进行插值操作,因为有些像素点位置变成了无效的值。需要利用插值函数来表示一些点的位置。插值不指定情况下选择最近邻插值方法。
nearest neighbor interpolation最近邻插值
该点距离谁最近就选择谁的数值
bilinear interpolation双线性插值
该点邻域四个点的均值
bicubic interpolation双三次插值
该点附近水平方向三条做均值,求得后再做内插。这是最麻烦的一种。
图像缩放 imresize
图像旋转 imrotate,超出部分数值默认为0
图像剪切 imcrop,词语法如果不指定裁剪范围就会变成交互式裁剪,会先显示原图像,等待你手动在窗口框出裁剪范围再裁剪。

图像的分块操作

分块操作,可以减少内存占用,突出局部特征,降低运算复杂程度。

非重叠操作

blkproc,教程有点老,2019a建议使用BLOCKPROC函数

B = blockproc(A,[m n],fun)将fun函数应用于A的每一块m*n的矩形块上
B = blockproc(src_filename,[m n],fun)对src_filename这个文件进行分块处理,作用和上面一样,但是是一块块处理,对大文件效果较好
B = blockproc(adapter,[m n],fun)处理由adapter(一个ImageAdapter对象)指定的源图像。(没太看懂)
blockproc(___,Name,Value)处理输入图像,指定控制块行为的各个方面的参数和相应的值。参数名称不区分大小写。

非重叠在于把整个图像分成若干块,不存在同一像素点出现在不同块当中。如果分块时,部分图像块不完整,会在右侧和下侧补零来补全。

滑动邻域操作

nlfilter
指定的是中心元素,然后以中心点位置扩大为矩形区域。两个点过近会出现重叠。区域缺失,double类型的补1,unit8类型补0。这种方法效率不是很高,要花比较长的时间。

快速块处理

相对于滑块邻域操作更加迅速。

B = colfilt(A,[m n],block_type,fun)将A的每个m × n块重新排列成一个临时矩阵的一列,然后将fun函数应用到这个矩阵中。
B = colfilt(A,[m n],[mblock nblock],block_type,fun)将A划分为大小为mblock-by-nblock的区域,以节省内存。
B = colfilt(A,‘indexed’,___)处理A作为一个索引图像,uint8, uint16,填充0;

选取特定区域

选择这个特定操作的原理和PS中的蒙版选择方式相同。
roipoly选择图像中的多边形区域(在函数中输入的坐标点就是多边形的顶点坐标),不输入坐标就是交互式操作。
roicolor对RGB或灰度图进行按灰度或亮度进行区域选择。
poly2mask将指定区域转换为蒙版(选中区域为1白色,外部为0黑色)

选取区域滤波

J = roifilt2(h,I,BW)使用滤波器h对图像I的BW区域进行滤波
J = roifilt2(I,BW,fun)使用fun函数对I的BW区域进行操作

选取区域填充

2019a推荐改为regionfill函数
J = regionfill(I,mask)对mask指定的条件选择对应区域,并填充
J = regionfill(I,x,y)对x,y形成的多边形区域进行填充,官方案例里也没说明这个填充颜色是从哪里取得的。

傅里叶变换与反变换

傅里叶变换将时域的图像转化到频域中的处理,反变换将频域转化为时域。由于图像是二维的,所以,频域会分为ω1和ω2两个。
fft傅里叶变换,这里是二维的应该使用fft2来进行二维傅里叶变换。
Y = fft2(X)使用快速傅里叶变换算法返回矩阵的二维傅里叶变换。
Y = fft2(X,m,n)将截断 X 或用尾随零填充 X,以便在计算变换之前形成 m×n 矩阵。Y 是 m×n 矩阵。
fftshift将零频分量移到频谱中心,以形成对称的图像。

卷积与傅里叶变换

f1与f2的卷积=ifft(fft(f1)*fft(f2))
用傅里叶变换来计算卷积
卷积可以识别图像的颜色边缘,就可以进行图像的识别。
这里教程讲的不是很好,案例效果只是一个小白点?识别一个字母为什么结果是白点?

离散余弦变换

dct2这是一种图像压缩的方法。
B = dct2(A)返回a的二维离散余弦变换。矩阵B包含离散余弦变换系数B(k1,k2)。
B = dct2(A,m,n)或B = dct2(A,[m n])在应用变换之前,用0填充矩阵A,使其大小为m × n。如果m或n小于A对应的维数,则dct2在变换前作物A。
D = dctmtx(n)返回n × n离散余弦变换(DCT)矩阵,您可以使用该矩阵对图像执行二维DCT。适用于小矩阵。
idct2为离散余弦反变换。

直方图加强

桂哥317大佬讲的比我这课程详细,链接在此
histeq语句进行直方图加强,用imhist来查看直方图数据

空间域滤波

链接
消除噪声,模糊使用平滑,
线性平滑滤波器(低通)
非线性平滑滤波器(低通)
线性锐化滤波器(高通)
非线性锐化滤波器(高通)

线性平滑滤波

创建该像素点的一个邻域,取区域平均值作为该像素点的值。达到模糊的效果。
fillter语法中矩阵使用fspecia函数创建一个滤波器
平滑使用average。
fspecial创建预定义的二维过滤器
h = fspecial(type)
h = fspecial(‘average’,hsize)
h = fspecial(‘disk’,radius)
h = fspecial(‘gaussian’,hsize,sigma)
h = fspecial(‘laplacian’,alpha)
h = fspecial(‘log’,hsize,sigma)
h = fspecial(‘motion’,len,theta)
h = fspecial(‘prewitt’)
h = fspecial(‘sobel’)

type可选内容含义
‘average’平均滤波器
‘disk’循环平均滤波器
‘gaussian’高斯低通滤波器。不推荐。
‘laplacian’二维拉普拉斯算子的逼近
‘log’高斯滤波的拉普拉斯算子
‘motion’近似摄影机的直线运动
‘prewitt’水平边缘强调滤波器
‘sobel’索贝尔水平边缘强调滤波器

非线性平滑滤波器

创建该像素点的一个邻域,将这些数值排序,取中间值(若有两个中间值则求和取平均)。对随机噪声效果较好,对脉冲噪声效果最好。与前一个相比,不会使边界模糊。
medfilt2二维中值滤波

线性锐化滤波器

原图像数据类型要求是double。与线性平滑相似,但使用’laplacian’。
生成滤波后的图像后要用原图像-滤波后图像

非线性锐化滤波器

‘sobel’或‘prewitt’或‘log’使用方法同线性锐化滤波器。

彩色增强

matlab中关于颜色映像
可以用于生成RGB图的RGB值。
hsv
在这里插入图片描述
hot
在这里插入图片描述
cool
在这里插入图片描述
pink
在这里插入图片描述
gray
在这里插入图片描述
bone
在这里插入图片描述
jet
在这里插入图片描述
copper
在这里插入图片描述
prism
在这里插入图片描述
flag
在这里插入图片描述
全部的在下表

parulaparula 颜色图数组
jetJet 颜色图数组
hsvHSV 颜色图数组
hothot 颜色图数组
cool冷色颜色图数组
springSpring 颜色图数组
summerSummer 颜色图数组
autumnautumn 颜色图数组
winterWinter 颜色图数组
graygray 颜色图数组
bonebone 颜色图数组
coppercopper 颜色图数组
pink粉色颜色图数组
lines线条颜色图数组
colorcubeColorcube 颜色图数组
prismPrism 颜色图数组
flagflag 颜色图数组

密度分割法

grayslice利用多级阈值法将灰度图像转换为索引图像,使用上面的颜色映像来产生彩色图。

空间域灰度级-彩色变化

将灰度排序,0时为蓝色,设定大于某值后时为红色,中值时为绿色。

图像的边缘检测

边缘是因为灰度不连续造成的。
使用edge函数进行边缘检测
BW = edge(I,method)
更多用法用doc

Method 方法描述
‘Sobel’使用对导数的索贝尔近似,在图像 i 的梯度最大的那些点寻找边缘。
‘Prewitt’利用 Prewitt 对导数的近似,在 i 的梯度最大的点上找到边。
‘Roberts’查找在这些点的梯度是最大值,用罗伯茨近似求导数
‘log’通过过滤后查找过零点来查找边缘I用拉普拉斯高斯(LoG)滤波器
‘zerocross’通过过滤后查找过零点来查找边缘I使用你指定的过滤器,h
‘Canny’通过寻找 i 的梯度的局部最大值来寻找边。边缘函数使用高斯滤波器的导数计算梯度。该方法使用两个阈值检测强边缘和弱边缘,包括弱边缘的输出,如果他们连接到强边缘。通过使用两个阈值,Canny 方法是不太可能比其他方法被噪声欺骗,更有可能检测真正的弱边缘。
‘approxcanny’使用近似版本的 Canny 边缘检测算法查找边缘,这种算法可以提供更快的执行时间,但是会降低检测的精度。浮点图像预计将在范围[01]中被归一化。

图像的噪声

噪声一般是在传输获取过程中获得。常见的噪声包括高斯噪声、瑞利噪声、伽马噪声等。每种噪声都有对应的概率密度函数来描述。这里不列写详细的函数。
imnoise 给图像添加噪声,详细使用方法见帮助。这是图像的退化过程。

图像复原

是图像退化的逆过程。在已知退化模型的前提下,图像复原可分为无约束和有约束两大类,也可以分为频域恢复与空间域分恢复。(这一部分教程讲的十分含糊,不过还好只是概念性的东西,似乎对后面没什么影响)
信噪比是评估复原方法优劣的依据。

matlab中图像复原方法

wiener滤波器复原,regularized滤波器复原,lucyRichardson复原,盲反卷积复原。四种方法。

deconvwnrwiener滤波器复原
deconvregregularized滤波器复原
deconvlucylucyRichardson复原
deconvblind盲反卷积复原

图像形态

这才是我学这东西的目的啊,识别图像中特定的结构

膨胀与腐蚀

膨胀是在图像的对象周围添加像素,腐蚀则是删除周围的像素。删除的像素量取决于结构元素的大小和形状。
膨胀相当于在规定范围内取最大值输出,腐蚀则取最小值输出。这个规定范围有结构元素决定。
当像素处于边缘的时候,规定的结构元素指向的位置可能会指向图像之外了,对于这种情况,如果是膨胀处理,会默认在边界扩展一个小的值来参与运算,(因为取最大值,这个小值具体是多少都不会影响结果);如果是腐蚀处理,会扩展一个大的值来参与运算(这样取小值的时候也不会取到它)。
图像膨胀使用 imdilate
图像腐蚀使用 imerode
这两个函数需要结构元素这一参数来使用,下面就是

结构元素

是一个由0和1组成的矩阵,1对应的就是制定的结构元素。
获取结构元素的原点(求解点)的坐标方法:
指定为任意维度的数字数组。所有非零像素都nhood属于该形态运算的邻域。的中心(或原点) nhood是其中心元素,由给出 floor((size(nhood) + 1)/2)。
创建结构元素
使用 strel 来创建结构元素,可以创建一些简单形状的结构元素。

SE = strel(‘arbitrary’,nhood)创建具有指定邻域的平面结构元素。
SE = strel(‘diamond’,r)创建菱形结构元素,其中r指定从结构元素原点到钻石点的距离。
SE = strel(‘disk’,r,n)创建一个圆盘形结构元素,其中r 指定半径并n指定用于近似圆盘形状的线形结构元素的数量。
SE = strel(‘octagon’,r)创建一个八边形结构元素,该元素r指定从结构元素原点到八边形边的距离(沿水平轴和垂直轴测量)。r必须为3的非负倍数。
SE = strel(‘line’,len,deg)创建一个线性结构元素,该元素相对于邻域中心对称。
SE = strel(‘rectangle’,[m n])创建一个大小为的矩形结构元素[m n]。
SE = strel(‘square’,w)创建一个正方形结构元素,其宽度为w 像素。
SE = strel(‘cube’,w)创建一个3D立方体结构元素,其宽度为w 像素。
SE = strel(‘cuboid’,[m n p])创建一个大小为的3-D长方体结构元素[m n p]。
SE = strel(‘sphere’,r)创建一个半径为r 像素的3-D球形结构元素。

开运算与关运算

开运算

先腐蚀再膨胀的操作,可以忽略小目标,保留大目标(这里指像素多少)使用 imopen 可以直接完成先腐蚀再膨胀的操作。

关运算

先膨胀再腐蚀的操作,用于填补图片中的空隙。使用imclose可以直接完成该操作。

其他操作

骨架提取 bwmorph 函数,用于把目标衰减为直线而不改变图像的主要结构。
原图在这里插入图片描述
bwmorph后
在这里插入图片描述
边缘检测 bwperim 函数
在这里插入图片描述
重建图像 imreconstruct 用来识别高强度对象或者分割提取图像
重建需要标记图像和掩膜图像,对标记图像进行膨胀,直到部分与掩膜图像重叠就停止。但膨胀的过程中,最大值不可能更大,于是极值点就不会像之前那样突出显示了。
标记
在这里插入图片描述
掩膜
在这里插入图片描述
重构
在这里插入图片描述
有点像PS中给原图像盖上蒙版后拉亮度曲线的意思。

填充

imfill 填充图像区域和孔,注意,这里填充的图像是二进制或灰度图像。
关于连通性
在这里插入图片描述

标签:滤波器,矩阵,元素,基础,像素,图像处理,灰度,matlab,图像
来源: https://blog.csdn.net/Temmie1024/article/details/114483756

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有