Python opencv缺陷检测的实现及问题解决

作者:Dream丶Killer 时间:2023-03-10 20:41:55 

题目描述

利用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)

运行结果

Python opencv缺陷检测的实现及问题解决

Python opencv缺陷检测的实现及问题解决

Python opencv缺陷检测的实现及问题解决

Python opencv缺陷检测的实现及问题解决

Python opencv缺陷检测的实现及问题解决

Python opencv缺陷检测的实现及问题解决

Python opencv缺陷检测的实现及问题解决

Python opencv缺陷检测的实现及问题解决

Python opencv缺陷检测的实现及问题解决

Python opencv缺陷检测的实现及问题解决

Python opencv缺陷检测的实现及问题解决

问题及解决方法

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绘制原图和待检测图之间的关系折线图。对比两个曲线的差异。

来源:https://blog.csdn.net/qq_43965708/article/details/

标签:opencv,缺陷检测
0
投稿

猜你喜欢

  • 为vue项目自动设置请求状态的配置方法

    2024-04-30 10:44:26
  • 关于MySQL分区表的一个性能BUG

    2024-01-17 00:30:11
  • MySQL查询两个日期之间记录的方法

    2024-01-21 19:47:40
  • window.print()局部打印三种方式(小结)

    2024-04-28 10:18:57
  • nodejs开发——express路由与中间件

    2024-05-11 10:18:04
  • 设计师如何更有效拿到结果?

    2008-09-22 20:30:00
  • Django REST Swagger实现指定api参数

    2023-03-10 05:48:58
  • InnoDB解决幻读的方法详解

    2024-01-15 13:50:53
  • C#连接Oracle数据库字符串(引入DLL)的方式

    2024-01-25 16:10:07
  • 基于prototype扩展的JavaScript常用函数库

    2023-08-24 15:09:57
  • 纯Javascript实现Windows 8 Metro风格实现

    2024-04-19 10:41:31
  • python 爬虫爬取京东ps4售卖情况

    2022-05-19 01:35:28
  • HTML5 离线存储之Web SQL

    2011-06-19 14:13:19
  • Bootstrap modal使用及点击外部不消失的解决方法

    2024-04-10 13:56:45
  • ElementUI日期选择器时间选择范围限制的实现

    2024-04-09 11:00:28
  • python的三目运算符和not in运算符使用示例

    2021-07-18 23:36:35
  • 数据库大战: MS SQL Server & IBM DB2

    2009-08-25 16:24:00
  • python爬虫之selenium库的安装及使用教程

    2021-04-22 20:20:46
  • python入门之井字棋小游戏

    2021-12-11 11:35:36
  • python实现21点小游戏

    2023-11-21 08:58:27
  • asp之家 网络编程 m.aspxhome.com