2024-09-05|閱讀時間 ‧ 約 7 分鐘

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

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

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

原圖


具體的步驟如下:

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

結果圖


程式範例

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')

處理的過程圖

灰階的圖像

模糊化過的圖

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

模糊膨脹後的圖

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

相減過的圖

瑕疵就會顯得特別突出了

設定條件過濾

保留出想要的瑕疵形狀


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


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.