答案 0 :(得分:1)
首先,我将更改图像的色彩空间,以便可以对图像执行某种阈值操作,以准备进行进一步处理。在示例中,我通过转换为灰色空间并使用OTSU阈值进行了尝试,结果很好。
blur + OTSU的结果:
但是请注意,如果您想使这样的过程自动化,那么您将需要尝试不同的转化方法,因为我认为色素沉着的颜色是不同的。首先,请看一下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()
结果: