Как убрать интересующую область с фона изображения? - PullRequest
0 голосов
/ 08 октября 2018

Я начинаю работать с обработкой изображений в режиме распознавания образов, и мне нужно определить цвета меховых пятен.При этом мне нужно удалить возможные шумы на этих изображениях, например, волосы, а затем воздействовать только на пятна на коже, чтобы определить их цвета.В результате нанесите цвета на трехмерную диаграмму.

enter image description here enter image description here

1 Ответ

0 голосов
/ 08 октября 2018

Для начала я бы изменил цветовое пространство изображения, чтобы я мог выполнить какое-то пороговое значение для изображения, чтобы подготовить его к дальнейшей обработке.В примере я попробовал это, преобразовав в серое цветовое пространство и с порогом OTSU, и результат был хорошим.

Результат с размытием + OTSU:

enter image description here

Но учтите, что если вы хотите автоматизировать такой процесс, вам нужно попробовать разные методы трансформации, так как я предполагаю, что цвет пигментации меняется.Для начала взглянем на цветовые пространства HSV, GREY, HLS и пороговые значения BINARY, OTSU, ADAPTIVE MEAN.Ключевым моментом на этом шаге является объединение вашего региона интересов от других шумов.Как только вы поняли это, вы можете начать поиск контуров.В этом случае родинка является самым большим контуром, но вы должны заметить, что если бы были другие шумы, которые были больше, чем эта родинка, выбор самого большого не будет работать.Вы должны будете сделать другие критерии, чтобы отличить ваш наблюдаемый контур (например, его форму, соотношение высоты и ширины и т. Д.).Как только вы выбрали наблюдаемый контур, нарисуйте его на новой пустой маске и выполните некоторую арифметическую операцию, например cv2.bitwise_and(), и вы получите результат.Надеюсь, это даст вам толчок в правильном направлении.Cheers!

Пример кода:

#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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...