這次我們使用影像差分處理,用來檢測圖像中的瑕疵。
首先定義瑕疵樣態,以下原圖為例,較淡的可能是錫油的反光,較亮的部分可能是瑕疵或者是刮痕造成,那我們的目的就是檢測出這些瑕疵或者是刮痕。
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')
等一下膨脹後,在跟灰階圖相減取絕對值
待會要跟灰階圖做相減,以利突顯出瑕疵。
瑕疵就會顯得特別突出了
保留出想要的瑕疵形狀