如何使用Opencv删除Python 2.7中的边框组件

时间:2015-04-06 04:36:36

标签: python-2.7 opencv

我想删除触及图像边框的组件。

我使用的是OpenCV 2.4.10和Python 2.7。

我已经完成了图像的HSV转换和THRESHOLD_BINARY,接下来我要删除触及图像边框的组件(对象)。

Matlab在此处对此进行了解释 - http://blogs.mathworks.com/steve/2007/09/04/clearing-border-components/

但我想在Python中使用OpenCV。

请解释我的代码。

2 个答案:

答案 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)