圖像缺陷檢測是計算機(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

print

“圖像無缺陷”

else

print

“圖像有缺陷”

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ū)域

opencv缺陷檢測(圖像缺陷檢測)

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)效率。