Фон
Чтобы сделать фон белым, вы можете использовать побитовую операцию с маской.Чтобы автоматизировать создание маски, прочитайте здесь .
Пример:
![enter image description here](https://i.stack.imgur.com/YWWuM.png)
import cv2
import numpy as np
# load image and mask
img = cv2.imread('image.png')
mask = cv2.imread('mask.png')
# combine images
res = cv2.bitwise_or(img,mask)
cv2.imshow("result", res)
cv2.waitKey(0)
cv2.destroyAllWindows()
Маска должна иметьравное количество цветовых каналов как изображение.Все белые области в маске также станут белыми на изображении.Черные области маски не будут затронуты на изображении.
Ограничительная рамка
Чтобы получить ограничительную рамку, вы можете использовать findContours .Он принимает двоичную маску в качестве входных данных и возвращает список контуров.Вы можете использовать контур, чтобы найти ограничивающий прямоугольник, повернутый ограничивающий прямоугольник или минимальный окружающий круг .Результат может быть не идеальным в зависимости от вашего ввода, но вы можете использовать его для повышения производительности, поскольку это значительно сужает поиск.
Примечание: вход для findContours должен иметь черный фон.Вы можете изменить свою маску, используя inverted_mask = cv2.bitwise_not(mask)
.Или, если вы получили маску с помощью порогового значения, вы можете выбрать инвертированный тип порога .
Результат:
![enter image description here](https://i.stack.imgur.com/rIEfg.png)
Код:
import cv2
import numpy as np
# load image // use your mask instead
mask = cv2.imread('mask.png',0)
# find contours
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
# get the boundingrect and draw a red line over it
x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(mask2,(x,y),(x+w,y+h),(0,0,255),3)
# get the minumum enclosing rectangle and draw it in blue
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(mask2,[box],0,(255,0,0),3)
# diplay result
cv2.imshow("img", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
Математика
Если выВместо того, чтобы проверять значения массива, вы можете повысить производительность, сначала суммируя строки и столбцы.Суммирование происходит быстро (и превращается в ноль), и теперь вы можете отбросить строки / столбцы, проверив одно значение.Вы можете увидеть пример этого процесса в этом ответе .Для этого я бы предложил использовать маску с черным фоном, так как вы можете сравнить сумму с нулем.По сути, это приведет к появлению красного ограничивающего прямоугольника вышеКонечно, когда найдена ненулевая строка / столбец, вам все равно придется зациклить ее, чтобы найти точную координату.
Pfiew, который оказался намного длиннее, чем предполагалось ...