我想删除触及图像边框的组件。
我使用的是OpenCV 2.4.10和Python 2.7。
我已经完成了图像的HSV转换和THRESHOLD_BINARY,接下来我要删除触及图像边框的组件(对象)。
Matlab在此处对此进行了解释 - http://blogs.mathworks.com/steve/2007/09/04/clearing-border-components/
但我想在Python中使用OpenCV。
请解释我的代码。
答案 0 :(得分:2)
openCV中没有直接方法可以做到这一点。您可以使用 floodFill 方法编写函数,并将边界像素作为种子点循环。
floodFill(dstImg,seed,Scalar (0));
其中:
dstImg :删除边框的输出。
种子:[(x,y)分]所有边界坐标
标量(0):如果找到朝向种子点的连接区域,则要填充的颜色。因此(0)因为你的情况是把它填充为黑色。
样品:
int totalRows = srcImg.rows;
int totalCols = srcImg.cols;
int strt = 0, flg = 0;
int iRows = 0, jCols = 0;
while (iRows < srcImg.rows)
{
if (flg ==1)
totalRows = -1;
Point seed(strt,iRows);
iRows++;
floodFill(dstImg,seed,Scalar (0));
if (iRows == totalRows)
{
flg++;
iRows = 0;
strt = totalCols - 1;
}
}
同样请修改列。 希望它有所帮助。
答案 1 :(得分:1)
不是很优雅,但你可以将每个轮廓包围在一个边界矩形中,并测试这个矩形的坐标是否落在图像的边界上(im)
for c in contours:
include = True
# omit this contour if it touches the edge of the image
x,y,w,h = cv2.boundingRect(c)
if x <= 1 or y <=1:
include = False
if x+w+1 >= im.shape[1] or y+h+1 >= im.shape[0]:
include = False
# draw the contour
if include == True:
cv2.drawContours(im, [c], -1, (255, 0, 255), 2)