matlab |
您所在的位置:网站首页 › 1855镜头和18135镜头哪个好 › matlab |
文章目录
说明Figure 1imread函数imshow函数
Figure 2rgb2gray函数graythresh函数im2bw函数figure函数
Figure 3bwareaopen函数
Figure 4strel函数imclose函数imfill函数
Figure 5bwboundaries函数label2rgb函数检测算法regionprops函数diff函数sprintf函数text函数
最后我们来换个图试试第一幅图第二幅图第三幅图
说明
资料来自《详解MATLAB图像函数及其应用》 作者:张倩,占君,陈珊 出版社:电子工业出版社 出版时间:2011-04 这是我对MTALAB图像处理整理出来的学习笔记,望与君共勉 采用部分只有代码,其他的我自己收集来的资料,萌新一枚,侵权即删 内容来自书的第十九章1457页的图像特征提取实战2 —————————————————————— 本次会出现5个图像窗口,所以我会根据每一次出现的图像窗口来进行分段解释 Figure 1首先读取图像 RGB=imread('1234.png'); imshow(RGB); imread函数 A=imread(filename) 从指定的图像中读取灰度图像或真彩色图像 filename是表示文件名全名的字符串(包括扩展名) 也就是***.jpg啊,***.png啊这些图像文件名字 imshow函数 imshow(I) 显示真彩色图像RGB, RGB为三维数组,第三维的维数为3其他用语说明 三维数组 这一个三维数组在本次案例中是指imread函数操作来的三维数组,如RGB,显示如下再打开
然后对图像进行阈值分割 将图像转换为灰度图像,设置阈值,对图像进行阈值分割,生成二值图像 I=rgb2gray(RGB); threshold=graythresh(I); bw=im2bw(I,threshold); figure; imshow(bw); rgb2gray函数 I=rgb2gray(RGB) 将真彩色RGB图像或索引图像转换为灰度图像 参量RGB是一个维数为MxNx3的数组,表示RGB图像,上方已经展示出来 graythresh函数 level=graythresh(I) 计算全局图像阈值 level为标准化灰度值,范围是[0 1]其他用语解释 阈值 即临界值,是为转化二值图像做准备来的 而这一次把上图进行计算全局阈值后得到的level值为
Otsu算法 对于图像I(x,y) 前景(即目标)和背景的分割阈值记作T 前景像素点数占整幅图像的比例记为ω0,其平均灰度μ0; 背景像素点数占整幅图像的比例记为ω1,其平均灰度为μ1。 图像的总平均灰度记为μ,类间方差记为g。假设图像的背景较暗,并且图像的大小为M×N 图像中像素的灰度值小于阈值T的像素个数记作N0 像素灰度大于阈值T的像素个数记作N1 则有: ω0=N0/ M×N (1) ω1=N1/ M×N (2) N0+N1=M×N (3) ω0+ω1=1 (4) μ=ω0μ0+ω1μ1 (5) g=ω0(μ0-μ)2+ω1(μ1-μ)2 (6) 将式(5)代入式(6),得到等价公式: g=ω0ω1(μ0-μ1)^2 (7) 这就是类间方差 采用遍历的方法得到使类间方差g最大的阈值T,即为所求。 内容学习来源 作为一个热爱学习的人,我当然得去看看这个函数在干些啥 于是我去画了个图![]() ![]() ![]() ![]() 结果当然会得到二值图像 可以看到想要提高效率(偷懒),可以只打一个figure代码,就可以按顺序新建一个图像窗口,如下图(本次代码产生的)
然后去除图像中的噪声,开运算去除小于30个像素的目标 bw=bwareaopen(bw,30); figure; imshow(bw); bwareaopen函数 BW2=bwareaopen(BW,P) 移除二值图像BW中所有少于P个像素的连通元素,生成另一个二值图像BW2对二值图像进行形态学开运算,用于移除小目标 对于二维图像默认采用8连通邻域 三维采用26连通邻域本次bwareaopen会对bw进行操作,故之前我展示出来的bw的逻辑矩阵已经是经过变化了的矩阵,有一些地方的1可能变成了0,但是我们只是为了看看这个图片在电脑里是怎么解释的(我就是没看过,我就是想看) 第一次的实战案例里我们了解到,开运算就是可以去除孤立的小点、毛刺这些东西,P就是结构元素,用于作为滤波的标准,BW就是滤波对象,接下来我们看看滤波的结果如何 开运算后的图片: 之前的图片: 填充图像缝隙(洞孔) se=strel('disk',2); bw=imclose(bw,se); bw=imfill(bw,'holes'); figure; imshow(bw); strel函数 SE=strel(shape,parameters) 创建形态学结构元素对象 shape可是square方形,line线形,disk圆盘形,ball球形和rectangle长方形等 parameters是对shape的大小描述结果得到的se是什么呢,我们来看看
图表内容来源 另外我们还看到,继续打开的两个图中,一个是0,1矩阵,1组合起来的形状我们就当做圆盘状吧,然后另一个图里只有一个数字2,这个2就来自代码中后边我们输入的2。实际上如果把disk变成square,就会使整个矩阵变成1,变成line,就还需要一个角度,若角度设定为45度,则会让1从左下角连续到右上角去,也就是一条线的形状(矩阵画图太难了) 接下来我们看本次用到的strel的对象 imclose函数 IM2=imclose(IM,SE) 对图像进行形态学闭运算 对灰度图像或二值图像IM进行形态学闭运算,返回闭运算结果图像IM2 SE为由strel函数生成的结构元素对象 imfill函数 BW2=imfill(BW,‘holes’) 显示二值图像BW,对二值图像BW中的目标点孔进行填充点来看看这一次的图像的变化
接下来提取图像中的各种目标的几何特征,利用几何特征及圆形检测算法判断每个目标是否是圆形目标。当目标的面积和周长满足公式ε=4piS/L^2,ε接近于1时,则认为该目标为圆形目标 [B,L]=bwboundaries(bw,'noholes'); figure; imshow(label2rgb(L,@jet,[.5 .5 .5]));%5 bwboundaries函数 B=bwboundaries(BW) 搜索二值图像BW的外边界和内边界 BW为矩阵,其元素为0或1(即二值图像) 该函数将0视为背景像素点,1视为待提取边界的目标 B为Px1细胞矩阵,P为目标和洞的个数 B中的每个细胞元素均为Qx2矩阵,Q为边界所含像素点的个数 故该矩阵中每一行包含边界像素点的行坐标和列坐标我们来看看B里有什么
那么我们打开L
这里的@jet是colormap,解释是说默认大值为红,小为蓝,还可以用colormap(flipud(jet))进行颠倒,但是…
先给出流程图 代码说明: 获取标识区域的面积和质心属性 我们打开stats来看
threshold=0.94是在手动设置圆的阈值,可以观察下方对比metric和threshold 然后是用循环检测每一个标识目标 利用边界坐标计算目标周长 area=states(k).Area即获取目标面积属性 打开area 这个函数在这次算法里比较玄学吧,算着算着周长就出来了,我也是看了半天,我们先来看看diff函数是在干些啥 它的用途有这些 对于一维向量,diff函数会用右减左,即相邻数的增量 对于二维的矩阵 对于diff(A,1,1),就相当于diff(A),并且是用矩阵的下行作被减数,上行作减数对于diff(A,2,1),就相当于diff(diff(A)),并且是用矩阵的下行作被减数,上行作减数对于diff(A,1,2),就相当于diff(A),并且是用矩阵的右列-左列对于diff(A,2,2),就相当于diff(diff(A),并且是用矩阵的右列-左列所以本次算法中就是把boundary作为边缘坐标,然后下减上,得到的几乎都是(0,1)(1,0)(-1,0)和(0,-1),因为是连续的离散点,然后平方变为正,再求和,第一个sum计算得到数行一列的1,sqrt之后还是1,行数甚至不变,然后最后一个sum得到周长 sprintf函数 str=sprintf(formatSpec,A1,…,An) 使用formatSpec指定的格式化操作符格式化数组A1,…,An中的数据,并在str中返回结果文本 text函数 text(___,Name,Value) 最后我们来换个图试试 第一幅图我去用ps画了图,如下 被暗算了一波,我们换个颜色再来 只到最后一个imshow操作,连边都没有描 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |