Python opencv缺陷檢測(cè)的實(shí)現(xiàn)及問題解決
題目描述
利用opencv
或其他工具編寫程序?qū)崿F(xiàn)缺陷檢測(cè)。
實(shí)現(xiàn)過程
# -*- coding: utf-8 -*- ''' 作者 : 丁毅 開發(fā)時(shí)間 : 2021/4/21 15:30 ''' import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont import matplotlib.pyplot as plt #用于給圖片添加中文字符的函數(shù) def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20): # 判斷是否OpenCV圖片類型 if (isinstance(img, np.ndarray)): img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) # 創(chuàng)建一個(gè)可以在給定圖像上繪圖的對(duì)象 draw = ImageDraw.Draw(img) # 字體的格式 fontStyle=ImageFont.truetype("font/simsun.ttc",textSize, encoding="utf-8") # 繪制文本 draw.text((left, top), text, textColor, font=fontStyle) # 轉(zhuǎn)換回OpenCV格式 return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) # plt繪圖顯示中文 plt.rcParams['font.family'] = 'SimHei' img0 = cv2.imread(r"C:\Users\pc\Desktop\0.bmp") cv2.imshow('img', img0) # 彩色圖轉(zhuǎn)灰度圖 img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY) # 缺陷檢測(cè) for i in range(1, 6): defect_img0 = cv2.imread(r"C:\Users\pc\Desktop\%d.bmp"%i) # 獲取灰度圖像 defect_img1 = cv2.cvtColor(defect_img0, cv2.COLOR_BGR2GRAY) # 獲取原圖像的灰度直方圖 hist0 = cv2.calcHist([img1], [0], None, [256], [0.0, 255.0]) # 獲取待檢測(cè)圖像的灰度直方圖 hist1 = cv2.calcHist([defect_img1], [0], None, [256], [0.0, 255.0]) # 為圖像添加標(biāo)題 plt.title("原圖與待檢測(cè)img%d對(duì)比"%i) # 添加圖例 plt.plot(hist0, label='原圖') plt.plot(hist1, label='待檢測(cè)img%d'%i) # 相似度比較 rst = cv2.compareHist(hist0, hist1, method=cv2.HISTCMP_CORREL) # res >= 0.95即認(rèn)為合格 cv2.imshow(str(i) + ".img", cv2ImgAddText(defect_img0, "合格" if rst >= 0.95 else "不合格", 20, 20, (255, 0, 0), 25)) # 設(shè)置x軸的數(shù)值范圍 plt.xlim([0, 256]) plt.legend(loc='upper left') plt.show() cv2.waitKey(0)
運(yùn)行結(jié)果
問題及解決方法
1.獲取原圖的直方圖
參考鏈接
方式:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]])
images
:輸入的圖像channels
:選擇圖像的通道mask
:是一個(gè)大小和image
一樣的np
數(shù)組,其中把需要處理的部分指定為1,不需要處理的部分指定為0,一般設(shè)置為None
,表示處理整幅圖像。histSize
:使用多少個(gè)bin
(柱子),一般為256ranges
:像素值的范圍,一般為[0,255]表示0~255
該函數(shù)結(jié)果返回一個(gè)二維數(shù)組,該數(shù)組反應(yīng)畫面中亮度的分布和比例。
2.比較兩個(gè)直方圖的相似度
參考鏈接
方式:
cv2.compareHist(H1, H2, method)
H1
:第一個(gè)直方圖數(shù)組H2
:第二個(gè)直方圖數(shù)組(與第一個(gè)緯度相同)method
:所使用的方式
該函數(shù)返回一個(gè)[0,1]
的相似度值,值越接近一就表名相似度越高。
3.相似度參數(shù)微調(diào)
由于compareHist
函數(shù)返回一個(gè)[0,1]
的值,需要自己調(diào)整一個(gè)閾值來選取哪些合格,經(jīng)過調(diào)整后,發(fā)現(xiàn)閾值取[0.90, 0.95]
能夠正確選取與實(shí)驗(yàn)的結(jié)果,代碼中取的是0.95,即待檢測(cè)圖與原圖之間的相似度如果小于0.95則不合格。
4.通過plot顯示原圖與待檢測(cè)圖的關(guān)系折線
參考鏈接
通過calcHist
函數(shù)返回的hist數(shù)組值,運(yùn)用matplotlib
繪制原圖和待檢測(cè)圖之間的關(guān)系折線圖。對(duì)比兩個(gè)曲線的差異。
到此這篇關(guān)于Python opencv缺陷檢測(cè)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)opencv缺陷檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django?使用VScode?創(chuàng)建工程的詳細(xì)步驟
這篇文章主要介紹了Django?使用VScode?創(chuàng)建工程,創(chuàng)建Django 項(xiàng)目,可以和虛擬環(huán)境放在同一目錄,也可以放在虛擬環(huán)境的文件夾里,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09Python處理yaml和嵌套數(shù)據(jù)結(jié)構(gòu)技巧示例
這篇文章主要為大家介紹了Python處理yaml和嵌套數(shù)據(jù)結(jié)構(gòu)技巧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Python 循環(huán)讀取數(shù)據(jù)內(nèi)存不足的解決方案
這篇文章主要介紹了Python 循環(huán)讀取數(shù)據(jù)內(nèi)存不足的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05python3中類的繼承以及self和super的區(qū)別詳解
今天小編就為大家分享一篇python3中類的繼承以及self和super的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python通過Pillow實(shí)現(xiàn)圖片對(duì)比
這篇文章主要介紹了Python Pillow實(shí)現(xiàn)圖片對(duì)比,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Python實(shí)現(xiàn)端口檢測(cè)的方法
這篇文章主要介紹了Python實(shí)現(xiàn)端口檢測(cè)的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07Python通過WHL文件實(shí)現(xiàn)離線安裝的操作詳解
在Python開發(fā)中,我們經(jīng)常需要安裝第三方庫(kù)來擴(kuò)展Python的功能,通常情況下,我們可以通過pip命令在線安裝這些庫(kù),此時(shí),WHL(Wheel)文件成為了非常實(shí)用的解決方案,本教程將結(jié)合實(shí)際案例,詳細(xì)介紹如何通過WHL文件在Python中進(jìn)行離線安裝,需要的朋友可以參考下2024-08-08