[Python]使用 PyQt5 和 OpenCV 製作圖片異物移除工具

[Python]使用 PyQt5 和 OpenCV 製作圖片異物移除工具

更新於 發佈於 閱讀時間約 5 分鐘

拍攝時鏡頭有時候有粉塵或毛髮不管什麼的異物,拍攝完回家檢查圖片才發現有異物真的會氣死。

框選異物

raw-image

修復後

raw-image

這篇教學文章將介紹如何使用 PyQt5 和 OpenCV 來製作一款圖片異物修復工具。這個工具允許使用者載入圖片、框選異物區域,並使用 OpenCV 的 inpaint 方法來修復圖片,達到移除異物的目的。讓我們開始吧!

使用 PyQt5 和 OpenCV 製作圖片異物修復工具

在影像處理領域中,異物移除是一項常見的需求。例如,一張完美的照片可能被灰塵、文字或其他不需要的元素干擾。本篇教學將引導你使用 PyQt5 建立圖形化介面(GUI),並利用 OpenCV 的影像修復技術來移除異物。

1. 環境準備

在開始之前,請確保你已經安裝以下必要的 Python 套件:

pip install opencv-python numpy PyQt5

2. 功能概述

此工具提供以下核心功能:

  • 載入圖片
  • 框選異物區域
  • 選擇修復方法(TELEA 或 NS)
  • 調整修復半徑
  • 修復異物
  • 清除選區
  • 另存圖片

3. 核心程式碼解析

3.1 介面設計

使用 PyQt5 來設計 GUI,核心介面包括:

  • 主視窗(ImageEditor):負責圖片載入、顯示、框選異物區域及修復圖片。
  • 圖片標籤(ImageLabel):監聽滑鼠事件,讓使用者框選需要修復的區域。
  • 選單與按鈕:提供修復選項與操作功能。

3.2 異物修復

異物修復的核心方法來自 OpenCVcv2.inpaint(),它透過兩種演算法來修復選定區域:

  • INPAINT_TELEA:更適合修復小範圍異物。
  • INPAINT_NS:適用於較大範圍的修復。

修復流程:

  1. 使用者選取區域。
  2. 建立遮罩 mask,將選定區域標記為 255(需要修復)。
  3. 使用 cv2.inpaint() 進行修復。
method_flag = cv2.INPAINT_TELEA if self.method_combo.currentText() == "TELEA" else cv2.INPAINT_NS
radius = self.radius_slider.value()
repaired = cv2.inpaint(self.image, self.mask, radius, method_flag)
self.image = repaired
self.mask[:] = 0
self.rects.clear()
self.update_display()

3.3 圖片顯示與框選

為了讓使用者能夠方便選取異物區域,我們使用 QLabel 監聽滑鼠事件,並計算座標:

def get_image_coordinates(self, global_pos):
label_pos = self.image_label.mapFromGlobal(global_pos)
label_width = self.image_label.width()
label_height = self.image_label.height()
img_height, img_width = self.image.shape[:2]
scale = min(label_width / img_width, label_height / img_height)
x = (label_pos.x() - (label_width - img_width * scale) // 2) / scale
y = (label_pos.y() - (label_height - img_height * scale) // 2) / scale
return int(x), int(y)

這段程式碼確保滑鼠點擊能準確對應到圖片中的座標。


4. 執行程式

你可以直接運行 ImageEditor 來使用工具:

if __name__ == '__main__':
app = QApplication(sys.argv)
editor = ImageEditor()
editor.show()
sys.exit(app.exec_())

5. 結論

這款圖片異物修復工具能夠輕鬆移除照片中的不必要物件,適用於圖片編修、影像處理等應用。你可以進一步擴充功能,例如:

  • 讓使用者手動調整遮罩
  • 提供更多修復選項
  • 儲存修復歷史,方便回溯









avatar-img
螃蟹_crab的沙龍
138會員
248內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言
avatar-img
留言分享你的想法!
螃蟹_crab的沙龍 的其他內容
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援