当先锋百科网

首页 1 2 3 4 5 6 7

利用opencv或其他工具编写实现下列图片的缺陷检测

原图

运行结果如下

检测后的图1

检测后的图2

检测后的图3

检测后的图4

检测后的图5

代码如下

import cv2
import numpy as np
from PIL import Image,ImageDraw,ImageFont


rgbimage_std=cv2.imread("E:\\0.bmp")
cv2.imshow("img",rgbimage_std)
#彩色图转灰度图
rgb2grayimage_std = cv2.cvtColor(rgbimage_std,cv2.COLOR_BGR2GRAY)
cv2.imshow('imag1',rgb2grayimage_std)
#图片显示文字
def show_message(img,str,color):
    pil_img1 = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    pilimg1 = Image.fromarray(pil_img1)  #将数组类型转成图片格式
    draw = ImageDraw.Draw(pilimg1)       #在PIL图片上打印汉字
    font = ImageFont.truetype("simhei.ttf",50,encoding="utf-8")
    draw.text((5,5),str,color,font=font)
    img_1 = cv2.cvtColor(np.array(pilimg1),cv2.COLOR_RGB2BGR)   #将图片转成cv2.imshow()可以显示的数组格式
    return img_1
#缺陷检测
for index in range(1,6):
    rgbimage_defect=cv2.imread("E:\\%d.bmp"%(index))
    rgb2grayimage_defect = cv2.cvtColor(rgbimage_defect,cv2.COLOR_BGR2GRAY)
    #获取原图像的直方图
    hist = cv2.calcHist([rgb2grayimage_std],[0],None,[256],[0.0,255.0])
    #获取待检测图像的直方图
    h1 = cv2.calcHist([rgb2grayimage_defect],[0],None,[256],[0.0,255.0])
    #直方图相似度比较
    result = cv2.compareHist(hist,h1,method=cv2.HISTCMP_CORREL)
    
    #>=0.9认为相似,即合格
    if result >=0.9:
        cv2.imshow(str(index)+".img",show_message(rgbimage_defect,"合格",(255,0,0)))
    else:
        cv2.imshow(str(index)+".img",show_message(rgbimage_defect,"不合格",(255,0,0)))

cv2.waitKey(0)

出现的问题

在进行检测是否合格时,出现下图没有明显缺陷也判定为不合格的情况,可以看到下图与原图的区别只是旋转了,并未出现磨损等瑕疵。

解决方法:

这种情况是因为在检测时,直方图比较的结果result=1时才判定为合格,这种判断太过严苛,而实际上result>=0.9时就可以认为合格。