В этой строке cv.drawContours(image_binary, [max(contours, key = cv.contourArea)], -1, (255, 255, 255), -1)
ваш код устанавливает цвет (255, 255, 255)
пикселей image_binary
, соответствующих границам и внутренним пикселям большего контура, найденного cv.findContours
.
Создавая image_binary
, вы также меняете местами ширину с высотой, и это ошибка.
Вам не нужно оставлять детей: вы должны использовать cv.RETR_TREE
для этого, а затем найти индекс отец и ищите все контуры с этим отцом, рекурсивно выполняющим это для вложенных контуров (дочерние элементы детей ...). См. https://docs.opencv.org/4.1.0/d9/d8b/tutorial_py_contours_hierarchy.html Но это бесполезно для вашей цели.
Вы можете использовать текущий результат в качестве маски для исходного изображения, но код требует некоторых исправлений, начиная со связанного изображения с именем
VS0L9.jpg
. Обратите внимание, что я использую
cv2
, просто измените на
cv
.
Загрузите изображение
im = cv2.imread('VS0L9.jpg', cv2.IMREAD_GRAYSCALE)
Найдите контуры (я использовал RETR_TREE)
contours, hierarchy = cv2.findContours(im, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
Найдите больший контур:
bigger = max(contours, key=lambda item: cv2.contourArea(item))
Инициализируйте маску (что вы пробовали с image_binary
):
the_mask = np.zeros_like(im)
Нарисуйте заливку большего контура на изображении маски, интересующая область установлена в (255, 255, 255):
cv2.drawContours(the_mask, [bigger], -1, (255, 255, 255), cv2.FILLED)
На этом этапе маска выглядит как результат вашего кода, но с правильной шириной и высотой. Используйте маску с исходным изображением, чтобы показать только интересующую область:
res = cv2.bitwise_and(im, im, mask = the_mask)
Или, альтернативно:
res = im.copy()
res[the_mask == 0] = 0
Теперь res
- это желаемый результат.