gpt4 book ai didi

python - 二值化后如何从图像中去除粗糙的线条伪影

转载 作者:太空宇宙 更新时间:2023-11-03 20:07:41 24 4
gpt4 key购买 nike

我遇到了一个问题,我想区分对象和 background (具有带背光的半透明白板)即在背景中引入固定的粗线并与对象合并。我现在的算法是从相机获取图像,用高斯模糊进行平滑,然后从 HSV 中提取值分量,使用 Wolf 方法应用局部二值化以获得 binarized image之后使用 OpenCV 连接组件算法,我删除了一些未连接到对象的小工件,如 here 所示。 。现在只有这个线条工件与对象合并,但我只想要如 image 中所示的对象。 。请注意,二进制图像中有 2 条线,因此使用 8 个连接的逻辑来检测不形成循环的线是不可能的,这也是我的想法和尝试。这是代码

size = np.size(thresh_img)
skel = np.zeros(thresh_img.shape,np.uint8)
element = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
done = False

while( not done):
eroded = cv2.erode(thresh_img,element)
temp = cv2.dilate(eroded,element)
temp = cv2.subtract(thresh_img,temp)
skel = cv2.bitwise_or(skel,temp)
thresh_img = eroded.copy()

zeros = size - cv2.countNonZero(thresh_img)
if zeros==size:
done = True

# set max pixel value to 1
s = np.uint8(skel > 0)

count = 0
i = 0
while count != np.sum(s):
# non-zero pixel count
count = np.sum(s)
# examine 3x3 neighborhood of each pixel
filt = cv2.boxFilter(s, -1, (3, 3), normalize=False)
# if the center pixel of 3x3 neighborhood is zero, we are not interested in it
s = s*filt
# now we have pixels where the center pixel of 3x3 neighborhood is non-zero
# if a pixels' 8-connectivity is less than 2 we can remove it
# threshold is 3 here because the boxfilter also counted the center pixel
s[s < 1] = 0
# set max pixel value to 1
s[s > 0] = 1
i = i + 1

任何以代码形式提供的帮助将不胜感激。

最佳答案

由于您已经在使用connectedComponents,所以最好的方法是不仅排除那些小的组件,而且排除那些接触图像边界的组件。您可以使用 connectedComponentsWithStats() 知道要丢弃哪些组件,它还为您提供有关每个组件的边界框的信息。

或者,非常类似,您可以从 connectedComponents() 切换到 findContours(),它直接为您提供Components,以便您可以丢弃外部的和小的检索您感兴趣的部分。

关于python - 二值化后如何从图像中去除粗糙的线条伪影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58888092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com