Ste*_*eve 5 python opencv image-processing computer-vision pypdf2
我有一个包含笔迹的多页 .pdf(扫描图像),我想裁剪并存储为新的单独图像。例如,在下面的视觉效果中,我想将 2 个框内的笔迹提取为单独的图像。如何使用 python 为大型多页 .pdf 自动执行此操作?
我尝试使用该PyPDF2包根据 (x,y) 坐标裁剪其中一个手写框,但是这种方法对我不起作用,因为手写框的边界/坐标对于 pdf 中的每个页面并不总是相同. 我相信检测框将是自动裁剪的更好方法。不确定它是否有用,但下面是我用于 (x,y) 坐标方法的代码:
from PyPDF2 import PdfFileReader, PdfFileWriter
reader = PdfFileReader('data/samples.pdf', 'r')
# getting the first page
page = reader.getPage(0)
writer = PdfFileWriter()
# Loop through all pages in pdf object to crop based on (x,y) coordinates
for i in range(reader.getNumPages()):
page = reader.getPage(i)
page.cropBox.setLowerLeft((42,115))
page.cropBox.setUpperRight((500, 245))
writer.addPage(page)
outstream = open('samples_cropped.pdf','wb')
writer.write(outstream)
outstream.close()
Run Code Online (Sandbox Code Playgroud)
预先感谢您的帮助
这是使用 OpenCV 的简单方法
提取 ROI 后,您可以将每个图像保存为单独的图像,然后使用pytesseract其他工具执行 OCR 文本提取。
结果
你提到这个
pdf 中每页的手写框的边界/坐标并不总是相同。
目前,您使用(x,y)坐标的方法不是很稳健,因为框可能位于图像上的任何位置。更好的方法是使用最小阈值轮廓区域进行过滤来检测框。根据您想要检测的盒子的大小,您可以调整变量。如果您想要额外的过滤来防止误报,您可以添加宽高比作为另一种过滤机制。例如,计算每个轮廓的纵横比,如果它在边界内(比如0.8正方形1.2/矩形 ROI),那么它就是一个有效的框。
import cv2
image = cv2.imread('1.jpg')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
thresh = cv2.threshold(blurred, 230,255,cv2.THRESH_BINARY_INV)[1]
# Find contours
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
# Iterate thorugh contours and filter for ROI
image_number = 0
min_area = 10000
for c in cnts:
area = cv2.contourArea(c)
if area > min_area:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
ROI = original[y:y+h, x:x+w]
cv2.imwrite("ROI_{}.png".format(image_number), ROI)
image_number += 1
cv2.imshow('image', image)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)