圖像缺陷檢測是計算機(jī)視覺中的一個重要應(yīng)用,廣泛應(yīng)用于工業(yè)制造、醫(yī)療影像分析等領(lǐng)域。OpenCV 是一個強(qiáng)大的計算機(jī)視覺庫,提供了豐富的圖像處理工具,可以幫助開發(fā)者高效地實現(xiàn)圖像缺陷檢測。
1. 直方圖比較法
一種常見的圖像缺陷檢測方法是通過直方圖比較。這種方法的基本步驟如下:
灰度化:將原圖和待檢測圖片轉(zhuǎn)換為灰度圖。
直方圖計算:計算灰度圖的直方圖。
直方圖比較:通過比較兩個直方圖的相關(guān)性來判斷是否存在缺陷。當(dāng)兩圖相關(guān)系數(shù)大于等于0.9時,認(rèn)為圖像無缺陷,否則視為有缺陷。
示例代碼
python
import
cv2
import
numpy
np
# 讀取圖像
img1 = cv2.imread(
‘original_image.bmp’
,
img2 = cv2.imread(
‘test_image.bmp’
,
# 計算直方圖
hist1 = cv2.calcHist([img1], [
],
None
, [
256
], [
256
hist2 = cv2.calcHist([img2], [
],
None
, [
256
], [
256
# 歸一化直方圖
cv2.normalize(hist1, hist1, alpha=
, beta=
, norm_type=cv2.NORM_MINMAX)
cv2.normalize(hist2, hist2, alpha=
, beta=
, norm_type=cv2.NORM_MINMAX)
# 比較直方圖
correlation = pareHist(hist1, hist2, method=cv2.HISTCMP_CORREL)
correlation >=
0.9
“圖像無缺陷”
else
“圖像有缺陷”
2. 二值化處理法
二值化處理法是另一種常用的圖像缺陷檢測方法。通過將圖像轉(zhuǎn)換為二值圖像,可以更容易地提取和分析缺陷區(qū)域。
平滑處理:使用中值濾波或其他平滑濾波器去除噪聲。
二值化:將圖像轉(zhuǎn)換為二值圖像。
輪廓提取:提取圖像中的輪廓。
缺陷區(qū)域標(biāo)記:標(biāo)記并計算缺陷區(qū)域的特征值。
示例代碼
python
import
cv2
import
numpy
np
# 讀取圖像
img = cv2.imread(
‘defect_image.bmp’
,
# 平滑處理
blurred = cv2.medianBlur(img,
# 二值化
_, binary = cv2.threshold(blurred,
127
255
, cv2.THRESH_BINARY)
# 輪廓提取
contours, _ = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 標(biāo)記缺陷區(qū)域
for
contour
contours:
area = cv2.contourArea(contour)
area >
100
# 設(shè)定閾值
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(img, (x, y), (x + w, y + h), (
255
),
# 顯示結(jié)果
cv2.imshow(
‘Defect Detection’
, img)
cv2.waitKey(
cv2.destroyAllWindows()
3. 特征增強(qiáng)法
特征增強(qiáng)法通過增強(qiáng)圖像的局部特征來提高缺陷檢測的準(zhǔn)確性。
均值模糊:減少圖像中的干擾。
拉普拉斯算子:獲取圖像局部特征。
自適應(yīng)閾值分割:分割圖像并標(biāo)注缺陷位置。
示例代碼
python
import
cv2
import
numpy
np
# 讀取圖像
img = cv2.imread(
‘material_image.bmp’
,
# 均值模糊
blurred = cv2.blur(img, (
# 拉普拉斯算子
laplacian = cv2.Laplacian(blurred, cv2.CV_64F)
laplacian = np.uint8(np.absolute(laplacian))
# 自適應(yīng)閾值分割
adaptive_threshold = cv2.adaptiveThreshold(laplacian,
255
, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,
# 輪廓提取
contours, _ = cv2.findContours(adaptive_threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 標(biāo)記缺陷區(qū)域
for
contour
contours:
area = cv2.contourArea(contour)
area >
100
# 設(shè)定閾值
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(img, (x, y), (x + w, y + h), (
255
),
# 顯示結(jié)果
cv2.imshow(
‘Defect Detection’
, img)
cv2.waitKey(
cv2.destroyAllWindows()
4. 邊緣檢測法
邊緣檢測法通過檢測圖像中的邊緣來識別缺陷區(qū)域。
平滑處理:使用高斯濾波器去除噪聲。
邊緣檢測:使用Canny邊緣檢測算法。
缺陷區(qū)域標(biāo)記:標(biāo)記并計算缺陷區(qū)域的特征值。
示例代碼
python
import
cv2
import
numpy
np
# 讀取圖像
img = cv2.imread(
‘pcb_image.bmp’
,
# 平滑處理
blurred = cv2.GaussianBlur(img, (
),
# 邊緣檢測
edges = cv2.Canny(blurred,
150
# 輪廓提取
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 標(biāo)記缺陷區(qū)域
for
contour
contours:
area = cv2.contourArea(contour)
area >
100
# 設(shè)定閾值
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(img, (x, y), (x + w, y + h), (
255
),
# 顯示結(jié)果
cv2.imshow(
‘Defect Detection’
, img)
cv2.waitKey(
cv2.destroyAllWindows()
以上介紹了幾種常見的基于OpenCV的圖像缺陷檢測方法,包括直方圖比較法、二值化處理法、特征增強(qiáng)法和邊緣檢測法。每種方法都有其適用場景和優(yōu)缺點,開發(fā)者可以根據(jù)具體的檢測需求選擇合適的方法。通過這些方法,可以有效地檢測和標(biāo)記圖像中的缺陷區(qū)域,提高產(chǎn)品質(zhì)量和生產(chǎn)效率。