python opencv图像缺陷比对(轮廓比对)
机器视觉缺陷检测实验
一、实验目的
(1)利用python编写程序实现对图像的缺陷检测;
(2)通过轮廓对比检测出合格产品与不合格产品;
(3)实现在图像上显示文本提示信息;
二、题目描述
(1)读取标准图像并显示;
(2)利用for循环读取待测的对比图像;
(3)将标准图像与一张待测图像进行中值滤波、图像差分、灰度化处理、轮廓提取、最后提取轮廓总数;
(4)将合格产品的轮廓数进行提炼,采用if语句利用轮廓数判断待测图像是否合格;
(5)在合格图像上显示“合格”字样的提示信息,不合格则在相应图像上显示“不合格”。
三、实现过程及运行效果
实验标准图像如下:
图3.1标准图像
实验步骤:
(1)读取标准图像并利用for循环读取待测的对比图像;
(2)将标准图像与一张待测图像进行中值滤波、图像差分、灰度化处理、轮廓提取、最后提取轮廓总数;
代码实例:
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
minThres = 6
# 读取图像1
img=cv2.imread('0.bmp')#读取标准图像
cv2.imshow('YuanTu',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
for i in range(1,6):
imgi=cv2.imread('{}.bmp'.format(i))#依次读取待测图像
#中值滤波
img1 = cv2.medianBlur(img,15)
# 图像差分
diff = cv2.absdiff(img1, imgi)
#灰度图
gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
# 二值化
_,thres = cv2.threshold(gray,minThres,255,cv2.THRESH_BINARY)
# 查找轮廓
contours,hierarchy = cv2.findContours(thres, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
(3)将合格产品的轮廓数进行提炼,采用if语句利用轮廓数判断待测图像是否合格;
代码实例:
if len(contours)>1000:
print('合格')
else:
Print(‘不合格’)
(4)在合格图像上显示“合格”字样的提示信息,不合格则在相应图像上显示“不合格”。
代码实例:
if len(contours)>1000:
print('合格')
#在图像上显示是否合格
src1 = Image.fromarray(cv2.cvtColor(imgi, cv2.COLOR_BGR2RGB))
font = ImageFont.truetype('simsun.ttc', 30)
# 文字输出位置
position = (5,5)
# 输出内容
str = '合格'
draw = ImageDraw.Draw(src1)
draw.text(position, str, font=font, fill=(255, 0, 0))
src1 = cv2.cvtColor(np.asarray(src1), cv2.COLOR_RGB2BGR)
cv2.imshow("CeShi",src1)
cv2.waitKey(0)
else:
print('不合格')
#在图像上显示是否合格
src2 = Image.fromarray(cv2.cvtColor(imgi, cv2.COLOR_BGR2RGB))
font = ImageFont.truetype('simsun.ttc', 30)
# 文字输出位置
position = (5,5)
# 输出内容
str = '不合格'
draw = ImageDraw.Draw(src2)
draw.text(position, str, font=font, fill=(255, 0, 0))
src2 = cv2.cvtColor(np.asarray(src2), cv2.COLOR_RGB2BGR)
cv2.imshow("CeShi",src2)
cv2.waitKey(0)
图3.4.1检测结果图
图3.4.2检测结果图
图3.4.3检测结果图
四、问题及解决方法
(1)刚开始自己想的是将两张灰度图利用equals()函数进行比对看能否通过,结果不难想象确实太天真,这错误很低级了,数据类型都没分清楚的;
(2)在网上查找资料一直找不到怎么直接对两张图像进行缺陷检测比对,只有一个差分检测;
(3)有找到一个关于差异检测的相关资料可是发现其中一个SIF算法被申请了专利不能使用;
(4)最后通过仔细研读了一个博主的代码,几次运行测试发现了轮廓数可以作为判断依据来实现我的目的,所以大胆采用了这一方法,成功实现了本次实验。
五、实验总结
本次实验让我感觉机器视觉实验越来越上升了难度,同时发现老师的高科技实验软件太厉害了,简单方便,科技的力量。本次实验花费了我足足一天的时间才勉强完成任务,之后应该还有一次更加困难的挑战,没有撤退可言唯有迎难而上。