python opencv圖像缺陷比對(輪廓比對)


機器視覺缺陷檢測實驗

一、實驗目的

1)利用python編寫程序實現對圖像的缺陷檢測;

2)通過輪廓對比檢測出合格產品與不合格產品;

3)實現在圖像上顯示文本提示信息;

二、題目描述

1)讀取標准圖像並顯示;

2)利用for循環讀取待測的對比圖像;

3)將標准圖像與一張待測圖像進行中值濾波、圖像差分、灰度化處理、輪廓提取、最后提取輪廓總數;

4)將合格產品的輪廓數進行提煉,采用if語句利用輪廓數判斷待測圖像是否合格;

5)在合格圖像上顯示“合格”字樣的提示信息,不合格則在相應圖像上顯示“不合格”。

三、實現過程及運行效果

實驗標准圖像如下:

3.1標准圖像

實驗步驟:

1)讀取標准圖像並利用for循環讀取待測的對比圖像;

2)將標准圖像與一張待測圖像進行中值濾波、圖像差分、灰度化處理、輪廓提取、最后提取輪廓總數;

代碼實例:

import cv2

import numpy as np

from PIL import Image, ImageDraw, ImageFont

minThres = 6

# 讀取圖像1

img=cv2.imread('0.bmp')#讀取標准圖像 

cv2.imshow('YuanTu',img)

cv2.waitKey(0)

cv2.destroyAllWindows()

for i in range(1,6):

imgi=cv2.imread('{}.bmp'.format(i))#依次讀取待測圖像

#中值濾波

img1 = cv2.medianBlur(img,15)

# 圖像差分

diff = cv2.absdiff(img1, imgi)

#灰度圖

gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)

# 二值化

_,thres = cv2.threshold(gray,minThres,255,cv2.THRESH_BINARY)

# 查找輪廓

contours,hierarchy = cv2.findContours(thres, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

3)將合格產品的輪廓數進行提煉,采用if語句利用輪廓數判斷待測圖像是否合格;

代碼實例:

if len(contours)>1000:

print('合格')

else:

Print(‘不合格’)

4)在合格圖像上顯示“合格”字樣的提示信息,不合格則在相應圖像上顯示“不合格”。

代碼實例:

if len(contours)>1000:

print('合格')

#在圖像上顯示是否合格

src1 = Image.fromarray(cv2.cvtColor(imgi, cv2.COLOR_BGR2RGB))

font = ImageFont.truetype('simsun.ttc', 30)

# 文字輸出位置

position = (5,5)

# 輸出內容

str = '合格'

draw = ImageDraw.Draw(src1)

draw.text(position, str, font=font, fill=(255, 0, 0))

src1 = cv2.cvtColor(np.asarray(src1), cv2.COLOR_RGB2BGR)

cv2.imshow("CeShi",src1)

cv2.waitKey(0)

else:

print('不合格')

#在圖像上顯示是否合格

src2 = Image.fromarray(cv2.cvtColor(imgi, cv2.COLOR_BGR2RGB))

font = ImageFont.truetype('simsun.ttc', 30)

# 文字輸出位置

position = (5,5)

# 輸出內容

str = '不合格'

draw = ImageDraw.Draw(src2)

draw.text(position, str, font=font, fill=(255, 0, 0))

src2 = cv2.cvtColor(np.asarray(src2), cv2.COLOR_RGB2BGR)

cv2.imshow("CeShi",src2)

cv2.waitKey(0)

 

3.4.1檢測結果圖

3.4.2檢測結果圖

 

3.4.3檢測結果圖

 

四、問題及解決方法

1)剛開始自己想的是將兩張灰度圖利用equals()函數進行比對看能否通過,結果不難想象確實太天真,這錯誤很低級了,數據類型都沒分清楚的;

2)在網上查找資料一直找不到怎么直接對兩張圖像進行缺陷檢測比對,只有一個差分檢測;

3)有找到一個關於差異檢測的相關資料可是發現其中一個SIF算法被申請了專利不能使用;

4)最后通過仔細研讀了一個博主的代碼,幾次運行測試發現了輪廓數可以作為判斷依據來實現我的目的,所以大膽采用了這一方法,成功實現了本次實驗。

五、實驗總結

本次實驗讓我感覺機器視覺實驗越來越上升了難度,同時發現老師的高科技實驗軟件太厲害了,簡單方便,科技的力量。本次實驗花費了我足足一天的時間才勉強完成任務,之后應該還有一次更加困難的挑戰,沒有撤退可言唯有迎難而上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM