Я не знаю, правильно ли я понимаю, потому что когда я запускаю ваш код, я не получаю вывод, который вы опубликовали (выход).Если вы хотите получить только родинку, это невозможно сделать, просто установив порог, потому что родинка находится слишком близко к границе, и если вы посмотрите на изображение, вы увидите, что у него есть какая-то рамка.Однако существует простой способ сделать это для этого изображения, но он может не работать в других случаях.Вы можете нарисовать искусственную границу над изображением и отделить область интереса от других шумовых областей.Затем сделайте порог, для которого контур вы хотите отобразить.Приветствия!
Пример:
#Import all necessery libraries
import numpy as np
import cv2
#Read the image and perform threshold and get its height and weight
img = cv2.imread('moles.png')
h, w = img.shape[:2]
# Transform to gray colorspace and blur the image.
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
# Make a fake rectangle arround the image that will seperate the main contour.
cv2.rectangle(blur, (0,0), (w,h), (255,255,255), 10)
# Perform Otsu threshold.
_,thresh = cv2.threshold(blur,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# Create a mask for bitwise operation
mask = np.zeros((h, w), np.uint8)
# Search for contours and iterate over contours. Make threshold for size to
# eliminate others.
_, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
for i in contours:
cnt = cv2.contourArea(i)
if 1000000 >cnt > 100000:
cv2.drawContours(mask, [i],-1, 255, -1)
# Perform the bitwise operation.
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()
Результат: