图像形态学提取边界和区域填充

1、二值图像边界提取、轮廓提取

如果一个点的8邻域都是1,则可以认为这个点是内部的点而不是边界上的点,可以删除这类点,剩下的就是边界上的点。根据腐蚀的特性,使用3*3的结构元素对图像进行腐蚀,可以得到内部的点,那么再用原图减去腐蚀图,就得到了图像的边界。

imgPath = ‘E:\opencv_pic\src_pic\pic1.bmp‘;
img = imread(imgPath);
img=rgb2gray(img);
img = 255-img;

se = strel(‘square‘, 5);
img2 = imerode(img, se);
subplot(1,3,1),imshow(255-img),title(‘原始图像‘);
subplot(1,3,2),imshow(255-img2),title(‘腐蚀图像‘);
subplot(1,3,3),imshow(255-(img-img2)),title(‘边界点‘);

2、形态学方法图像区域填充

区域填充可以认为是边界提取的反过程,已知边界情况下得到边界包含的区域。

已知某一图形,具有8连通边界,其内部有空白区域,那么怎么填充内部?

在图像内部确认一点,然后以此点为基准,循环膨胀,只要控制住膨胀后的图没有超过边界即可。

初始化:B0=种子点

循环膨胀: Do: Bi+1 = (Bi ⊕ S) ∩ Ac; Until Bi+1 = B

使用S对图像B0进行膨胀,如果膨胀后的图超过了边界,则与图像A的补集A做与运算,把膨胀后的图限制在图像A内部。随着B的膨胀,B的区域不断的增长,但是每次增长后的图像都被限制在图像A的内部,所以最终必定填充满图像A,此时停止生长。

a)原始图像

b)读取图像A以及补集Ac

imgPath = ‘E:\opencv_pic\src_pic\pic1-1.bmp‘;
img1 = imread(imgPath); % 前景图
img0 = 255-img1; % 取反景图
subplot(1,2,1),imshow(img1),title(‘原始图像‘);
subplot(1,2,2),imshow(img0),title(‘补集图像‘);

c)图像膨胀

figure;
[m,n]= size(img0);
B0 = zeros(m,n);
B0(50, 150) = 1;
se = [0 1 0;1 1 1;0 1 0];
B1=imdilate(B0, se) & img1;
B2=imdilate(B1, se) & img1;
subplot(1,3,1),imshow(B0),title(‘结构元素se‘);
subplot(1,3,2),imshow(B1),title(‘腐蚀B1‘);
subplot(1,3,3),imshow(B2),title(‘腐蚀B2‘);

放大后观察,B0是单个像素点,B1是3*3十字元素,B2是5*5十字元素。

d)循环膨胀、填充区域增长

figure;
while 1
    imshow(B2);
    if B1 == B2
        break;
    else
        B1 = B2;
        B2=imdilate(B1,se) & img1;
    end
end

图像增长过程如下图。

填充过程如下图,先从B0开始膨胀,循环膨胀图像不断生长,当图像超出边界后与背景图像(补集)相交限制图像的边界。直到图像无法再生长,图像完成内部区域填充。

3、参考文献

1、《数字图像处理与机器视觉》,张铮、徐超、任淑霞、韩海玲编著

尊重原创技术文章,转载请注明。

https://www.cnblogs.com/pingwen/p/12245857.html

原文地址:https://www.cnblogs.com/pingwen/p/12245857.html

时间: 2024-10-19 14:57:22

图像形态学提取边界和区域填充的相关文章

OpenCV学习 7:图像形态学:腐蚀、膨胀

原创文章,欢迎转载,转载请注明出处 首先什么是图像形态学?额,这个抄下百度到的答案.基本思想:    用具有一定形态的结构元素去度量和提取图像中的对应形状已达到对图像分析和识别的目的,形态学图像处理表现为一种领域运算方式(这个和前面的模糊运算是一样的运算方式),效果取决于结构元素(就是前面smooth里面的核)的大小,内容以及逻辑运算的性质.看了这些定义是不是很晕,对很晕...我比较关心的是它的用途和怎么计算.    用途是:简化图像数据,保持他们基本的形状特性,并出去不相干的结构.    基本

OpenCV与EmguCV中的图像轮廓提取

轮廓是图像中表示边界的一系列点的集合. 虽然边缘检测算法可以根据像素间的差异检查出轮廓边界的像素,但是它并没有把轮廓做为一个整体表示出来.所以下一步工作是把这些边缘检测出来的像素组装成轮廓. openCV中可以用findContours()函数来从二值图像中提取轮廓. openCV中一般用序列来存储轮廓信息.序列中的每一个元素是曲线中一个点的位置. 函数findContours()从二值图像中寻找轮廓.findContours()处理的图像可以是Canny()后得到的有边缘像素的的图像,也可以是

