使用Opencv和Python删除图片中的小边缘

3

我是OpenCV的新手。我正在尝试通过Python中的OpenCV创建一个人物的黑白卡通图片。我已经有所成功,创建了一个人物的黑白卡通图片。但是问题是,我想要从输出图像中删除小黑点。请帮帮我。我想要移除如图所示的这些黑点。

以下是我的代码:

    image = cv2.imread('input1.jpg')
    img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    img_gray = cv2.medianBlur(img_gray, 5)
    edges = cv2.Laplacian(img_gray, cv2.CV_8U, ksize=5)
    ret,mask =cv2.threshold(edges,100,255,cv2.THRESH_BINARY_INV)
    image2 = cv2.bitwise_and(image, image, mask=mask)
    cv2.imshow("Mask", mask)

enter image description here


你可以尝试再次对最终图像执行中值模糊。 - Jeru Luke
在我的答案中添加了一些代码,请尝试在将图像转换为二进制后再次应用中值滤波器 :) - George K
这个孩子很吓人,顺便说一句... - lucians
这个孩子本来不吓人,是我的代码让他变得吓人了。 - Hasnain
2个回答

2
你需要使用OpenCV对图像应用滤波器来去除黑点(也称为“噪声”)。有许多2D卷积可以应用于图像。

中值滤波器

该滤波器将找到每个像素及其周围像素的中值。它可以收集离中心越远的像素,从而放大效果。

高斯模糊

您可以应用另一种类型的模糊来消除噪声,可能不是完全消除,但肯定会减少其影响。如果您正在处理黑白图像,似乎确实可以完全消除噪声。

编辑

尝试在应用阈值后再次应用中值滤波器,这应该比之前更好地去除噪声,因为值是二进制的:

image = cv2.imread('input1.jpg')
img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
img_gray = cv2.medianBlur(img_gray, 5)
edges = cv2.Laplacian(img_gray, cv2.CV_8U, ksize=5)
ret,mask =cv2.threshold(edges,100,255,cv2.THRESH_BINARY_INV)
image2 = cv2.bitwise_and(image, image, mask=mask)
image2 = cv2.medianBlur(image2, 3)  # this
cv2.imshow("Mask", mask)

希望这有所帮助!

0
你也可以尝试找到小轮廓并将它们绘制出来。就像这样:
img = cv2.imread('input1.jpg')
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,220,255,0)
_, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
number_contours = len(contours)
print(number_contours)
for i in range(0, number_contours):
    lenght = cv2.contourArea(contours[i])
    if float(1)<lenght<float(5000):
        cv2.drawContours(img, contours[i], 0, (255,255,255), 7)
cv2.imshow("image", img)
cv2.imwrite("brez_pikic.jpg", img)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接