python+opencv实现连通区域分离
python+opencv实现连通区域分离
步骤:
1.扫描整幅图像,判断当前像素点是前景点同时还未打上标签,将该像素点入栈。
(1)将当前栈中top元素出栈,通过4邻域判断(也需要同时满足是前景点未打上标签)进行元素入栈,同时对入栈的元素打上标签。
(2) 重复(1)中的操作,直到栈表为空,退出当前循环,至此一个连通域的标签打完。
2.重复1中的所有操作。
代码部分
def Connected_Separation(image):
image_shape = image.shape
rows = image_shape[0]
cols = image_shape[1]
index_map = np.zeros((rows, cols))
label = 1
for row in range(rows):
for col in range(cols):
# 扫描当前像素为前景且没有被访问过,将其入栈
if image[row][col] == 1 and index_map[row][col] == 0:
# 创建新站
s = []
# 入栈
s.append((row, col))
# 我们将(row,col)赋予一个label值
index_map[row][col] = label
# 循环判断4连通域是否与这个(row,col)相连,如果相连进行入栈操作,如果这个栈不为空
while (len(s) != 0):
# 出栈,判断出栈元素的4领域
a = s.pop()
# 这边出栈的元素是不是还得赋予一个值
# 判断,可以入栈的元素,但是我还需要判断这个栈里面是否有这个元素,如果存在这个元素,那么就不能入栈
p=[]
p.append((a[0],a[1]-1 if a[1]-1>0 else 0))
p.append((a[0],a[1]+1 if a[1]+1
p.append((a[0]-1 if a[0]-1>0 else 0,a[1]))
p.append((a[0]+1 if a[0]+1
# 判断栈里面是否以已经存在需要入栈的元素
for i in range(4):枣庄妇科医院哪家好 http://mobile.0632dffk.com/
if image[p[i][0],p[i][1]] == 1 and index_map[p[i][0],p[i][1]] == 0:
s.append(p[i])
index_map[p[i][0], p[i][1]] = label
# 当栈里面的元素全部出去之后,我们的while就结束
if len(s) == 0:
label += 1
break
return index_map
if __name__ == '__main__':
image = cv2.imread('../imgs/2.jpg', 0)
# 进行二值化
ret1, th1 = cv2.threshold(image, 0, 255, cv2.THRESH_OTSU) # 也就是大于0的都写出255
# 翻转
image = 1 - th1 / 255
kernel = np.ones((2, 2))
# 孔洞填补(闭运算)
image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel=kernel)
index_map =Connected_Separation(image)
plt.imshow(image, plt.cm.gray)
plt.show()
©著作权归作者所有:来自51CTO博客作者ckllf的原创作品,如需转载,请注明出处,否则将追究法律责任更多相关文章
- Java技巧分享:判断字符串是否为空常的三种方法
- 前端vue面试题大全
- html+css基础入门教程篇之伪元素
- 单位em和rem区别,box-sizing定义边界,VW和VH,字体图标,定位原理
- 第四课 box-sizing功能示例、相对定位与绝对定位的区别与联系
- box-sizing功能、相对定位与绝对定位
- 选择器优先级、模块化样式组件、伪类选择器
- 1. 实例演示box-sizing属性; 2. 实例演示常用的元素居中方式
- 使用C语言判断密码是否正确,三次失败就退出,超详细教程!!