Atitit 图像处理—图像形态学(膨胀与腐蚀)

Atitit 图像处理-图像形态学(膨胀与腐蚀) 1.1. 膨胀与腐蚀1 1.2. 图像处理之二值膨胀及应用2 1.3. 测试原理,可以给一个5*5pic,测试膨胀算法5 1.4. Photoshop里面的处理5 1.5. 类库的处理,好像没找到jhlabs,6 1.6. Attilax 源码6 1.1. 膨胀与腐蚀 说概念可能很难解释,我们来看图,首先是原图: 膨胀以后会变成这样: 腐蚀以后则会变成这样: 看起来可能有些莫名其妙,明明是膨胀,为什么字反而变细了,而明明是腐蚀,为什么字反而变粗了

图像处理之图像切割---提取信封上的邮编

1.题目: 分割图像,提取信封上的邮编. 2.算法原理: 原创:梁毅军(西安交大图像所,[email protected]) (1) 线框提取: 输入f(x,y)为彩色图像,输出g(x,y)为灰色图像. g(x,y) = T[f(x,y).R, f(x,y).B, f(x,y).R]    T为变换函数 T(R, G, B) = max{R- (G+B)/2 , 0}; 经过T函数变换后,红色的线框被提取出来,值为255,其余颜色的点灰度值变为0. (2)字符框位置的提取:投影算法 向x轴投影 

图像形态学操作—腐蚀膨胀深入

这里我们主要想讲解冈萨雷斯的数字图像处理这本书上膨胀腐蚀的定义及用opencv实现的结果,然后对比它们之间的差异. 一:opencv实现 在这之前可以看我的另外一篇blog:http://blog.csdn.net/lu597203933/article/details/17184439 膨胀: 案例代码: int main() { int a[8][8] = { {0,0,0,0,0,0,0,0}, {0,0,5,1,0,0,1,1}, {0,1,0,1,0,1,0,0}, {0,1,1,2,

OpenCV3入门(七)图像形态学

1.膨胀 所谓的图片的膨胀处理,其实就是在图像的边缘添加像素值,使得整体的像素值扩张,进而达到图像的膨胀效果. 对Z2上元素集合A和结构体元素S,使用S对A进行腐蚀,记作: A⊕S={z|(S)z ∩ A ≠ Ø} 让位于图像圆点的结构元素S在Z平面上移动,如果S的圆点移动到z点时,S与A有公共的交集(非空集),则认为这样的z点构成的集合是S对A的膨胀图像. 函数原型: CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, Inpu

图像形态学及更通用的形态学的原理及细节

在试图找到连通分支(具有相似颜色或强度的像素点的大块互相分离的区域)时通常使用膨胀操作.因为在大多数情况下一个大的区域可能被噪声.阴影等类似的东西分割成多个部分,而一次轻微的膨胀又将使这些部分“融合”在一起 如果图像不是二值的,那么膨胀和腐蚀起到的作用不是很明显.在处理灰度和彩色图像时,更通用的cvMorphologyEx可提供更有用的操作. 平滑处理与膨胀腐蚀用的核不同,分别是卷积核与形态核,形态核不需要任何的数值填充核,第132页讲高斯滤波器的时候提到高斯卷积核 开运算先腐蚀后膨胀,可以用来

高分辨率图像建筑物提取数据集制作

目录结构 /dataset/ xxxx.tif # 原始图像 image-3000 0.tif # 切割后的tif 1.tif ........ 0.json # 生成的json文件也放在该文件夹下 1.json ....... 0_json # 调用labelme_json_to_dataset 0.json 生成的0_json文件夹 img.png # 原始图片的png格式 info.yaml label.png # 标签图片 label_names.txt label_viz.png 1_

GDAL库——读取图像并提取基本信息

GDAL库是一个跨平台的栅格地理数据格式库,包括读取.写入.转换.处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持).它使用了一个单一的抽象数据模型就支持了大多数的栅格数据.这里有GDAL库支持的格式:http://www.gdal.org/formats_list.html 注:本文在Qt开发环境下使用GDAL库. 在Qt中使用GDAL库时,除了要加gdal_priv.h头文件外,还需要在xxx.pro文件内加上LIBS += -lgdal ,文件用可编辑的文档打开. 使用GDAL