利用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时就可以认为合格。