如何解决在不超过 n 个像素的地方连接断开连接的组件
我想知道是否有这样的库实现。
在 OpenCV 中,我们有一个概念,即寻找具有 4 路或 8 路连接的连接组件。我希望能够这样做,然后弥合断开连接的组件之间的差距,只要只需要翻转 1 个像素即可。请参阅下面的图片以获取示例
两个 4 路连接组件,我们可以在其中弥合差距,使它们成为一个 4 路连接组件。所以我可以使用像 connect4way(max_bridge_size=1)
这样的函数来做到这一点
两个 4 路连接组件,我们可以在其中弥合差距,使它们成为一个 8 路连接组件。使用 connect4way(max_bridge_size=1)
会失败,但我可以使用 connect8way(max_bridge_size=1)
来实现这一点。
我确实意识到,在某些情况下,经常没有确定性的方式来执行我的要求,尤其是对于 max_bridge_size > 1
的情况。不过,我问。
解决方法
我一直在考虑这个问题并认为我很接近,但我不确定你到底想要什么,而且还没有你的代表性图像。您或其他人或许可以完成它。
基本思想是用唯一的数字标记每个白色斑点的所有像素。然后通过查看 3x3 正方形的图像,并报告存在多个唯一邻居的任何像素 - 即位于 2 个不同标记的斑点旁边的任何像素。
#!/usr/bin/env python3
import cv2
import numpy as np
from scipy.ndimage import label,generate_binary_structure,generic_filter
def bridger(P):
"""
We receive P[0]..P[8] with the pixels in the 3x3 surrounding window.
We want to identify pixels with two different neighbouring labels plus background.
Maybe we want to check the centre pixel P[4] is black?
"""
neighbours = len(np.unique(P)) - 1
if neighbours > 1:
return 255
return 0
# Load input image
im = cv2.imread('start.png',cv2.IMREAD_GRAYSCALE)
# Threshold to force everything to pure black or white
_,bw = cv2.threshold(im,255,cv2.THRESH_BINARY)
cv2.imwrite('DEBUG-bw.png',bw)
# The default SE (structuring element) is for 4-connectedness,i.e. only pixels North,South,East and West of another are considered connected.
# We want 8-connected,i.e. N,NE,E,SE,S,SW,W,NW,so we need a corresponding SE
SE = generate_binary_structure(2,2)
# Now run a labelling,or "Connected Components Analysis"
# Each "blob" of connected pixels matching our seed will get assigned a unique number in the new image called "labeled"
labeled,nObjects = label(bw,structure=SE)
cv2.imwrite('DEBUG-labels.png',labeled)
print(f'Objects found: {nObjects}')
# Look for bridging pixels in each 3x3 neighbourhood
result = generic_filter(labeled,bridger,(3,3))
# Save result
cv2.imwrite('result.png',result)
起始图像:
标记图像:
结果图像 - 位于青色的像素:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。