如何从图像的背景中删除感兴趣的区域?

时间:2018-10-08 13:55:45

标签: python opencv image-processing

我开始在图案识别中使用图像处理,并且需要识别皮毛斑点的颜色。这样,我需要从这些图像中去除可能的噪音(例如头发),然后仅在皮肤斑点上工作以识别其颜色。结果,在3D图表中绘制颜色。

enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

首先,我将更改图像的色彩空间,以便可以对图像执行某种阈值操作,以准备进行进一步处理。在示例中,我通过转换为灰色空间并使用OTSU阈值进行了尝试,结果很好。

blur + OTSU的结果:

enter image description here

但是请注意,如果您想使这样的过程自动化,那么您将需要尝试不同的转化方法,因为我认为色素沉着的颜色是不同的。首先,请看一下HSV,灰色,HLS色彩空间以及BINARY,OTSU和ADAPTIVE MEAN阈值。此步骤的关键是使您感兴趣的区域统一起来并与其他噪音区分开。一旦找到答案,就可以开始搜索轮廓。在这种情况下,痣是最大的轮廓,但您应注意,如果还有其他噪音大于该痣,则选择最大的噪音将无效。您将必须制定其他标准来改变观察到的轮廓(例如,其形状,高度和宽度比等)。选择观察到的轮廓后,将其绘制在新的空白蒙版上并执行一些算术运算,如cv2.bitwise_and(),您将得到结果。希望它能给您正确的方向踢。干杯!

示例代码:

#Import all necessery libraries
import numpy as np
import cv2

#Read the image and perform threshold
img = cv2.imread('mole.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
_,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('mole_res.jpg', res)
cv2.imshow('img', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

enter image description here