随着自动化技术的快速发展,在工业生产中很多需要人工操作的环节逐渐转由机器完成,工业生产自动化也将越来越多的工人们从枯燥乏味的工作中解放出来,让他们去发挥更大的价值。
产品表面缺陷检测是工业生产中的重要环节,是产品质量把控的关键步骤,借助缺陷检测技术可以有效的提高生产质量和效率。但是由于设备及工艺等因素的影响,产品表面的缺陷类型往往五花八门,比如织物生产中方出现的污点、破损,金属产品上的划痕、裂纹、凹凸不平等各种不同类型的缺陷
给定一个标准的啤酒盖,如下图所示:
通过这个标准的啤酒瓶盖,来判断其他啤酒瓶盖的生产是否标准!
其原理就是通过对灰度图的直方分布比较,在通过相关线性的值的分析,即可得出啤酒瓶盖是否合格!
import cv2
import cv2 as cv
import numpy as np
from PIL import Image, ImageDraw, ImageFont
rgbimage_std = cv.imread("../img/0.bmp")
rgb2grayimage_std = cv2.cvtColor(rgbimage_std, cv2.COLOR_RGB2GRAY)
for i in range(1,6,1):
imagename = "../img/" +str(i) + '.bmp'
rgbimage_defect = cv.imread(imagename)
# 将每次imagename对应图像在图像窗口显示出来
# cv.imshow(imagename, rgbimage_defect)
# 将24位rgbimage_defect彩色图像转换8位rgb2grayimage_defect灰度图
# gray = np.array(rgbimage_defect)
# gray = gray[:, :, 0]
gray = cv2.cvtColor(rgbimage_defect, cv2.COLOR_RGB2GRAY)
print(np.array(gray))
rgb2grayimage_defect = np.array([gray, gray, gray])
# 转 置
rgb2grayimage_defect = np.transpose(rgb2grayimage_defect, (1, 2, 0))
name = str(i) + '_rgb2grayimage_defect.bmp'
# cv.imshow(name, rgb2grayimage_defect)
# 缺陷比较
# 直方图计算的函数,反应灰度值的分布情况
be_compare_image = cv2.calcHist([rgb2grayimage_std], [0], None, [256], [0.0, 255.0])
compare_image = cv2.calcHist([rgb2grayimage_defect], [0], None, [256], [0.0, 255.0])
# 相关性计算,采用相关系数的方式
# result = cv2.compareHist(be_compare_image,compare_image,method=cv2.HISTCMP_CORREL)
result = sum(be_compare_image - compare_image)[0]
# 打开PIL创建的图像
ss = Image.open("../img/" + str(i) + ".bmp")
# 创建一个操作对象
draw = ImageDraw.Draw(ss)
# 字体对象为simsun,字大小为50号
fnt = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc', 50)
# 如果图片对比原图相似度小于7,则合格;否则不合格。
if result < 7:
draw.text((5, 10), u'合格', fill='red', font=fnt)
th_str = str(i) + '.bmp'
draw.text((5, 350), th_str, fill='red', font=fnt)
else:
draw.text((5, 10), u'不合格', fill='red', font=fnt)
th_str = str(i) + '.bmp'
draw.text((5, 350), th_str, fill='red', font=fnt)
ss.show("result" + str(i) + ".png")
cv.waitKey(0)