1. 程式人生 > 程式設計 >python opencv實現圖片缺陷檢測(講解直方圖以及相關係數對比法)

python opencv實現圖片缺陷檢測(講解直方圖以及相關係數對比法)

一、利用直方圖的方式進行批量的圖片缺陷檢測(方法簡單)

python opencv實現圖片缺陷檢測(講解直方圖以及相關係數對比法)

二、步驟(完整程式碼見最後)

2.1灰度轉換(將原圖和要檢測對比的圖分開灰度化)

灰度化的作用是因為後面的直方圖比較需要以畫素256為基準進行相關性比較

img = cv2.imread("0.bmp")
#原圖灰度轉換
gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

#迴圈要檢測的圖,均灰度化
for i in range(1,6):
 t1=cv2.cvtColor(cv2.imread(str(i)+".bmp"),cv2.COLOR_RGB2GRAY)

2.2 直方圖計算(結果其實是二維的圖表--用畫圖的方式展示)

python opencv實現圖片缺陷檢測(講解直方圖以及相關係數對比法)

calcHist引數講解

  • 第一個引數: 必須為列表[],哪怕只有一個圖片 ,image輸入影象
  • channels::傳入影象的通道, 如果是灰度影象,那就不用說了,只有一個通道,值為0 ,如果是彩色影象(有3個通道),那麼值為0,1,2,中選擇一個,對應著BGR各個通道。這個值也得用[]傳入。
  • mask:掩膜影象。 如果統計整幅圖,那麼為none 。主要是如果要統計部分圖的直方圖,就得構造相應的炎掩膜來計算。
  • histSize:灰度級的個數, 需要中括號,比如[256]
  • ranges:畫素值的範圍, 通常[0,256] ,有的影象如果不是0-256,比如說你來回各種變換導致畫素值負值、很大,則需要調整後才可以。

#直方圖計算的函式,反應灰度值的分佈情況
hist = cv2.calcHist([gray],[0],None,[256],[0.0,255.0])

h1 = cv2.calcHist([t1],255.0])

2.3 相關性比較

cv2.compareHist(H1,H2,method)

其中:

  • H1,H2 分別為要比較影象的直方圖
  • method - 比較方式
  • 比較方式(method)
  • 相關性比較 (method=cv.HISTCMP_CORREL) 值越大,相關度越高,最大值為1,最小值為0-----------------------只用一種固然不是很嚴謹,但這裡做示範,把閾值調高也差不多( 取大於等於0.9 )
  • 卡方比較(method=cv.HISTCMP_CHISQR 值越小,相關度越高,最大值無上界,最小值0
  • 巴氏距離比較(method=cv.HISTCMP_BHATTACHARYYA) 值越小,相關度越高,最大值為1,最小值為0
  • #相關性計算,採用相關係數的方式
  • result = cv2.compareHist(hist,h1,method=cv2.HISTCMP_CORREL)

2.4 展示結果(判斷閾值)

相關係數含義參考表

python opencv實現圖片缺陷檢測(講解直方圖以及相關係數對比法)

 im = Image.open(str(i) + ".bmp")

 draw = ImageDraw.Draw(im)
 fnt = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc',30)
 #這裡視作》=0.9認為相似,即合格
 if result >=0.9:
  draw.text((5,10),u'合格',fill='red',font=fnt)
 else:
  draw.text((5,u'不合格',font=fnt)
 im.show("result" +str(i) + ".png")

三、完整程式碼

# -*- coding: UTF-8 -*-
import cv2
from PIL import Image,ImageDraw,ImageFont

img = cv2.imread("0.bmp")
#原圖灰度轉換
gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

for i in range(1,cv2.COLOR_RGB2GRAY)

 #直方圖計算的函式,反應灰度值的分佈情況
 hist = cv2.calcHist([gray],255.0])

 h1 = cv2.calcHist([t1],255.0])
 #相關性計算,採用相關係數的方式
 result = cv2.compareHist(hist,method=cv2.HISTCMP_CORREL)
 im = Image.open(str(i) + ".bmp")

 draw = ImageDraw.Draw(im)
 fnt = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc',font=fnt)
 im.show("result" +str(i) + ".png")

參考博文:

Python-Opencv中用compareHist函式進行直方圖比較進行對比圖片:

https://www.jb51.net/article/184210.htm

OpenCV-Python 直方圖-1:查詢、繪製和分析|二十六: http://baijiahao.baidu.com/s?id=1655424859576397139&wfr=spider&for=pc
希望幫助能大家理解直方圖以及比較函式作用!!!

總結

到此這篇關於python opencv實現圖片缺陷檢測(講解直方圖以及相關係數對比法)的文章就介紹到這了,更多相關python opencv 缺陷檢測內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!