从二进制图像OpenCV C ++中裁剪文本

时间:2014-04-17 05:35:02

标签: c++ opencv crop

如何裁剪图像,以便使用OpenCV仅将图像包含在图像中? enter image description here

3 个答案:

答案 0 :(得分:7)

<强>方法

  1. 沿垂直和水平方向拉伸图像
  2. 查找边界矩形
  3. 裁剪图像

  4. <强>代码

    # reading the input image in grayscale image
    image = cv2.imread('image2.png',cv2.IMREAD_GRAYSCALE)
    image /= 255
    if image is None:
        print 'Can not find/read the image data'
    # Defining ver and hor kernel
    N = 5
    kernel = np.zeros((N,N), dtype=np.uint8)
    kernel[2,:] = 1
    dilated_image = cv2.dilate(image, kernel, iterations=2)
    
    kernel = np.zeros((N,N), dtype=np.uint8)
    kernel[:,2] = 1
    dilated_image = cv2.dilate(dilated_image, kernel, iterations=2)
    image *= 255
    
    # finding contours in the dilated image
    contours,a = cv2.findContours(dilated_image,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    # finding bounding rectangle using contours data points
    rect = cv2.boundingRect(contours[0])
    pt1 = (rect[0],rect[1])
    pt2 = (rect[0]+rect[2],rect[1]+rect[3])
    cv2.rectangle(image,pt1,pt2,(100,100,100),thickness=2)
    
    # extracting the rectangle
    text = image[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]
    
    plt.subplot(1,2,1), plt.imshow(image,'gray')
    plt.subplot(1,2,2), plt.imshow(text,'gray')
    
    plt.show()
    

    <强>输出

    Figure1-Dilated Image

    Figure2-Bounding Rect

    Figure3-Cropped Image

答案 1 :(得分:0)

假设您有像素信息,则可以在白色文本周围绘制convex hull。一旦你有了船体,就可以获得最低和最高的x和y坐标,并将它们用作你的矩形坐标,这样你就可以裁剪出图像的其余部分。

有关如何在Open_CV(C ++)中获取凸包的示例here

在图像上应用一些过滤器(可能使用erosion过滤器)可能是一个好主意,这样您就可以删除任何误报。

答案 2 :(得分:0)

在x方向和y方向上拍摄白色像素的投影。 x和y方向上的最低值和最高值分别是矩形的y坐标和x坐标的约束。 该解决方案适用于低处理和就地计算的简单情况。