opencv改善pdf清晰度

improve-pdf

介绍:

使用python脚本对pdf进行优化,提高pdf清晰度,使文字更加清晰,观感更佳。仅适用黑白扫描版pdf,且文字较清晰,若模糊会更加模糊。

原理:

pdf转成png图片
再使用opencv对图片局部阈值二值化处理
并去除孤立噪点,优化图片观感
最后转回pdf并合并,最终达到优化提高pdf清晰度的目的
(可选)使用potrace处理png转成svg矢量图,使文字线条平滑,观感大幅度提高,接近ocr pdf 。

脚本使用方法:

1.安装依赖

pip install opencv-python
pip install pymupdf

2.将pdf文件放入文件夹中,将doc_path改为pdf文件路径(不要使用中文路径,会报错)

doc_path = r"your pdf path"  # 相对路径删去r

3.运行脚本

推荐使用单任务多进程,默认满核运行处理速度更快,可自行修改,注意进程数不要超过cpu核心数

4.核心代码

        def change_image(self, index):
        try:
            img_files = sorted(os.listdir(self.img_path), key=self.numerical_sort)
            for i in index:
                i = img_files[i]
                if i.endswith(".png"):
                    img = cv2.imread(os.path.join(self.img_path, i), cv2.IMREAD_COLOR)
                    GrayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                    binary2 = cv2.adaptiveThreshold(
                        GrayImage,
                        255,
                        cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                        cv2.THRESH_BINARY,
                        55,
                        15,
                    )
                    cv2.imwrite(os.path.join(self.change_path, i), binary2)
                    print(f"正在二值化第{i}张图片")
        except Exception as e:
            print(f"二值化图片时出现错误: {e}")
    
    def erasure_image(self, threshold, index):
        try:
            img_files = sorted(os.listdir(self.change_path), key=self.numerical_sort)
            for i in index:
                i = img_files[i]
                if i.endswith(".png"):
                    img = cv2.imread(
                        os.path.join(self.change_path, i), cv2.IMREAD_COLOR
                    )
                    GrayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                    contours, hierarch = cv2.findContours(
                        GrayImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE
                    )
                    for j in range(len(contours)):
                        area = cv2.contourArea(contours[j])
                        if area < threshold:
                            cv2.drawContours(
                                img, [contours[j]], -1, (255, 255, 255), thickness=-1
                            )
                            continue
                    cv2.imwrite(
                        os.path.join(self.erasure_path, i),
                        img,
                        [cv2.IMWRITE_PNG_COMPRESSION, 9],
                    )
                    print(f"正在去除第{i}张图片黑点")
        except Exception as e:
            print(f"去除黑点时出现错误: {e}")

效果展示

opencv改善pdf清晰度_第1张图片

opencv改善pdf清晰度_第2张图片 

 

你可能感兴趣的:(Python,opencv,pdf,人工智能)