如何使用opencv从皮肤图像中去除毛发?

我正在研究皮肤斑点的识别。为此,我使用了许多具有不同噪声的图像。这些噪音之一是毛发,因为我在染色区域 (ROI) 上有毛发的图像。如何减少或消除这些类型的图像噪声?


下面的代码减少了毛发所在的区域,但不会去除感兴趣区域(ROI)上方的毛发。


import numpy as np

import cv2


IMD = 'IMD436'

# Read the image and perfrom an OTSU threshold

img = cv2.imread(IMD+'.bmp')

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((2,2),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.imwrite(IMD+'.png', res)

cv2.imshow('img', res)

cv2.waitKey(0)

cv2.destroyAllWindows()

http://img1.mukewang.com/60f7e2d200012b1807530570.jpg

出口:

http://img3.mukewang.com/60f7e2df0001299707390547.jpg

如何去除感兴趣区域顶部的毛发?

使用的图像:

http://img3.mukewang.com/60f7e2ec0001451207560567.jpg

http://img2.mukewang.com/60f7e2f80001fec507550566.jpg

慕哥9229398
浏览 826回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python