这篇教程Python opencv缺陷检测的实现及问题解决写得很实用,希望能帮到您。 题目描述
利用opencv 或其他工具编写程序实现缺陷检测。 实现过程# -*- coding: utf-8 -*-'''作者 : 丁毅开发时间 : 2021/4/21 15:30'''import cv2import numpy as npfrom PIL import Image, ImageDraw, ImageFontimport 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 绘制原图和待检测图之间的关系折线图。对比两个曲线的差异。 到此这篇关于Python opencv缺陷检测的实现的文章就介绍到这了,更多相关opencv缺陷检测内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net! 解决jupyter notebook启动后没有token的坑 Jupyter notebook 输出部分显示不全的解决方案 |