gpt4 book ai didi

python - 如何使用 opencv - python 去除图像噪声?

转载 作者:太空狗 更新时间:2023-10-30 02:15:07 25 4
gpt4 key购买 nike

我正在处理皮肤图像,以识别皮肤瑕疵,并且由于噪声的存在,主要是毛发的存在,这项工作变得更加复杂。

我有一个图像示例,我在其中尝试仅突出显示皮肤 Blob ,但由于毛发数量众多,该算法无效。有了这个,我希望你能帮我开发一种算法来去除或减少头发的数量,这样我就可以只突出我感兴趣的区域 (ROI),也就是 Blob 。

用于突出皮肤瑕疵的算法:

import numpy as np
import cv2

#Read the image and perform threshold
img = cv2.imread('IMD006.bmp')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.medianBlur(gray,5)
_,thresh = cv2.threshold(blur,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

#Search for contours and select the biggest one
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = max(contours, key=cv2.contourArea)

#Create a new mask for the result image
h, w = img.shape[:2]
mask = np.zeros((h, w), np.uint8)

#Draw the contour on the new mask and perform the bitwise operation
cv2.drawContours(mask, [cnt],-1, 255, -1)
res = cv2.bitwise_and(img, img, mask=mask)

#Display the result
cv2.imwrite('IMD006.png', res)
#cv2.imshow('img', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用的示例图像: enter image description here

如何处理这些噪音以改善我的兴趣区域?

最佳答案

这是一项相当困难的任务,因为头发超过了您的投资返回率(痣)。我不知道如何帮助将它从痣上去除,但我可以帮助去除没有毛发的图片中的背景。对于去除痣上的毛发,我建议您搜索“从图像中去除水印”和“深度神经网络”来训练模型去除毛发(请注意,此任务将非常困难)。

也就是说,为了去除背景,您可以尝试使用您已经拥有的相同代码来进行无毛检测。你会得到一个像这样的二值图像:

enter image description here

现在您的区域充满了白线(毛发),它们越过您的轮廓,即您的投资返回率,cv2.findContours() 也会将它们挑出来,因为它们是相连的。但是如果你看图片你会发现白线很细,你可以通过对图像执行打开(cv2.morphologyEx)将其从图像中删除。开运算先腐 eclipse 后膨胀,因此当您用足够大的内核大小腐 eclipse 图像时,白线会消失:

enter image description here

现在你有一个白点,周围有一些噪音,你可以通过执行另一个扩张来连接它(cv2.dilate()):

enter image description here

为了使 ROI 更平滑一些,您可以模糊图像 cv2.blur():

enter image description here

之后您可以创建另一个阈值并搜索最大的轮廓。最终结果:

enter image description here

希望对您有所帮助。干杯!

示例代码:

import numpy as np
import cv2

# Read the image and perfrom an OTSU threshold
img = cv2.imread('hair.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

# Remove hair with opening
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)

# Combine surrounding noise with ROI
kernel = np.ones((6,6),np.uint8)
dilate = cv2.dilate(opening,kernel,iterations=3)

# Blur the image for smoother ROI
blur = cv2.blur(dilate,(15,15))

# Perform another OTSU threshold and search for biggest contour
ret, thresh = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
_, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = max(contours, key=cv2.contourArea)

# Create a new mask for the result image
h, w = img.shape[:2]
mask = np.zeros((h, w), np.uint8)

# Draw the contour on the new mask and perform the bitwise operation
cv2.drawContours(mask, [cnt],-1, 255, -1)
res = cv2.bitwise_and(img, img, mask=mask)

# Display the result
cv2.imshow('img', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

关于python - 如何使用 opencv - python 去除图像噪声?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52748270/

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