gpt4 book ai didi

python - 如何去除图像中对象的边缘噪声

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

我创建了一个衣服蒙版来从图像中提取衣服对象,但是蒙版中包含一些白噪声,如下图所示(外面的黑色区域是背景)。

我想去除蒙版中的“白色”边缘噪声,我尝试使用朴素的方法检查像素值是否 >= 240,结果有所改善但仍不完美,如下所示:

我想完全消除白噪声,但不确定该怎么做。我正在使用 python opencv,如果有人能帮助我,我将不胜感激。

谢谢!

最佳答案

通过扩大阈值图像,我能够从图像中取出稍微大一点的部分并去除所有白色,但从一些无辜区域去除了 1px 的边缘。

结果如下:

enter image description here

这是基于 this answer 的代码:

import cv2
import numpy as np

# Create binary threshold
img = cv2.imread('shirt.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, gray = cv2.threshold(gray, 220, 255, cv2.THRESH_BINARY)

# Dilate the image to join small pieces to the larger white sections
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
gray = cv2.dilate(gray, kernel)

# Create the mask by filling in all the contours of the dilated edges
mask = np.zeros(gray.shape, np.uint8)
_, contours, _ = cv2.findContours(gray, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
if 10 < cv2.contourArea(cnt) < 5000:
# cv2.drawContours(img, [cnt], 0, (0, 255, 0), 2)
cv2.drawContours(mask, [cnt], 0, 255, -1)

# Erode the edges back to their orig. size
# Leaving this out creates a more greedy bite of the edges, removing the single strands
# mask = cv2.erode(mask, kernel)

cv2.imwrite('im.png', img)
cv2.imwrite('ma.png', mask)

mask = cv2.cvtColor(255 - mask, cv2.COLOR_GRAY2BGR)
img = img & mask
cv2.imwrite('fi.png', img)

这个答案的好处是轮廓部分允许您在使用神奇数字 10 时保持较小尺寸的白色区域(我假设这可能不是您想要运行此代码的唯一图像。 ) 如果这不是必需的,那么代码可以简单得多,只需 1) 采用原始阈值,2) 扩大它 3) 在原始图像上将其屏蔽掉。

关于python - 如何去除图像中对象的边缘噪声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52471456/

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