使用Python開發(fā)一個圖像標注與OCR識別工具
圖像標注和OCR(光學(xué)字符識別)工具的代碼進行詳細分析。該工具允許用戶在圖像上進行矩形標注,使用 OCR 對標注區(qū)域進行文本識別,并將結(jié)果保存為 Excel 文件。同時,用戶可以保存和加載標注,清除標注,以及裁剪圖像等。
項目簡介
這個圖像標注和OCR工具的功能主要包括:
- 加載圖像并顯示在界面上。
- 允許用戶在圖像上繪制矩形框,以標注感興趣的區(qū)域。
- 在標注區(qū)域內(nèi)執(zhí)行OCR識別,并顯示識別的文本。
- 將OCR識別結(jié)果保存為Excel文件。
- 保存和加載用戶的標注數(shù)據(jù)(JSON格式)。
- 提供裁剪、清除標注、重置圖像等功能。
1. 圖像加載與顯示
首先,程序會掃描指定文件夾中的圖像文件(支持的格式包括 .png, .jpg, .jpeg, .bmp, .tiff),并顯示在界面的圖像面板中。
self.image_files = [f for f in os.listdir(folder_path) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff'))]
通過 wx.ListBox 組件顯示圖像文件的列表,用戶可以點擊選擇一個文件,然后加載并顯示它:
file_path = os.path.join(self.folder_path, filename) self.original_image = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_COLOR) self.original_image = cv2.cvtColor(self.original_image, cv2.COLOR_BGR2RGB)
這段代碼使用 OpenCV 讀取圖像,并轉(zhuǎn)換顏色空間以適應(yīng) wxPython 顯示。
2. 矩形標注
用戶可以在圖像上繪制矩形框,標記感興趣的區(qū)域。程序通過鼠標事件(按下、移動、松開)來繪制和更新矩形框:
def on_mouse_down(self, event): """鼠標按下開始繪制矩形""" if self.displayed_image is not None: self.start_point = event.GetPosition() self.drawing = True def on_mouse_move(self, event): """鼠標移動時更新矩形""" if self.drawing and self.displayed_image is not None: self.image_panel.Refresh() ???????def on_mouse_up(self, event): """鼠標松開完成矩形繪制""" if self.drawing and self.displayed_image is not None: end_point = event.GetPosition() # 確保矩形方向正確 x1 = min(self.start_point.x, end_point.x) y1 = min(self.start_point.y, end_point.y) x2 = max(self.start_point.x, end_point.x) y2 = max(self.start_point.y, end_point.y) orig_rect = self.convert_to_original_coords((x1, y1, x2, y2)) self.rectangles.append(orig_rect) self.drawing = False self.image_panel.Refresh()
在 on_mouse_down 中,用戶點擊圖像開始繪制矩形框,on_mouse_move 用于實時更新矩形的形狀,on_mouse_up 在用戶松開鼠標時完成矩形的繪制。
3. OCR識別
標注完成后,用戶可以點擊“識別”按鈕,程序會對標注區(qū)域進行OCR識別。OCR處理通過 pytesseract 庫實現(xiàn):
text = pytesseract.image_to_string( pil_image, lang='chi_sim', # 中文簡體 config='--psm 6 --oem 3' # 更精確的文本塊處理 )
識別結(jié)果會顯示在文本框中,并且可以將識別的結(jié)果保存為Excel文件:
if ocr_results: df = pd.DataFrame({'識別區(qū)域': range(1, len(ocr_results) + 1), '識別文本': ocr_results}) output_path = os.path.join(self.folder_path, f'{self.current_filename}_ocr_results.xlsx') df.to_excel(output_path, index=False, engine='openpyxl')
使用 pandas 庫將識別結(jié)果保存為Excel文件,方便后續(xù)查看和處理。
4. 標注的保存與加載
程序還允許用戶將標注區(qū)域保存為 JSON 格式,以便下次加載時使用。這是通過以下方式實現(xiàn)的:
annotations_data = { 'filename': self.current_filename, 'rectangles': self.rectangles } json_path = os.path.join(self.folder_path, f'{self.current_filename}_annotations.json') with open(json_path, 'w', encoding='utf-8') as f: json.dump(annotations_data, f)
標注文件會根據(jù)圖像的文件名命名,以便與圖像文件對應(yīng)。加載標注時,程序會讀取 JSON 文件并恢復(fù)之前的標注狀態(tài):
with open(json_path, 'r', encoding='utf-8') as f: annotations_data = json.load(f) if annotations_data['filename'] == self.current_filename: self.rectangles = annotations_data['rectangles']
5. 裁剪與重置圖像
裁剪功能允許用戶裁剪圖像的選定區(qū)域。用戶完成矩形繪制后,點擊“裁剪”按鈕,程序會根據(jù)最后一個矩形進行圖像裁剪:
cropped = self.current_image[y1:y2, x1:x2].copy()
如果需要重置圖像,用戶可以點擊“重置圖像”按鈕,程序?qū)⒒謴?fù)到原始圖像狀態(tài)。
6. UI組件與布局
wxPython 的布局管理使得界面整潔易用。主界面分為文件列表、圖像顯示區(qū)域和操作按鈕區(qū)域三個部分。文件列表用于選擇圖像,圖像顯示區(qū)域展示圖像并允許標注,按鈕區(qū)域提供裁剪、標注、OCR識別等操作。
file_list_sizer = wx.BoxSizer(wx.VERTICAL) self.file_listbox = wx.ListBox(panel, choices=self.image_files, style=wx.LB_SINGLE) file_list_sizer.Add(self.file_listbox, 1, wx.EXPAND | wx.ALL, 10)
通過 BoxSizer 管理不同控件的布局,使得界面更加模塊化和靈活。
運行結(jié)果
以上就是使用Python開發(fā)一個圖像標注與OCR識別工具的詳細內(nèi)容,更多關(guān)于Python圖像標注與OCR識別的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python PyQt5中彈出子窗口解決子窗口一閃而過的問題
這篇文章主要介紹了Python PyQt5中彈出子窗口解決子窗口一閃而過的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Python使用flask作為web服務(wù)器的代碼實現(xiàn)
Python Flask 框架是一個輕量級的 Web 框架,它簡單易用,靈活多變,非常適合用于構(gòu)建小型到中型規(guī)模的 Web 應(yīng)用程序,本文給大家介紹了Python使用flask作為web服務(wù)器的代碼實現(xiàn),需要的朋友可以參考下2024-06-06Python range與enumerate函數(shù)區(qū)別解析
這篇文章主要介紹了Python range與enumerate函數(shù)區(qū)別解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02