[Python][OpenCV]使用影像差分處理來檢測瑕疵

[Python][OpenCV]使用影像差分處理來檢測瑕疵

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

這次我們使用影像差分處理,用來檢測圖像中的瑕疵。

首先定義瑕疵樣態,以下原圖為例,較淡的可能是錫油的反光,較亮的部分可能是瑕疵或者是刮痕造成,那我們的目的就是檢測出這些瑕疵或者是刮痕。

原圖

raw-image

具體的步驟如下:

  1. 使用中值模糊:平滑圖像,減少噪聲。
  2. 與原圖進行差分:將模糊膨脹後的圖像與原圖相減,突出瑕疵部分。
  3. 閾值篩選:只顯示灰階值大於 設定值 的區域,這些區域代表可能的瑕疵。
  4. 將瑕疵顯示為紅色:在原圖上將瑕疵部分標示為紅色,便於識別。
  5. 定義瑕疵面積:在原圖上將瑕疵面積大於設定值用紅框標示。

結果圖

raw-image


程式範例

import numpy as np
import cv2
import matplotlib.pyplot as plt

#秀圖的函式
def show(img,title):
_# OpenCV 使用 BGR 讀取圖像,需要轉換為 RGB 顯示
rgb_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 使用 Matplotlib 顯示圖像
plt.imshow(rgb_image)
plt.title(f'{title}')
plt.axis('off') # 不顯示座標軸
plt.show()

# 讀取原圖
image = cv2.imread('圖片路徑')
# 將圖像轉為灰階
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用中值模糊
blurred_image = cv2.medianBlur(gray_image,7)
# 進行膨脹操作
dilated_image = cv2.dilate(blurred_image, (7,7))
# 與原圖進行差分
diff_image = cv2.absdiff(gray_image, dilated_image)
# 將瑕疵區域標記為紅色,原圖為背景
show_img = np.zeros_like(gray_image)
show_img[diff_image > 100] = 255

result_image = image.copy()
# 檢測輪廓
contours, _ = cv2.findContours(show_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# 遍歷每個輪廓
for contour in contours:
# 計算輪廓的面積
area = cv2.contourArea(contour)
# 設定一個合理的面積範圍來過濾掉雜訊
if 2000 > area > 2: # 根據實際情況調整範圍
# 計算外接矩形
x, y, w, h = cv2.boundingRect(contour)
# 在原圖上繪製矩形框 (紅色)
cv2.rectangle(result_image, (x, y), (x + w, y + h), (0, 0, 255), 2)

show(result_image,'result_image')

處理的過程圖

灰階的圖像

raw-image

模糊化過的圖

等一下膨脹後,在跟灰階圖相減取絕對值

raw-image

模糊膨脹後的圖

待會要跟灰階圖做相減,以利突顯出瑕疵。

raw-image

相減過的圖

瑕疵就會顯得特別突出了

raw-image

設定條件過濾

保留出想要的瑕疵形狀

raw-image


喜歡的話,希望可以追蹤,加入沙龍,並點愛心給予我們鼓勵 謝謝


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只支援