如何使用OpenCV裁剪图像中文本下方的空白区域?
解决图片底部空白裁剪问题
嘿,你已经走完了最关键的前期流程啦!我来帮你补全剩下的步骤,轻松实现底部空白区域的裁剪~
完整代码实现
import cv2 # 你已经完成的初始化步骤 img = cv2.imread("pg13_gau.jpg.png") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) edged = cv2.Canny(gray, 30, 300) # 注:不同OpenCV版本的findContours返回值有差异,这里做了兼容处理 cnts, _ = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 1. 按轮廓面积从大到小排序,取最大的轮廓(对应文本所在的有效区域) cnts = sorted(cnts, key=cv2.contourArea, reverse=True) target_contour = cnts[0] # 2. 获取这个轮廓的最小外接矩形(x,y是左上角坐标,w是宽度,h是高度) x, y, w, h = cv2.boundingRect(target_contour) # 3. 裁剪图片:用NumPy切片直接截取目标区域 cropped_img = img[y:y+h, x:x+w] # 4. 保存或预览结果 cv2.imwrite("cropped_pg13.jpg", cropped_img) cv2.imshow("裁剪后图片", cropped_img) cv2.waitKey(0) cv2.destroyAllWindows()
关键步骤说明
- 筛选最大轮廓:文本区域是图片里面积最大的有效内容区域,按面积倒序排序后取第一个轮廓,就能精准定位到我们要保留的范围。
- 获取边界矩形:
cv2.boundingRect()会返回包裹轮廓的最小矩形参数,这就是我们需要裁剪的区域范围。 - 切片裁剪:利用NumPy的数组切片语法,直接从原始图片中截取目标矩形,简单高效。
如果遇到边缘检测误识别小噪点的情况,可以在边缘检测后加一步形态学操作优化:
# 可选:用闭运算消除细小噪点,让轮廓更清晰 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)) edged = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)
这样就能完美裁剪掉底部的空白区域啦!
内容的提问来源于stack exchange,提问作者Anthony




