У меня есть простое решение, реализованное на Python.
- Сначала я преобразовал данное изображение в двоичное изображение, где красный объект - это область интереса (белая)
Далее я нашел контуры, используя встроенную функцию, доступную в OpenCV.Я нарисовал результирующий контур с
толстыми границами на другом изображении с черными пикселями, имеющими ту же форму, что и исходное изображение.
Я нашел контуры на этом черном изображении и нарисовал получившиеся контуры на исходном изображении.На этот раз я нарисовал контуры без толщины.
(Как я уже сказал, код написан на python, если вы хотите, чтобы яподелись)
import cv2
import numpy as np
import os
path = r'C:\Users\Desktop\Stack\contour'
im = cv2.imread(os.path.join(path, 'handle.jpg'))
im = cv2.resize(im, (0, 0), fx=0.5, fy=0.5) #--- resizing the image
im2 = im.copy() #--- having another copy of the original image
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret2, th2 = cv2.threshold(imgray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
cv2.imshow('th2.jpg', th2) #--- Image 1
_, contours, hierarchy = cv2.findContours(th2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
mask = np.zeros_like(im)
cv2.drawContours(mask, contours, -1, (255, 255, 255), 33)
cv2.imshow('mask.jpg', mask) #--- Image 2
ret2, mask_th2 = cv2.threshold(mask[:,:,1], 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
_, contours1, hierarchy = cv2.findContours(mask_th2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(im2, contours1, -1, (0, 0, 0), 2)
cv2.imshow('final.jpg', im2) #--- Image 3
cv2.waitKey(0)
cv2.destroyAllWindows()