首页 > 解决方案 > 如何从图像的背景中删除感兴趣的区域?

问题描述

我开始在模式识别中使用图像处理,我需要识别皮毛斑点的颜色。有了这个,我需要从这些图像中去除可能的噪音,比如头发,然后只处理皮肤斑点以识别它们的颜色。因此,在 3D 图表中绘制颜色。

在此处输入图像描述 在此处输入图像描述

标签: pythonopencvimage-processing

解决方案


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

模糊+OTSU 的结果:

在此处输入图像描述

但请注意,如果您想自动化这样的过程,那么您需要尝试不同的转化方法,因为我假设色素沉着的颜色会有所不同。首先看一下 HSV、GRAY、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()

结果:

在此处输入图像描述


推荐阅读