圖像缺陷檢測(cè)是計(jì)算機(jī)視覺(jué)中的一個(gè)重要應(yīng)用,廣泛應(yīng)用于工業(yè)制造、醫(yī)療影像分析等領(lǐng)域。OpenCV 是一個(gè)強(qiáng)大的計(jì)算機(jī)視覺(jué)庫(kù),提供了豐富的圖像處理工具,可以幫助開(kāi)發(fā)者高效地實(shí)現(xiàn)圖像缺陷檢測(cè)。

1. 直方圖比較法

一種常見(jiàn)的圖像缺陷檢測(cè)方法是通過(guò)直方圖比較。這種方法的基本步驟如下:

灰度化:將原圖和待檢測(cè)圖片轉(zhuǎn)換為灰度圖。

直方圖計(jì)算:計(jì)算灰度圖的直方圖。

直方圖比較:通過(guò)比較兩個(gè)直方圖的相關(guān)性來(lái)判斷是否存在缺陷。當(dāng)兩圖相關(guān)系數(shù)大于等于0.9時(shí),認(rèn)為圖像無(wú)缺陷,否則視為有缺陷。

示例代碼

python

import

cv2

import

numpy

np

# 讀取圖像

img1 = cv2.imread(

‘original_image.bmp’

,

img2 = cv2.imread(

‘test_image.bmp’

,

# 計(jì)算直方圖

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

“圖像無(wú)缺陷”

else

print

“圖像有缺陷”

2. 二值化處理法

二值化處理法是另一種常用的圖像缺陷檢測(cè)方法。通過(guò)將圖像轉(zhuǎn)換為二值圖像,可以更容易地提取和分析缺陷區(qū)域。

平滑處理:使用中值濾波或其他平滑濾波器去除噪聲。

二值化:將圖像轉(zhuǎn)換為二值圖像。

輪廓提取:提取圖像中的輪廓。

缺陷區(qū)域標(biāo)記:標(biāo)記并計(jì)算缺陷區(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缺陷檢測(cè)(圖像缺陷檢測(cè))

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)法通過(guò)增強(qiáng)圖像的局部特征來(lái)提高缺陷檢測(cè)的準(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. 邊緣檢測(cè)法

邊緣檢測(cè)法通過(guò)檢測(cè)圖像中的邊緣來(lái)識(shí)別缺陷區(qū)域。

平滑處理:使用高斯濾波器去除噪聲。

邊緣檢測(cè):使用Canny邊緣檢測(cè)算法。

缺陷區(qū)域標(biāo)記:標(biāo)記并計(jì)算缺陷區(qū)域的特征值。

示例代碼

python

import

cv2

import

numpy

np

# 讀取圖像

img = cv2.imread(

‘pcb_image.bmp’

,

# 平滑處理

blurred = cv2.GaussianBlur(img, (

),

# 邊緣檢測(cè)

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

以上介紹了幾種常見(jiàn)的基于OpenCV的圖像缺陷檢測(cè)方法,包括直方圖比較法、二值化處理法、特征增強(qiáng)法和邊緣檢測(cè)法。每種方法都有其適用場(chǎng)景和優(yōu)缺點(diǎn),開(kāi)發(fā)者可以根據(jù)具體的檢測(cè)需求選擇合適的方法。通過(guò)這些方法,可以有效地檢測(cè)和標(biāo)記圖像中的缺陷區(qū)域,提高產(chǎn)品質(zhì)量和生產(chǎn)效率。