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

Posted

技术标签:

【中文标题】从二进制图像OpenCV C++中裁剪文本【英文标题】:Crop text out of binary image OpenCV C++ 【发布时间】:2014-04-17 05:35:02 【问题描述】:

如何使用 OpenCV 裁剪图像以使图像中仅包含文本?

【问题讨论】:

【参考方案1】:

接近

    在垂直和水平方向上放大图像 寻找边界矩形 裁剪图像

代码

# 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()

输出

【讨论】:

【参考方案2】:

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

here 提供了如何在 Open_CV (C++) 中获取凸包的示例。

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

【讨论】:

【参考方案3】:

在 x 方向和 y 方向对白色像素进行投影。 x 和 y 方向的最低和最高值分别是矩形的 y 和 x 坐标的界限。 此解决方案适用于低处理和就地计算的简单情况。

【讨论】:

以上是关于从二进制图像OpenCV C++中裁剪文本的主要内容,如果未能解决你的问题,请参考以下文章

Python Opencv使用霍夫圆变换从二进制图像中检测圆

从二进制图像中查找坐标并将它们投影到原始图像[关闭]

从二进制文件加载图像像素时出现 C++ 分段错误

如何在 C++ 中使用 OpenCV 4.2 计算二进制图像的周长

从二进制文件中删除 protobuf c++ 编译的路径字符串

使用 c++ 时从二进制文件中读取 int 不正确