Python 图片(.jpg .bmp等)转为指定大小的raw

本文介绍了一种将.jpg和.bmp格式图片转换为.raw格式的方法。使用Python的skimage库进行图片读取、类型转换和保存操作。具体步骤包括读取图片、转换为浮点数类型并保存。

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

上一篇(Python resize 图片并保存为raw 格式_WilliamCHW的博客-优快云博客)已经写了如何把.jpg和.bmp的图片转成raw 格式。但是后来实际使用时候发现需要指定raw的类型,具体如下

import skimage
from skimage import io

注意,如果没有skimage 的package ,安装不是pip install skimage

应该是  pip install scikit-image

具体转换过程如下 

image = io.imread('图片路径')
image = skimage.img_as_float(image)

image = image.astype(np.float32)  # 需要根据实际情况,指定图片的类型,不同的类型图片大小不一样

image.tofile(''需要保存图片路径.raw')

全部使用代码如下 

import numpy as np
from skimage import io
import skimage

image = io.imread('需要转换格式图片路径')
image = skimage.img_as_float(image)
image = image.astype(np.float32)
image.tofile('保存图片路径及名称.raw')

import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTk import pytesseract # 配置Tesseract路径(Windows需要,根据实际情况修改) pytesseract.pytesseract.tesseract_cmd = r'D:\Tesseract\tesseract.exe' class OCRApp: def __init__(self, master): self.master = master master.title("OCR图像识别工具") # 创建UI组件 self.create_widgets() self.image_path = None def create_widgets(self): # 图片显示区域 self.image_label = tk.Label(self.master, borderwidth=2, relief="groove") self.image_label.pack(pady=10, padx=10, fill=tk.BOTH, expand=True) # 按钮区域 button_frame = tk.Frame(self.master) button_frame.pack(pady=5) # 上传按钮 self.upload_btn = tk.Button( button_frame, text="上传图片", command=self.upload_image, width=15 ) self.upload_btn.pack(side=tk.LEFT, padx=5) # 识别按钮 self.ocr_btn = tk.Button( button_frame, text="识别文字", command=self.perform_ocr, width=15 ) self.ocr_btn.pack(side=tk.LEFT, padx=5) # 结果展示区域 self.result_text = tk.Text( self.master, height=10, wrap=tk.WORD, font=("Arial", 10) ) self.result_text.pack(pady=10, padx=10, fill=tk.BOTH, expand=True) def upload_image(self): file_path = filedialog.askopenfilename( filetypes=[("图片文件", "*.png;*.jpg;*.jpeg;*.bmp")] ) if file_path: self.image_path = file_path self.show_image(file_path) def show_image(self, path): try: image = Image.open(path) # 调整图片尺寸以适应界面 max_size = (800, 600) image.thumbnail(max_size) photo = ImageTk.PhotoImage(image) self.image_label.config(image=photo) self.image_label.image = photo # 保持引用 except Exception as e: messagebox.showerror("错误", f"加载图片失败: {str(e)}") def perform_ocr(self): if not self.image_path: messagebox.showwarning("警告", "请先上传图片") return try: # 使用PIL打开图片 image = Image.open(self.image_path) # 进行OCR识别 text = pytesseract.image_to_string( image, lang='eng', # 使用英文语言包 config='--psm 6' # 识别单行文本 ) # 显示结果 self.result_text.delete(1.0, tk.END) self.result_text.insert(tk.END, text) except Exception as e: messagebox.showerror("识别错误", f"OCR处理失败: {str(e)}") if __name__ == "__main__": root = tk.Tk() app = OCRApp(root) root.geometry("800x600") root.mainloop() 问题:为什么识别成功概率不高?返回给我正确的完整的代码
最新发布
04-04
<think>嗯,用户问为什么他们的OCR识别成功率不高,还希望得到正确的完整代码。首先,我需要分析他们提供的代码,看看可能的问题在哪里。代码是用Tkinter和pytesseract做的图像识别工具。用户可能在使用过程中遇到了识别不准确的情况。 首先,用户配置了Tesseract的路径,这是必须的,尤其是Windows系统。这一步没问题。接下来看OCRApp类,里面处理了图片上传、显示和识别。在perform_ocr方法里,他们用了lang='eng'和config='--psm 6'。这里可能有问题,因为psm 6是假设图片为单一文本块,如果图片中有多行或者布局复杂,可能识别不好。还有,语言设置为英文,如果用户识别的是中文,那肯定不行,所以需要检查是否安装了中文语言包,并在代码中指定。 然后,图片预处理的问题。用户的代码里直接打开图片进行识别,没有进行任何预处理,比如灰度化、二值化、降噪等。Tesseract在干净的图片上表现更好,所以预处理步骤可能缺失导致识别率低。 另外,Tesseract的版本和语言包是否正确安装也是关键。用户可能需要更新到最新版本,并确保下载了需要的语言数据,比如chi_sim。 还有,图片的分辨率和质量。如果上传的图片分辨率低或者模糊,识别效果自然不好。代码里调整了图片显示尺寸,但处理识别时用的是原图,所以可能不是这个问题,但用户可能上传了质量差的图片。 可能的解决方案包括:添加预处理步骤,调整psm参数,确保使用正确的语言,检查Tesseract安装,提供错误处理等。比如,在代码中将图像转为灰度,调整对比度,使用适合的psm模式,比如psm 3(自动),或者根据情况调整。同时,允许用户选择语言,比如中英文切换。 接下来,修改代码,增加预处理,比如转为灰度,二值化,resize等。然后,允许用户选择语言,比如在UI里加一个选项菜单,用lang参数。还要处理可能的异常,比如语言包未安装的情况。此外,psm参数可能需要根据图片类型调整,比如默认用psm 3,或者让用户选择。 测试这些修改是否能提高识别率。另外,提示用户安装语言包,比如中文的,并在代码里配置lang='chi_sim'如果识别中文。还有,建议用户确保图片清晰,文字部分明显。 最后,整合这些改进到用户的代码中,给出优化后的完整代码,并解释改动点,以及如何提高识别率的建议。</think>以下是优化后的OCR识别工具代码,主要从预处理、参数优化、错误处理三个方面进行了改进: ```python $$...$$ # 系统级指令部分代码同上,此处省略 ``` 改进后的完整代码(关键改进点已用注释标出): ```python import tkinter as tk from tkinter import ttk, filedialog, messagebox from PIL import Image, ImageOps, ImageEnhance, ImageTk import pytesseract import platform # 自动检测系统类型配置Tesseract路径 if platform.system() == "Windows": pytesseract.pytesseract.tesseract_cmd = r'D:\Tesseract\tesseract.exe' # 需修改为实际路径 class OCRApp: def __init__(self, master): self.master = master master.title("OCR图像识别工具 v2.0") # 初始化变量 self.image_path = None self.current_lang = 'chi_sim+eng' # 默认中英文混合 self.psm_mode = tk.StringVar(value='3') # 默认页面分割模式 # 创建UI self.create_widgets() def create_widgets(self): # 图像显示区域 self.image_label = tk.Label(self.master, borderwidth=2, relief="groove") self.image_label.pack(pady=10, padx=10, fill=tk.BOTH, expand=True) # 控制面板 control_frame = tk.Frame(self.master) control_frame.pack(pady=5, fill=tk.X) # 语言选择 lang_frame = tk.LabelFrame(control_frame, text="识别语言") lang_frame.pack(side=tk.LEFT, padx=5) self.lang_combobox = ttk.Combobox(lang_frame, values=['chi_sim', 'eng', 'chi_sim+eng'], width=15) self.lang_combobox.set('chi_sim+eng') self.lang_combobox.pack(padx=5, pady=2) # PSM模式选择 psm_frame = tk.LabelFrame(control_frame, text="分析模式") psm_frame.pack(side=tk.LEFT, padx=5) psm_options = { '3': '全自动', '6': '单行', '7': '单字', '11': '稀疏文本' } self.psm_combobox = ttk.Combobox(psm_frame, values=list(psm_options.items()), width=15, textvariable=self.psm_mode) self.psm_combobox.current(0) self.psm_combobox.pack(padx=5, pady=2) # 功能按钮 btn_frame = tk.Frame(control_frame) btn_frame.pack(side=tk.RIGHT, padx=10) self.upload_btn = tk.Button(btn_frame, text="上传图片", command=self.upload_image, width=10) self.upload_btn.pack(side=tk.LEFT, padx=2) self.ocr_btn = tk.Button(btn_frame, text="开始识别", command=self.perform_ocr, width=10) self.ocr_btn.pack(side=tk.LEFT, padx=2) # 结果显示区域 self.result_text = tk.Text(self.master, height=12, wrap=tk.WORD, font=("Microsoft YaHei", 10)) self.result_text.pack(pady=10, padx=10, fill=tk.BOTH, expand=True) def preprocess_image(self, image): """图像预处理流水线""" # 换为灰度图 image = image.convert('L') # 增强对比度 enhancer = ImageEnhance.Contrast(image) image = enhancer.enhance(2.0) # 二值化处理 image = image.point(lambda x: 0 if x < 180 else 255, '1') # 降噪处理 image = image.filter(ImageFilter.MedianFilter(size=3)) # 自动旋矫正 try: angle = pytesseract.image_to_osd(image)['rotate'] image = image.rotate(-angle, expand=True) except: pass return image def upload_image(self): file_path = filedialog.askopenfilename( filetypes=[("图像文件", "*.png;*.jpg;*.jpeg;*.bmp;*.tiff")] ) if file_path: self.image_path = file_path self.show_image(file_path) def show_image(self, path): try: image = Image.open(path) image.thumbnail((800, 600)) photo = ImageTk.PhotoImage(image) self.image_label.config(image=photo) self.image_label.image = photo except Exception as e: messagebox.showerror("错误", f"图像加载失败: {str(e)}") def perform_ocr(self): if not self.image_path: messagebox.showwarning("警告", "请先选择图像文件") return try: # 读取并预处理图像 raw_image = Image.open(self.image_path) processed_image = self.preprocess_image(raw_image) # 构建Tesseract配置参数 custom_config = f'--psm {self.psm_mode.get()} --oem 3' # 执行OCR识别 text = pytesseract.image_to_string( processed_image, lang=self.lang_combobox.get(), config=custom_config ) # 显示结果 self.result_text.delete(1.0, tk.END) self.result_text.insert(tk.END, text.strip()) except pytesseract.TesseractNotFoundError: messagebox.showerror("环境错误", "未找到Tesseract引擎,请正确安装并配置路径") except Exception as e: messagebox.showerror("识别错误", f"OCR处理失败: {str(e)}") if __name__ == "__main__": root = tk.Tk() app = OCRApp(root) root.geometry("1000x800") root.mainloop() ``` 改进说明及使用建议(使用Markdown公式排版): 一、识别率提升关键点: 1. 图像预处理流水线: - 灰度换:$I_{gray} = 0.299R + 0.587G + 0.114B$ - 对比度增强:$I_{enhanced} = \alpha(I_{gray} - 128) + 128$,其中$\alpha=2.0$ - 自适应二值化:$I_{binary}(x,y) = \begin{cases} 0 & I_{enhanced}(x,y) < T \\ 255 & \text{otherwise} \end{cases}$,$T=180$ 2. 参数优化方案: - 页面分割模式(Page Segmentation Mode): $$PSM = \begin{cases} 3 & \text{全自动(默认)} \\ 6 & \text{单行文本} \\ 11 & \text{稀疏文本} \end{cases}$$ - OCR引擎模式:`--oem 3`(LSTM+传统引擎组合) 3. 语言支持: - 中文+英文混合识别:`chi_sim+eng` - 需要下载训练数据:从[Tesseract文档](https://github.com/tesseract-ocr/tessdoc)获取`.traineddata`文件 二、使用建议: 1. 图像质量要求: - 分辨率:$DPI \geq 300$ - 文本倾斜角度:$\theta < 15^\circ$ - 光照均匀度:$\Delta L < 20\%$ 2. 操作建议: ``` if 识别效果不佳: 尝试调整PSM模式 检查语言包是否正确安装 使用图像编辑软件预处理: - 裁剪到文字区域 - 手动调整对比度 - 添加文字边框 ``` 三、常见问题解决方案: 1. 中文识别问题: - 安装中文数据包到`tessdata`目录 - 使用组合语言参数:`lang='chi_sim+eng'` 2. 图像倾斜校正: - 通过`image_to_osd`自动检测旋角度:$R(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}$ 3. 速度优化: - 设置`--oem 1`使用LSTM引擎 - 限制识别区域:$W \times H \leq 2000 \times 2000$像素 建议搭配OpenCV进行更高级的图像处理,可进一步提升复杂场景下的识别准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值