[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
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
143會員
253內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
螃蟹_crab的沙龍的其他內容
2025/03/24
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
Thumbnail
2025/03/24
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
Thumbnail
2024/10/11
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
Thumbnail
2024/10/11
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
Thumbnail
2024/10/10
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
Thumbnail
2024/10/10
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
Thumbnail
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
Thumbnail
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
Thumbnail
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
Thumbnail
接續上一邊,分割了螺絲與螺母的圖像,但分割後的結果,因為螺絲過於接近的關係,沒有切割乾淨,會有其他螺絲的頭或者身體,這樣會影響到後續量測。 [OpenCV應用][Python]擷取出螺絲或螺母的影像 本文主要是,如何去除掉不要的背景雜物。 下層為原先分割的圖,上層為去除背景雜物的圖。
Thumbnail
接續上一邊,分割了螺絲與螺母的圖像,但分割後的結果,因為螺絲過於接近的關係,沒有切割乾淨,會有其他螺絲的頭或者身體,這樣會影響到後續量測。 [OpenCV應用][Python]擷取出螺絲或螺母的影像 本文主要是,如何去除掉不要的背景雜物。 下層為原先分割的圖,上層為去除背景雜物的圖。
Thumbnail
常見的圖像銳利化方法: 銳化濾波器 增強對比度 Unsharp Masking
Thumbnail
常見的圖像銳利化方法: 銳化濾波器 增強對比度 Unsharp Masking
Thumbnail
拍好得照片發現有些不該入鏡的內容,這時若有類似橡皮擦的功能可以直接擦掉,那該多好啊! 這種小事,就讓美圖秀秀來幫你處理吧 請先進入美圖秀秀桌面程式 進入後來到首頁畫面,找到AI消除的圖示後 點按即可進入AI消除製作畫面 美圖秀秀會幫我們進入手機的相片 圖庫中讓您挑選要處理的照片,點按目標
Thumbnail
拍好得照片發現有些不該入鏡的內容,這時若有類似橡皮擦的功能可以直接擦掉,那該多好啊! 這種小事,就讓美圖秀秀來幫你處理吧 請先進入美圖秀秀桌面程式 進入後來到首頁畫面,找到AI消除的圖示後 點按即可進入AI消除製作畫面 美圖秀秀會幫我們進入手機的相片 圖庫中讓您挑選要處理的照片,點按目標
Thumbnail
上一篇提到利用cv2.inRangex,建立遮罩來過濾出紅球。這次我們稍微更動一下程式碼,將紅球變顏色。 [OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球 結果圖 將紅球改變顏色成藍球
Thumbnail
上一篇提到利用cv2.inRangex,建立遮罩來過濾出紅球。這次我們稍微更動一下程式碼,將紅球變顏色。 [OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球 結果圖 將紅球改變顏色成藍球
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News