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)最后通过仔细研读了一个博主的代码,几次运行测试发现了轮廓数可以作为判断依据来实现我的目的,所以大胆采用了这一方法,成功实现了本次实验。

五、实验总结

本次实验让我感觉机器视觉实验越来越上升了难度,同时发现老师的高科技实验软件太厉害了,简单方便,科技的力量。本次实验花费了我足足一天的时间才勉强完成任务,之后应该还有一次更加困难的挑战,没有撤退可言唯有迎难而上。

 

posted @ 2020-04-04 17:58  Jokerˇ  阅读(3865)  评论(0编辑  收藏  举报