如何利用opencv编写程序实现缺陷检测,过程是怎样
Admin 2022-07-04 群英技术资讯 486 次浏览
利用opencv
或其他工具编写程序实现缺陷检测。
# -*- coding: utf-8 -*- ''' 作者 : 丁毅 开发时间 : 2021/4/21 15:30 ''' import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont import matplotlib.pyplot as plt #用于给图片添加中文字符的函数 def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20): # 判断是否OpenCV图片类型 if (isinstance(img, np.ndarray)): img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) # 创建一个可以在给定图像上绘图的对象 draw = ImageDraw.Draw(img) # 字体的格式 fontStyle=ImageFont.truetype("font/simsun.ttc",textSize, encoding="utf-8") # 绘制文本 draw.text((left, top), text, textColor, font=fontStyle) # 转换回OpenCV格式 return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) # plt绘图显示中文 plt.rcParams['font.family'] = 'SimHei' img0 = cv2.imread(r"C:\Users\pc\Desktop\0.bmp") cv2.imshow('img', img0) # 彩色图转灰度图 img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY) # 缺陷检测 for i in range(1, 6): defect_img0 = cv2.imread(r"C:\Users\pc\Desktop\%d.bmp"%i) # 获取灰度图像 defect_img1 = cv2.cvtColor(defect_img0, cv2.COLOR_BGR2GRAY) # 获取原图像的灰度直方图 hist0 = cv2.calcHist([img1], [0], None, [256], [0.0, 255.0]) # 获取待检测图像的灰度直方图 hist1 = cv2.calcHist([defect_img1], [0], None, [256], [0.0, 255.0]) # 为图像添加标题 plt.title("原图与待检测img%d对比"%i) # 添加图例 plt.plot(hist0, label='原图') plt.plot(hist1, label='待检测img%d'%i) # 相似度比较 rst = cv2.compareHist(hist0, hist1, method=cv2.HISTCMP_CORREL) # res >= 0.95即认为合格 cv2.imshow(str(i) + ".img", cv2ImgAddText(defect_img0, "合格" if rst >= 0.95 else "不合格", 20, 20, (255, 0, 0), 25)) # 设置x轴的数值范围 plt.xlim([0, 256]) plt.legend(loc='upper left') plt.show() cv2.waitKey(0)
1.获取原图的直方图
参考链接
方式:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]])
images
:输入的图像channels
:选择图像的通道mask
:是一个大小和image
一样的np
数组,其中把需要处理的部分指定为1,不需要处理的部分指定为0,一般设置为None
,表示处理整幅图像。histSize
:使用多少个bin
(柱子),一般为256ranges
:像素值的范围,一般为[0,255]表示0~255
该函数结果返回一个二维数组,该数组反应画面中亮度的分布和比例。
2.比较两个直方图的相似度
参考链接
方式:
cv2.compareHist(H1, H2, method)
H1
:第一个直方图数组H2
:第二个直方图数组(与第一个纬度相同)method
:所使用的方式
该函数返回一个[0,1]
的相似度值,值越接近一就表名相似度越高。
3.相似度参数微调
由于compareHist
函数返回一个[0,1]
的值,需要自己调整一个阈值来选取哪些合格,经过调整后,发现阈值取[0.90, 0.95]
能够正确选取与实验的结果,代码中取的是0.95,即待检测图与原图之间的相似度如果小于0.95则不合格。
4.通过plot显示原图与待检测图的关系折线
参考链接
通过calcHist
函数返回的hist数组值,运用matplotlib
绘制原图和待检测图之间的关系折线图。对比两个曲线的差异。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了如何解决.cuda()加载用时很长的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Spark是基于内存计算的大数据并行计算框架,比MapReduce计算框架具有更高的实时性,同时具有高效容错性和可伸缩性,在学习Spark操作之前,首先介绍Spark运行架构和基本运行流程...
很多Python新手在去重的使用会使用set list,这虽然去重了,但是顺序也被打乱了,如果想要保留顺序,那么要怎样做呢?下面就给大家分享关于Python中list去重而且保留顺序的方法。
这篇文章主要介绍了如何利用Python快速统计文本的行数,要快速统计一个文本文件中的行数,其实就是要统计这个文本文件中换行符的个数,下面我们就一起进入文章看看具体的操作过程吧
这篇文章主要介绍了教你怎么用Python实现多路径迷宫,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008