Python如何对图片按方向自定义进行切割

本文介绍了使用Python的Pillow库按照X轴、Y轴、自定义坐标和最大最小值进行图片切割的方法,通过示例代码详细解释了切割的坐标原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本文是该专栏的第25篇,后面会持续分享python的各种干货知识,值得关注。

在项目中,有时候会接到这样的需求。需要你对某种图片进行切割,而且切割的同时需要保留目标信息。举个例子,在处理FunCaptcha验证码的时候,一般OCR是识别不了FunCaptcha验证码上面的趣味图片内容信息,尤其是海外平台出现这种验证码的几率非常大。这个时候,就需要你将它的验证码图片截图下来,截图之后再单独进行图片切割,保留图片上面的重要内容,以便于进行图片相似度对比分析。对于这样的图片切割需求,你需要怎么做呢?

而在本文中,笔者将详细来介绍使用python按照你指定的方向进行图片切割将图片整体切割成目标区域指定图片

<think>嗯,用户这次明确要求使用Python进行OCR图片文字识别,并询问相关库的教程。结合之前的对话历史,用户应该已经了解了OCR的基本流程和核心算法(如预处理、文字检测、字符识别等),现在需要实际操作层面的指导。用户可能是开发者或数据分析人员,想快速实现文本提取功能,但可能面临两个潜在需求:1)需要简单易用的现成解决方案;2)可能需要处理特定场景(比如验证码、手写体等)。之前提供的引用中提到了tesseract和easyocr两个库,说明用户可能更关注开源工具。值得注意的细节是用户引用的资料里出现了验证码识别(引用1)和批量处理(引用2),以及中文乱码问题(引用3)。这暗示用户可能遇到中文环境下的实际工程问题。我的回答应该:1)优先推荐成熟稳定的库(如pytesseract)2)给出完整可运行的代码示例3)针对中文环境特别说明配置方法4)补充常见问题解决方法(如乱码)对于推荐方案,pytesseract虽然需要安装引擎但稳定性高;easyocr安装简单但中文需要指定语言包。用户如果处理中文印刷体文档,pytesseract+chi_sim组合更可靠;如果是自然场景文本,easyocr可能效果更好。需要强调环境配置的关键点:Tesseract必须下载中文语言包,并且代码里要显式声明lang=&#39;chi_sim&#39;。预处理部分要加入灰度化、二值化操作(用户之前提供的引用中提到过Otsu算法),这在演示代码中要体现。最后考虑列出常见问题解决方案:字体乱码问题通常源于字符集不匹配(GBK/UTF-8),可以在代码中加入encoding=&#39;utf-8&#39;;批量处理时建议用多进程;精度问题可以通过增加psm参数优化。参考之前用户提到的内容[^1],票据识别需要模板切割技术,这个在进阶部分稍微提及即可。用户可能延伸的需求包括:如何处理倾斜文字(加入旋转校正)?表格识别怎么处理?这些可以在相关问题里引导。</think> 以下是Python实现OCR图片文字识别的完整教程,结合主流库和最佳实践: ### 一、核心库选择与安装 ```bash # 方案1:Tesseract(成熟稳定,适合印刷体) pip install pytesseract pillow # 下载Tesseract中文包:https://github.com/tesseract-ocr/tessdata # 方案2:EasyOCR(支持多语言,上手快) pip install easyocr opencv-python # 方案3:PaddleOCR(中文场景表现优异) pip install paddlepaddle paddleocr ``` ### 二、代码实现示例 #### ▶ 基础方案:Tesseract识别印刷体 ```python from PIL import Image import pytesseract # 指定Tesseract引擎路径(Windows需配置) pytesseract.pytesseract.tesseract_cmd = r&#39;C:\Program Files\Tesseract-OCR\tesseract.exe&#39; def ocr_tesseract(img_path, lang=&#39;chi_sim&#39;): # chi_sim:简体中文 # 图像预处理 img = Image.open(img_path) img = img.convert(&#39;L&#39;) # 灰度化 img = img.point(lambda x: 0 if x < 180 else 255) # 二值化 # 文本识别 text = pytesseract.image_to_string( img, lang=lang, config=&#39;--psm 6&#39; # 单行文本模式 ) return text.strip() print(ocr_tesseract(&#39;invoice.jpg&#39;)) ``` > **中文识别关键**: > 1. 下载`chi_sim.traineddata`放入`tessdata`目录[^1] > 2. 二值化阈值需根据图像调整(可用Otsu算法自动计算) #### ▶ 进阶方案:EasyOCR识别复杂场景 ```python import easyocr reader = easyocr.Reader([&#39;ch_sim&#39;, &#39;en&#39;]) # 中英文识别 def ocr_easyocr(img_path): results = reader.readtext(img_path, paragraph=True) # 段落模式 return &#39;\n&#39;.join([res[1] for res in results]) # 提取文本内容 print(ocr_easyocr(&#39;street_sign.jpg&#39;)) ``` > **参数说明**: > - `detail=0` 可仅返回文本 > - `batch_size`参数加速批量识别[^2] ### 三、批量识别并保存结果 ```python import os from tqdm import tqdm def batch_ocr(input_dir, output_file): files = [f for f in os.listdir(input_dir) if f.endswith((&#39;.jpg&#39;,&#39;.png&#39;))] with open(output_file, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f_out: for file in tqdm(files): text = ocr_tesseract(os.path.join(input_dir, file)) f_out.write(f"--- {file} ---\n{text}\n\n") batch_ocr(&#39;./doc_scans/&#39;, &#39;output.txt&#39;) ``` ### 四、精准优化策略 1. **图像预处理增强** ```python import cv2 def preprocess(img_path): img = cv2.imread(img_path) # 去噪 img = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21) # 锐化 kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]) return cv2.filter2D(img, -1, kernel) ``` > 直方图均衡化可增强对比度:`cv2.equalizeHist()` 2. **调整识别参数** - Tesseract的`--psm`模式: ``` --psm 3 全自动(默认) --psm 6 单行文本(适合表格) --psm 11 稀疏文字(带空格的文本) ``` - PaddleOCR方向分类:`enable_angle_cls=True` ### 五、常见问题解决 | 问题现象 | 解决方案 | |------------------------|-----------------------------| | 中文字符乱码 | 添加`encoding=&#39;utf-8&#39;` | | 识别速度慢 | 使用GPU加速:`reader = easyocr.Reader(..., gpu=True)` | | 手写体识别率低 | 训练自定义模型:https://github.com/tesseract-ocr/tesstrain | | 文字方向错误 | 使用`paddleocr`的版面分析功能 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写python的鑫哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值