【发布时间】:2019-02-09 20:40:09
【问题描述】:
我正在使用here 概述的 OpenCV GrabCut 算法来提取图像中的前景。
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('messi5.jpg')
mask = np.zeros(img.shape[:2],np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (50,50,450,290)
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:,:,np.newaxis]
现在我可以保存这张使用cv.imwrite('filename', img)获得的图像,输出图像只包含前景,背景被涂黑。
我想获取前景边界框的坐标为(LowerXcoordinate, LowerYcoordinate) 和(UpperXcoordinate, UpperYcoordinate)。
我可以想象的一种方法是将图像视为像素的 2D 矩阵,以获取上 Y 坐标,从第 1 行开始并逐行检查所有像素的颜色值是否为黑色。具有非黑色像素的第一行将是前景开始的位置。同样,从 的最后一行开始,我可以得到较低的 Y 坐标。只需对列重复该过程即可获得 X 坐标。
目前我所知道的唯一天真的方法是手动编写循环来检查这一点。
有没有一些更简单的方法使用库函数来完成这个?
【问题讨论】:
标签: image opencv image-processing