我有一个矩形区域(白色背景),数字(黑色)可能位于其中的任何地方。当我将此图像传递到MNIST模型中时,由于数字被压缩,因此预测效果不佳。我想在数字周围切出一个正方形。
OpenCV对此有任何功能吗?是否可以水平检测第一个非白色像素,以便我可以裁剪出从该像素开始的区域?
答案 0 :(得分:1)
这可以通过使用OpenCV中的boundingRect
函数来实现。因此,您只需要反转输入图像,即可拥有黑色背景和白色数字。
让我们看看以下代码片段:
import cv2
import numpy as np
# Set up test image, white background, black letter with anti-aliasing
img = 255 * np.ones((50, 50), np.uint8)
cv2.putText(img, 't', (20, 30), cv2.FONT_HERSHEY_COMPLEX, 1.0, 0, 3, cv2.LINE_AA)
# Generate inverse image (black background, white letter)
inv = 255 - img
# Detect bounding rectangle for any non-zero pixels
x, y, w, h = cv2.boundingRect(inv)
# Generate cropped image from obtained parameters
crop = img[y:y+h, x:x+w]
# Output
cv2.imshow('img', img)
cv2.imshow('crop', crop)
cv2.waitKey(0)
cv2.destroyAllWindows()
测试图像img
如下所示:
然后,裁剪后的图像crop
如下所示:
现在,按照您的要求,图像当然不是正方形的。因此,需要做更多工作以获取w
和h
的最大值并正确裁剪子图像。此外,您还必须检查是否违反图像边界等。这就是我将要付出的全部努力。 :-)
希望有帮助!