connected components algorithm连通图算法

什么是connected components algorithm?

用通俗的话说就是一个图像的前景部分有几部分构成,用下面的这幅图作为例子就是有三部分组成(用红线画出来了)

当我们在使用这个算法的过程中不可避免的会遇到这两个专业名词:
四邻域: 包括了中心点的上下左右四个方向的点

八邻域:包括周围8个点的关系,我自己认为8邻域的算法准确度更高

对图像进行标注

将该算法实施之后得到的图像会有标注,例如这一部分的区域是属于同一类的。为了让视觉效果等突出,我将采用connected Components algorithm算法的图像进行区域的上色(见下图)


算法复现以及伪代码

算法一:Two pass 法

伪代码:
input: image
output:bgr_image
将image进行二值化,但是不可以改变图片的轮廓信息
#第一遍pass
1.按行搜索不为零的元素,并查找其周围8(4)邻域是否有被标记过的元素;若有则将该点标记为邻域中最小的类别。并将邻域的类别进行union,说明虽然他们的类别不一样,但是实际上是同一类的。
#第二遍pass
1.按行搜索,将每一个类别不为零的pixel的类别标记为与之对应的集合里面的最小值。
该步骤结束就可以得到一个图像中的联通部分了
# -*- coding: utf-8 -*-
"""
4邻域关系做图像连通分割效果不好,改用8邻域@author: ASUS
"""
import numpy as np
import cv2
import matplotlib.pyplot as pltdef find(image_class,pre_class,row,col):#若我们按行搜索,则该点的左边,左上,正上,右上会用于对其查找x_move = [0,-1,-1,-1]y_move = [-1,-1,0,1]x = []y = []length,width = image_class.shapefor i in range(len(x_move)):a = row + x_move[i]b = col + y_move[i]if a >=0 and a < length and b>=0 and b< width and image_class[a,b]>0:x.append(a)y.append(b)if len(x)!= 0:class_p = np.min(image_class[x,y])image_class[row,col] = class_pM = image_class[x,y]index = np.where(M > class_p)if len(index[0]) != 0:for i in range(len(index[0])):weizhi = M[index[0][i]] -1 pre_class[weizhi] = class_pelse:pre_class.append(0)image_class[row,col] = len(pre_class)return image_class,pre_classimage = cv2.imread('morphology.JPG',0)
ret,image=cv2.threshold(image,50,255,cv2.THRESH_BINARY) #这里的binary的阈值不能太高,太高会改变图像的连接信息
index = np.where(image == 255)
image_class = np.zeros(image.shape,dtype = np.uint8)
pre_class = []
for i in range(len(index[0])):image_class,pre_class = find(image_class,pre_class,index[0][i],index[1][i])for i in range(len(pre_class)):k = i+1while pre_class[k-1] != 0:k = pre_class[k-1]image_class[np.where(image_class == i+1)] = kbgr_image = np.zeros((image.shape[0],image.shape[1],3),dtype = np.uint8)
union = np.unique(image_class)
for i in range(len(union)-1):bgr = np.random.randint(0,255,(3))bgr_image[np.where(image_class == union[i+1])] = bgrplt.subplot(121)
plt.imshow(image,'gray')
plt.title('Original')
plt.axis('off')
plt.subplot(122)
plt.imshow(bgr_image)
plt.title('after connect components algorithm')
plt.axis('off')
plt.show()# cv2.namedWindow('123', cv2.WINDOW_NORMAL)
# cv2.imshow('123',bgr_image)
# a = cv2.waitKey(0)
# cv2.destroyAllWindows()
# print(a)

算法一复现难点:在编写代码的时候发现在union部分会出现难点。需要一些技巧来解决。我用的是父节点法,具体解决方法见代码。
算法动图描述:

算法二:遍历法
该方法比较简单,易于实现,相比来说其运行时间和空间复杂度相比于第一种都会好一些。

首先我们对输入图像进行二值化操作。
按行搜索,遇到不为零的pixel且类别不为零的点:
{1.初始化队列,将该pxiel入队
2.取出队列头并将队列头相连的pxiel入队(需要满足像素值大于零,且class不为零)
3.若队列空,则跳出,继续搜索。否则返回2
}
直到对完整的一幅图像完成搜索。

