二值图像

基于MATLAB的腐蚀膨胀算法实现

ε祈祈猫儿з 提交于 2020-04-04 04:01:01
  本篇文章要分享的是基于MATLAB的腐蚀膨胀算法实现,腐蚀膨胀是形态学图像处理的基础,腐蚀在二值图像的基础上做“收缩”或“细化”操作,膨胀在二值图像的基础上做“加长”或“变粗”的操作。   什么是二值图像呢?把一幅图片看做成一个二维的数组,那么二值图像是一个只有0和1的逻辑数组,我们前面Sobel边缘检测后的图像输出边缘效果,设置个阈值,大于阈值输出为1,小于阈值输出为0,最后输出就是一幅二维图像了。 腐蚀   腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。用3X3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为1,结果图像的该像素为1。否则为0。结果会使二值图像小一圈。   有一个形象的比喻来可以说明该运算,用0表示蛀虫,1表示大米。蛀虫腐蚀大米的过程便是腐蚀运算, 腐蚀   如图所示,对于一个像素矩阵而言,只要有蛀虫(0)的存在,大米(1)就会被腐蚀掉了,即使只存在一个蛀虫(0),但是还是会被蛀虫腐蚀完毕,最后一幅图上面由于没有蛀虫(0)所以大米完好无损。 关于算法的实现,可以用下式子来表示,即3x3像素的运算: P = P11 & P12 & P13 & P21 & P22 & P23 & P31 & P32 & P33 在FPGA中,为了通过面积去换速度,我们将上式改变如下:               

Matlab图像处理教程系列之图像分割(二)

