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 直方圖計算(結果其實是二維的圖表--用畫圖的方式展示)

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], [0], None, [256], [0.0,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 展示結果(判斷閾值)

相關系數含義參考表

 

 

 

 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, 10), u'不合格', fill='red', 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, 6):
    t1=cv2.cvtColor(cv2.imread(str(i)+".bmp"),cv2.COLOR_RGB2GRAY)

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

    h1 = cv2.calcHist([t1], [0], None, [256], [0.0,255.0])
    #相關性計算,采用相關系數的方式
    result = cv2.compareHist(hist,h1,method=cv2.HISTCMP_CORREL)
    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, 10), u'不合格', fill='red', font=fnt)
    im.show("result" +str(i) + ".png")

參考博文:

  1. Python-Opencv中用compareHist函數進行直方圖比較進行對比圖片:https://blog.csdn.net/qq_44262417/article/details/89217011
  2. OpenCV-Python 直方圖-1:查找、繪制和分析|二十六:http://baijiahao.baidu.com/s?id=1655424859576397139&wfr=spider&for=pc

 希望幫助能大家理解直方圖以及比較函數作用!!!

 


免責聲明!

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



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