从二进制图像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++ 中使用 OpenCV 4.2 计算二进制图像的周长