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

修復後

這篇教學文章將介紹如何使用 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 異物修復
異物修復的核心方法來自 OpenCV 的 cv2.inpaint()
,它透過兩種演算法來修復選定區域:
- INPAINT_TELEA:更適合修復小範圍異物。
- INPAINT_NS:適用於較大範圍的修復。
修復流程:
- 使用者選取區域。
- 建立遮罩 mask,將選定區域標記為 255(需要修復)。
- 使用 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. 結論
這款圖片異物修復工具能夠輕鬆移除照片中的不必要物件,適用於圖片編修、影像處理等應用。你可以進一步擴充功能,例如:
- 讓使用者手動調整遮罩
- 提供更多修復選項
- 儲存修復歷史,方便回溯