参考的博客

https://iq.opengenus.org/connected-component-labeling/

connected components algorithm连通组件算法相关推荐

  1. Tarjan's strongly connected components algorithm的一些想法

    Tarjan的极大强连通子图(strongly connected components,SCC)算法基于深度优先遍历(DFS)实现.本文就尝试从深度优先遍历的角度思考一下Tarjan的方法是如何找出 ...

  2. Spark GraphX算法 - Connected Components(连通分支)算法

    1.官网地址 http://spark.apache.org/docs/latest/graphx-programming-guide.html#connected-components 2.demo ...

  3. C#,图论与图算法,寻找图强连通单元(Strongly Connected Components)的罗伯特·塔扬(Robert Tarjan‘s Algorithm)算法与源程序

    Tarjan算法是一种高效的图算法,它利用图的深度优先搜索遍历,在线性时间内找到有向图中的强连通分量.使用的关键思想是,强连通组件的节点在图的DFS生成树中形成子树. 将有向图划分为强连通分量的任务非 ...

  4. 大数据——GraphX之Connected Components算法及Spark实现

    GraphX之Connected Components算法及Spark实现 Connected Components Demo 扩展 Connected Components 源码 Compute t ...

  5. JavaScript实现strongly Connected Components 强连通分量算法(附完整源码)

    JavaScript实现strongly Connected Components 强连通分量算法(附完整源码) Comparator.js完整源代码 LinkedListNode.js完整源代码 L ...

  6. OpenCV连接的组件Connected Components的实例(附完整代码)

    OpenCV连接的组件Connected Components的实例 OpenCV连接的组件Connected Components的实例 OpenCV连接的组件Connected Component ...

  7. 【CodeForces - 920E】Connected Components? (dsu,补图连通块,STLset+map,bfs 或bitset)

    题干: You are given an undirected graph consisting of n vertices and  edges. Instead of giving you the ...

  8. [Swift]LeetCode323. 无向图中的连通区域的个数 $ Number of Connected Components in an Undirected Graph...

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  9. Efficient Organized Point Cloud Segmentation with Connected Components论文阅读

    文章目录 Efficient Organized Point Cloud Segmentation with Connected Components 方法 A Connected Component ...

最新文章

  1. 面试官:你能说说MyBatis拦截器原理吗?
  2. JGG:COVID-19感染导致儿童上呼吸道和肠道菌群持续失衡
  3. LINUX 操作记录到syslog,并发送到syslog服务器上
  4. 【哲学】不可知论是什么?agnosticism
  5. noip 2017棋盘
  6. 在项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?
  7. 丢了好几年的 Auto CAD又拿起来......
  8. pytorch实现数据增强的原理
  9. linux禁止客户端上传文件_Linux 几种上传文件到linux服务的方法
  10. docker : unable to prepare context: context must be a directory
  11. BZOJ 1066[SCOI2007]蜥蜴
  12. 02、Linux下sshd以及openssl的知识点
  13. Unity 不使用BMFont创建Font字体
  14. wineskin下plsql解决中文乱码问题
  15. 模块式工业机器人柔性自动化生产线实训系统(五站)
  16. 天邑ty1208z海思3798刷版本_[乐天固件]魔百和M301H-当贝版卡刷包-海思3798M
  17. 怎么AI生成绘画图片?试试这几款软件吧
  18. 吻过你这三个地方的男人,定是对你动了真情,错不了
  19. Vue-router,从基础入门到手拿大厂Offter,看这篇文章就够了。
  20. 【12月】RT-Thread VL53L0X TOF传感器驱动实现

热门文章

  1. AutoCAD.net-错误消息大全
  2. 信息化 不只是技术 某公司局域网改造实例 转
  3. 拉勾网数据分析师职位分析
  4. Brodmann 分区
  5. 【R语言】ggplot2---散点图的边框和颜色填充问题
  6. 升级产品思维,三年内让自己的收入翻十倍
  7. C++餐厅点餐结算系统
  8. 计算机系统的储存单位及换算关系,计算机储存单位和换算关系
  9. Win10如何开启TLS1.3
  10. CAN总线入门、LIN总线入门文档-蓝凑云下载。 LDFEditor下载 ISO-14229、15765、11898下载与阅读