Как заполнить весь внутренний контур с помощью opencv - PullRequest
0 голосов
/ 04 февраля 2019

На следующем рисунке я пытаюсь затемнить внутреннюю полосу дизайна с именем "jupiter"

enter image description here

enter image description here

Мой желаемый результат - следующийтолько затемняет «белую» часть (полосу) двоичного изображения, но не полностью, как я хочу.

Как бы мне понадобилось импровизировать, чтобы заставить его полностью затемнить?

enter image description here

enter image description here

1 Ответ

0 голосов
/ 25 июня 2019

Вы можете использовать технику маскировки, чтобы выполнить свою работу.Вот мой код:

import cv2
import os
import numpy as np
import matplotlib.pyplot as plt
import copy
%matplotlib inline

#-----------------------------------------------------------------------------------
I = cv2.imread('E:\\Mukul\\others\\stof.png') #input image
#I.shape

I_cnt = np.where(I[:,:,2] == 255) #location of your bounding box region
I_mask = np.zeros_like(I[:,:,2])  # mask for the input image

I_mask[list(I_cnt[0]), list(I_cnt[1])] = 255
plt.imshow(I_mask, cmap = 'gray')

bounding box region

I_cnt1, _ = cv2.findContours(I_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
np.array(I_cnt1).shape # (1, 1420, 1, 2)


cv2.fillConvexPoly(I_mask, I_cnt1[0], 255)
plt.imshow(I_mask,cmap = 'gray')

masked bounding box

Так как мы хотимнаша ограничивающая область будет черной, мы будем инвертировать наше изображение с помощью cv2.bitwise_not(), а затем с помощью cv2.bitwise_and() получить требуемое выходное изображение.

I_mask1 = cv2.bitwise_not(I_mask) 
out = cv2.bitwise_and(I_mask1, I[:,:,2])
plt.imshow(out,cmap = 'gray')

output image

Вместо того, чтобы использовать вышеупомянутые линии, чтобы найти контуры нашей двоичной маски, которую можно использовать для заполнения нашей области с помощью cv2.fillConvexPoly (), мы можем напрямую преобразовать I_cnt[0] (массив, содержащий координату x) и I_cnt[1](массив, содержащий y-координату) в массив (x, y) координат, используя следующий код:

temp_list = []
for a, b in zip(I_cnt[0], I_cnt[1]):
     temp_list.append([a, b])
ctr = np.array(temp_list).reshape((-1,1,2)).astype(np.int32)

I_mask2 = np.zeros_like(I[:,:,2])
I_mask2[list(I_cnt[0]), list(I_cnt[1])] = 255
plt.imshow(I_mask2, cmap = 'gray')


cv2.fillConvexPoly(I_mask1, ctr, 255)
plt.imshow(I_mask2,cmap = 'gray')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...