若如初见. 提交于 2020-02-17 17:55:41
1.使用距离变换的分水岭分割 (1)距离变换 D = bwdist(BW); 二值图像的距离变换是指从每个像素到最接近零值的像素的距离。 (2)测地距离变换 D = bwdistgeodesic(BW,mask); 2.使用梯度的分水岭分割 获取梯度图像: h = fspecial('sobel'); fd = tofloat(f); g = sqrt(imfilter(fd, h, 'replicate') .^ 2 + ... imfilter(fd, h', 'replicate') .^ 2); 在使用针对分割的分水岭变换之前,常常使用梯度幅度对图像进行预处理。梯度幅度图像沿着物体的边缘有较高的像素值,而在其他地方则有较低的像素值。在理想的情况下,分水岭变换可得到沿物体边缘的分水岭脊线。若梯度图像直接进行分水岭变换可能会严重过分割,所以在计算分水岭变换之前可以先平滑梯度图像。 3.控制标记符的分水岭分割 (1)计算局部极小值区域 rm = imregionalmin(f); 其中,f 是灰度图像,rm 是二值图像,rm 的前景像素标记出局部小区域的位置。 (2)扩展极小值 im = imextendedmin(f,h); 其中,f 是灰度图像,h 是高度阈值,im 是一幅二值图像,im 的前景像素标记了深的局部小区域的位置。 (3)强制最小 mp = imimposemin

MATLAB 常用形态学操作函数

a 夏天 提交于 2020-02-02 00:13:23
常用形态学操作函数(转自:http://blog.sina.com.cn/s/blog_4c52e9e20100e5if.html) 1、dilate函数 该函数能够实现二值图像的膨胀操作,有以下形式: BW2=dilate(BW1,SE) BW2=dilate(BW1,SE,…,n) 其中:BW2=dilate(BW1,SE)表示使用二值结构要素矩阵SE队图像数据矩阵BW1执行膨胀操作。输入图像BW1的类型为double或unit8,输出图像BW2的类型为unit8。BW2=dilate(BW1,SE,…,n)表示执行膨胀操作n次。 2、erode 函数 该函数能够实现二值图像的腐蚀操作,有以下形式: BW2= erode(BW1,SE) BW2= erode(BW1,SE,…,n) 其中:BW2= erode(BW1,SE)表示使用二值结构要素矩阵SE队图像数据矩阵BW1执行腐蚀操作。输入图像BW1的类型为double或unit8,输出图像BW2的类型为unit8。BW2= erode(BW1,SE,…,n)表示执行腐蚀操作n次。 3、bwmorph函数 该函数的功能是能实现二值图像形态学运算。它的格式如下: ① BW2=bwmorph(BW1,operation) ② BW2=bwmorph(BW1,operation,n) 其中:对于格式①

图像膨胀

早过忘川 提交于 2020-01-30 05:17:01
1、原理 所谓的图片的膨胀处理,其实就是在图像的边缘添加像素值,使得整体的像素值扩张,进而达到图像的膨胀效果,也可以说是信号与系统书中所提到的像素插值处理。 对Z 2 上元素集合A和结构体元素S,使用S对A进行腐蚀,记作: A⊕S={z|(S)z ∩ A ≠ Ø} 让位于图像圆点的结构元素S在Z平面上移动,如果S的圆点移动到z点时,S与A有公共的交集(非空集),则认为这样的z点构成的集合是S对A的膨胀图像。 下图左侧是原图X,B是结构元素,右图是膨胀的结果。膨胀的方法是,拿B的中心点和X上的点一个一个地对比,如果B上至少有一个点在X的范围内,则该点为前景有效点;右边是膨胀后的结果。可以看出,膨胀后的图比原图点数多,就象X被膨胀增加了一层。 2、膨胀的实现 imgPath = ' E:\opencv_pic\src_pic\pic1.bmp ' ; img = imread(imgPath); img = rgb2gray(img); img = 255 - img; se = strel( ' square ' , 3 ) img2 = imdilate(img, se); subplot( 1 , 2 , 1 ),imshow(img),title( ' 原始图像 ' ); subplot( 1 , 2 , 2 ),imshow(img2),title( ' 膨胀图像 ' );

第04课 显示、修改单个像素值

我们两清 提交于 2020-01-21 00:51:03
**学科:**人工智能 年级: 七 年级上 **课题:**第04课 显示、修改单个像素值 课时数:1 教学目标 : 理解图片像素点的表示方法; 掌握显示、修改二值图像像素值的方法; 掌握显示、修改灰度图像像素值的方法; 掌握显示、修改彩色图像像素值的方法; 能够对代码进行修改,实现修改指定位置的图像颜色; 教学重点: 掌握修改像素值的方法。 教学难点: 修改指定位置的图像颜色。 教学准备: 示例图片,程序代码文件 教 学 过 程 一、开放导入 1.前面我们学习了电脑显示图片的原理,电脑中的图片是由无数个显示颜色的像素点组成,图片中的每个像素点都有一对表示位置的数字(坐标点),比如图1中左上角表示为[0,0],A表示为[2,1],B表示为[4,5]。 【展示图片,对各个坐标点进行提问】 二、核心过程推进 1.显示像素值 如果我们想知道一张图片某个位置的像素值,可以在读取图片后,通过像素点的位置坐标进行查询。 比如:我们要查询彩色图片(nezha.jpg)[30,240]位置的像素值,代码如下 import cv2 img = cv2 . imread ( 'nezha.jpg' , - 1 ) # 读取图片 ​ print ( img [ 30 , 240 ] ) # 显示像素值 ​ cv2 . imshow ( 'nezha' , img ) #显示图片 cv2 . waitKey

直线提取与边界追踪

ε祈祈猫儿з 提交于 2020-01-14 02:17:41
文章目录 1.用霍夫变换提取直线 2.边界跟踪 图像的基本特征之一是直线。一般物体平面图像的轮廓可近似为直线及弧线的组合,对物体轮廓的检测与识别可以转化为对这些基元的检测与提取。另外,在运动图像分析和估计领域也可以采用直线对应法实现刚体旋转量和位移量的测量,所以直线检测对图像算法的研究具有重要意义。 边缘是一个局部的概念,一个区域的边界是一个整体的概念,边界追踪是一种串行的图像分割技术。图像由于噪声以及光照不均匀等原因,边缘点可能是不连续的,边界追踪可以将其变为有意义的信息。下面分别介绍直线的提取与边界追踪。 1.用霍夫变换提取直线 Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法。它通过将原图像上的点映射到用于累加的参数空间,实现对已知解析式曲线的识别。由于利用了图像的全局特性,所以受噪声和边界间断的影响较小,鲁棒性能好。Hough变换常用来对图像中的直线进行识别。 图像上任意直线区域都可以一一对应参数空间中的点,而图像上的任意像素都同时存在于很多直线区域之上。将图像上的直线区域想象为容器,把特定像素想象成放在容器中的棋子,只不过在这里,每个棋子都可以同时存在于多个容器中。那么Hough变换可以理解为依次检查图像上的每个棋子(特定像素),对于每个棋子,找到所有包含它的容器(平面上的直线区域),并为每个容器的计数器加1

matlab练习程序(二值图像连通区域标记法,两步法)

送分小仙女□ 提交于 2019-12-24 15:39:17
  我几乎完全就是照着 WIKI百科 上的算法实现的,不过是用Matlab而已。使用了两步法进行标记,一步法我还没怎么看。两步法中第二步是比较麻烦的,其中用到了不相交集合的一些理论,尤其是不相交集合森林,我这里的find_set函数就是参考《算法导论》311页的算法写的。如果用c++写,也许需要自己构造数据结构。   好吧,下面是我理解的算法过程:   1.首先要确定是标记8邻域连通还是4邻域连通,如果是8邻域连通,就用 的模板,如果是4邻域连通,就用 的模板。我这里用了是8连通。   2.用模板变量图像,类似卷积,不过不计算,只比较。比较当前像素和邻域4个或2个像素,如果都不相等,那么标记号加一,并且把这个标记号赋值给另一个标记空间中相同位置的像素,因为不能破坏当前图像的像素。如果有一个相等,那么就把这4个或2个像素中非背景像素中的最小值赋给另一个标记空间相同位置的像素,并且把这4个或2个像素同有相同当前位置像素值的集合取并集(ps:这个真的好难解释--!!)。遍历完会得到标记图像和有标记号那么多个的标记集合。   3.遍历标记图像,按标记图像的像素值索引标记集合,找到标记集合中代表当前集合最小的值赋值给原图像当前位置的像素(ps:这里最好看《算法导论》或 这里 )。   还是看代码吧,运行一下更好:   main.m clear all; close all; clc; img

ERDAS 数学形态学(Morphological)运算(其中包含腐蚀Erode、膨胀Dilate、开运算Open、闭运算Close)-Python CV2库

老子叫甜甜 提交于 2019-12-22 23:03:26
ERDAS数学形态学(Morphological)运算,其中包含腐蚀(Erode)、膨胀(Dilate)、开运算(Open)、闭运算(Close) 在用ERDAS Imagine 2014做水体提取时,需要用到形态学运算,在软件菜单栏"Rster tab → Spatial → Morphological"工具下有个Function选择列表,里面有Erode(腐蚀)、Dilate(膨胀)、Open(开运算)、Close(闭运算)这四个函数,今天我们用Python的CV2库对相关的概念做一下深入地理解。(附源代码) 前期准备: 模版的选择: 3*3的矩形结构模版 kernel01 = cv . getStructuringElement ( cv . MORPH_RECT , ( 3 , 3 ) ) # 矩形结构 [[1 1 1] [1 1 1] [1 1 1]] 5*5的椭圆结构模版 kernel02 = cv . getStructuringElement ( cv . MORPH_ELLIPSE , ( 3 , 3 ) ) # 椭圆结构 [[0 0 1 0 0] [1 1 1 1 1] [1 1 1 1 1] [1 1 1 1 1] [0 0 1 0 0]] 3*3的十字结构模版 kernel03 = cv . getStructuringElement ( cv .

图像的二值化原理和实现

与世无争的帅哥 提交于 2019-11-27 00:11:16
1、 图像的二值化的基本原理 图像的二值化处理就是讲图像上的 点的灰度置为 0 或 255 ,也就是讲整个图像呈现出明显的黑白效果。即将 256 个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为 0 或 255 的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。 所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为 255 表示,否则这些像素点被排除在物体区域以外,灰度值为 0 ,表示背景或者例外的物体区域。 如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。 2、 图像的二值化的程序实现 以下程序是用QT实现的 bool convertGray:

二值图像分析案例精选

徘徊边缘 提交于 2019-11-26 00:44:55
说起来,我还是挺惭愧的,去年四月份连续在51CTO博客发表了一波技术文章,后来因为自己太忙就慢慢忘记更新拉,前两天一看访问量居然突破100+万拉,感谢各位的厚爱与支持,更觉得51CTO博客改版之后真的是很棒!所以又来更新了! 最近一直有人向我提问很多二值图像分析相关的问题,特别选择了两个典型的轮廓分析问题。进行分析与编码实现与演示,废话不多说,先看第一个问题。 问题一 问题描述如下 想找到工具盘中间缺少的几个点,统计出可以看到的工件数目 仔细分析图像发现,中间都毫无另外的有个白色很亮的圆圈,这个给了我两个思路 可以通过霍夫变换检测圆来提取到 可以通过二值图像分析来提取 + 轮廓分析来提取到这些点 得到这些轮廓点之后通过分析整个轮廓区域得到倾斜角度,进行纠偏,然后通过X与Y投影进行分割,得到每个零件的中心位置坐标,根据每一行的间隔设置阈值,从而实现缺少部分部分的标出与件数统计,确定了这样的思路以后,我就开始了写代码。代码实现是基于轮廓分析的思路,因为这个方法,用的阈值比较少,有利于算法稳定性检测。演示各部输出。二值化处理之后(形态学处理): 轮廓发现与校正角度之后 投影分析与统计结果如下 此外基于霍夫也是可以尝试的,霍夫的二值化效果也比较好,显示如下: 感兴趣的同学可以自己继续尝试下去。 问题二 描述如下: 如何统计下图中的对象个数,原图如下 看到这个图像之后,个人觉得解决十分简单