Opencv图像连通域
【摘要】
本文介绍在图像处理领域中较为常用的一种图像区域(Blob)提取的方法——连通性分析法(连通区域标记法)。
文中介绍了两种常见的连通性分析的算法:1)Two-pass;2)Seed-Filling种子填充,并给出了两个算法的基于OpenCV的C++实现代码。
【注释】
1、这里的扫描指的是按行或按列访问以便图像的所有像素,算法中采用的是按行扫描方式;
2、图像记为B,为二值图像:前景像素(pixel value = 1),背景像素(pixel value = 0);
3、label从2开始计数;
4、像素相邻关系有两种:4-领域、8-领域,本文算法采用4-邻域;

图1(像素相邻关系图)
一、Two-pass算法
1、第一次扫描(Frist Pass)
判断B(x,y)像素是否为前景像素(即B(x,y)==1),
如果B(x,y)==1,判断B(x,y)的邻域像素点像素值是否为B(Neighbors)==0(注意这里指的是像素点的值,不是像素点的lable值),
如果都为B(Neighbors)==0,那么B(x,y)==lable;lable加1;
如果B(Neighbors)存在不为0的像素值(即邻域Neighbors中存在lable值),那么B(x,y)等于邻域中最小的lable值,(B(x,y)== min{Neighbors} ;),
记录lable值产生变化的点(相等关系),并将变化lable值保存到某一列表中。(相等关系:如图1中所示,B(2,1)和B(1,1)、B(0,2)相邻,但是B(2,1)的lable==1,B(1,1)的lable==3,所以将lable值为1,3的像素视为相等。即连通)
图2(相等关系演示图)
2、第二次扫描(Second Pass)
访问当前像素B(x,y),如果B(x,y) > 1:
找到与label = B(x,y)同属相等关系的一个最小label值,赋予给B(x,y);
完成扫描后,图像中具有相同label值的像素就组成了同一个连通区域。
图3(Two-pass算法动态演示图)
二、Seed Filling(种子填充法)
1、扫描图像,如果像素点B(x,y) == 1:
那么将B(x,y)作为种子(像素位置),并赋予其一个label,然后将该种子相邻的所有前景像素都压入栈中(队列中);
然后获取栈中的第一个像素,赋予其相同的label,然后再将与该像素相邻的所有前景像素都压入栈中;
重复b步骤,直到栈为空;
2、重复第(1)步,直到扫描结束;扫描结束后,就可以得到图像B中所有的连通区域;
图4 Seed Filling(种子填充法)动态图演示
参考文章:
http://blog.csdn.net/cooelf/article/details/26581539
http://blog.csdn.net/icvpr/article/details/10259577
Opencv图像连通域的更多相关文章
- OpenCV: 图像连通域检测的递归算法
序言:清除链接边缘,可以使用数组进行递归运算; 连通域检测的递归算法是定义级别的检测算法,且是无优化和无语义失误的. 同样可用于寻找连通域 void ClearEdge(CvMat* MM,CvPoi ...
- OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...
- 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...
- Opencv 图像叠加 添加水印
Opencv 图像叠加 添加水印 C++: void Mat::copyTo(OutputArray m) const C++: void Mat::copyTo(OutputArray m, Inp ...
- opencv图像读取-imread
前言 图像的读取和保存一定要注意imread函数的各个参数及其意义,尽量不要使用默认参数,否则就像数据格式出现错误(here)一样,很难查找错误原因的: re: 1.opencv图像的读取与保存; 完
- 学习 opencv---(12)OpenCV 图像金字塔:高斯金字塔,拉普拉斯金字塔与图片尺寸缩放
在这篇文章里,我们一起学习下 图像金字塔 的一些基本概念,如何使用OpenCV函数pyrUp和pyrDown 对图像进行向上和向下采样,以及了解专门用于缩放图像尺寸的resize函数的用法.此博文一共 ...
- [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget(第二部分)
本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...
- [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget (第一部分)
本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...
- 关于OpenCV图像操作的默认参数问题
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51559490 在使用OpenCV以及其 ...
随机推荐
- Python类(七)-类的特殊成员方法
__doc__ 用来表示类的描述信息 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(object) ...
- 球的移动(move)
有n个盒子(1<=N<=1000)围成一个圈,每个盒子有ai个球,所有盒子的球的总数小于等于n.每一次移动,可以把一个球移动到它的一个相邻的盒子内.现在要使得每个盒子的球数<=1,求 ...
- Java enum(枚举)使用详解之四
用法五:实现接口 所有的枚举都继承自java.lang.Enum类.由于Java 不支持多继承,所以枚举对象不能再继承其他类. public interface Behaviour { void pr ...
- form(去掉关闭按钮,禁止调整大小)
禁止Form窗口调整大小方法:FormBorderStyle 设为FixedSingle: 不能使用最大化窗口: MaximuzeBox 设为False: 不能使用最小化窗口: MinimizeB ...
- Logstash-2.4.1的下载(图文详解)
第一步:进入Elasticsearch的官网 https://www.elastic.co/ 第二步:点击downloads https://www.elastic.co/downloads 第三步: ...
- Hadoop集群 能打开50070端口不能打开8088端口 web浏览器界面
两天时间,知道现在才把这个东西解决 解决的灵感来源于百度知道一句话谢谢这个哥们 谢谢这个哥们! 我的目录是在/home/hadoop/tmp 大家如果遇到这个问题,希望能按照我的办法去试一下 2 ...
- 【总结整理】WebGIS基础
1.万维网:www是world wide web的简称是在超文本基础上形成的信息网 2.互联网:即广域局域网及单机按照一定的通讯协议组成的国际计算机网络 3.WebGIS:网络地理信息系统,指基于In ...
- Codeforces 1108E (Array and Segments) 线段树
题意:给你一个长度为n的序列和m组区间操作,每组区间操作可以把区间[l, r]中的数字都-1,请选择一些操作(可以都不选),使得序列的最大值和最小值的差值尽量的大. 思路:容易发现如果最大值和最小值都 ...
- opencv生成灰度图并保存
#include <opencv2/opencv.hpp>#include <iostream> using namespace cv;using namespace std; ...
- 用C++实现void reverse(char* str)函数,即反转一个null结尾的字符串.
void reverse(char* str) { char *end = str, *begin=str; char temp; while(*end!='\0') { end++; } end-- ...