如何使用opencv-python消除图像噪点? [英] How to remove image noise using opencv - python?

查看:1680
本文介绍了如何使用opencv-python消除图像噪点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am working with skin images, in recognition of skin blemishes, and due to the presence of noises, mainly by the presence of hairs, this work becomes more complicated.

我有一个图像示例,其中尝试仅突出皮肤斑点,但是由于头发数量众多,该算法无效.有了这个,我希望您能帮助我开发一种去除或减少头发数量的算法,以便我只能突出显示我感兴趣的区域(ROI).

I have an image example in which I work in an attempt to highlight only the skin spot, but due to the large number of hairs, the algorithm is not effective. With this, I would like you to help me develop an algorithm to remove or reduce the amount of hair so that I can only highlight my area of ​​interest (ROI), which are the spots.

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

Algorithm used to highlight skin blemishes:

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()

使用的示例图像:

如何处理这些噪音,以改善我的关注区域?

How to deal with these noises to the point of improving my region of interest?

推荐答案

这是一项非常困难的任务,因为头发超过了ROI(摩尔).我不知道如何帮助将其从痣中去除,但是我可以帮助去除背景中的毛发,就像照片中没有毛发一样.对于从痣中去除毛发,我建议您搜索从图像中去除水印"和深度神经网络",以训练模型去除毛发(请注意,此任务将非常困难).

This is quite a difficult task becasue the hair goes over your ROI (mole). I don't know how to help remove it from the mole but I can help to remove the backround like in the picture without hairs. For the removal of hairs from mole I advise you to search for "removing of watermarks from image" and "deep neural networks" to maybe train a model to remove the hairs (note that this task will be quite difficult).

话虽如此,为了消除背景,您可以尝试使用已经准备好进行检测的相同代码,而不会出现毛发.您将获得像这样的二进制图像:

That being said, for the removing of background you could try the same code that you allready have for detection without hairs. You will get a binary image like this:

现在您的区域充满了白色线条(头发),这些线条越过轮廓即ROI,cv2.findContours()也将它们选中,因为它们已连接.但是,如果您查看图片,会发现白线很细,可以通过在图像上执行打开(cv2.morphologyEx)将其从图像中删除.开口是侵蚀,然后是膨胀,因此当您以足够大的内核尺寸侵蚀图像时,白线会消失:

Now your region is filled with white lines (hairs) that go over your contour that is your ROI and cv2.findContours() would also pick them out because they are connected. But if you look at the picture you will find out that the white lines are quite thin and you can remove it from the image by performing opening (cv2.morphologyEx) on the image. Opening is erosion followed by dilation so when you erode the image with a big enough kernel size the white lines will dissapear:

现在您的白点周围有一些杂讯,您可以通过执行另一次扩张(cv2.dilate())将其连接起来:

Now you have a white spot with some noises arround which you can connect by performing another dilation (cv2.dilate()):

要使ROI更加平滑,可以使图像模糊化cv2.blur():

To make the ROI a bit smoother you can blur the image cv2.blur():

在那之后,您可以进行其他加工并搜索最大轮廓.最终结果:

After that you can make another treshold and search for the biggest contour. The final result:

希望它会有所帮助.干杯!

Hope it helps a bit. Cheers!

示例代码:

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()

这篇关于如何使用opencv-python消除图像噪点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