python 版本:Python 3 

目前市面上有很多类似的工具,比如夸克的图片文档处理,效果较好,可以实现透视矫正。

之前在处理孩子老师发布的作业,发现照片很清晰,打印会有灰色的背景,是因为拍照的光线问题导致的。

然后最近在工作的时候,产品经理要求做一个类似的功能。我刚开始想这用java去实现。发现java引入pom 的方式比较繁琐,不如python来的快。刚开始我在想,PS 可以实现的效果就是三个步骤:

1、复制图层并进行高斯模糊

2、实现“划分”模式

3、正片叠底。

好了,就一顿chatGPT 吧

import cv2
import numpy as np
from tkinter import Tk, Label, Button, Scale, HORIZONTAL, Frame
from PIL import Image, ImageTk


def scan_effect(image_path):
    # 读取原始图像
    original = cv2.imread(r'C:\Users\40650\Desktop\20240929092554.png').astype(float)  # 转换为浮点数以避免乘法中的整数截断
    #todo 通过透视裁剪图片

    # 1. 复制图层并进行高斯模糊
    blurred = cv2.GaussianBlur(original, (151,151), 0).astype(float)
    # 2. 实现“划分”模式
    # 为了避免除以零的情况,可以添加一个小的常数(如1e-7)
    epsilon = 1e-7
    divided = original / (blurred + epsilon)
    # 将结果缩放到0-255范围并转换为8位无符号整数
    divided = np.clip(divided * 255, 0, 255).astype(np.uint8)
    merged = divided.astype(float)  # 转换为浮点数以避免操作中的整数截断


    # 3. 实现正片叠底模式
    # 正片叠底公式:result = (original * blurred) / 255
    multiply = (divided * merged) / 255
    # 将结果缩放到0-255范围并转换为8位无符号整数
    multiply = np.clip(multiply, 0, 255).astype(np.uint8)

    # 显示结果
    #cv2.imshow('Original', original.astype(np.uint8))
    #cv2.imshow('Blurred', blurred.astype(np.uint8))
    # cv2.imshow('Divided', divided)
    cv2.imshow('Multiply', multiply)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    cv2.imwrite(r'C:\Users\40650\Desktop\20240929092554-1.png', multiply)



scan_effect('')

经过尝试,高斯模糊的值,在经过不停的测试才会得到一个不错的效果

但是没有夸克浏览器那样实现透视矫正,欢迎朋友来评论,留言。

下篇文章:使用python+opencv 实现拍摄文档照片一键清晰+裁剪+透视矫正

https://blog.51cto.com/wangxuantao/12215841