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 实现拍摄文档照片一键清晰+裁剪+透视矫正