如何裁剪图像,以便使用OpenCV仅将图像包含在图像中?
答案 0 :(得分:7)
<强>方法强>
<强>代码强>
# 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()
<强>输出强>
答案 1 :(得分:0)
假设您有像素信息,则可以在白色文本周围绘制convex hull。一旦你有了船体,就可以获得最低和最高的x和y坐标,并将它们用作你的矩形坐标,这样你就可以裁剪出图像的其余部分。
有关如何在Open_CV(C ++)中获取凸包的示例here。
在图像上应用一些过滤器(可能使用erosion过滤器)可能是一个好主意,这样您就可以删除任何误报。
答案 2 :(得分:0)
在x方向和y方向上拍摄白色像素的投影。 x和y方向上的最低值和最高值分别是矩形的y坐标和x坐标的约束。 该解决方案适用于低处理和就地计算的简单情况。