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


Posted in Python onApril 24, 2021

题目描述

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

到此这篇关于Python opencv缺陷检测的实现的文章就介绍到这了,更多相关opencv缺陷检测内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中请使用isinstance()判断变量类型
Aug 25 Python
简化Python的Django框架代码的一些示例
Apr 20 Python
Python修改MP3文件的方法
Jun 15 Python
Python3.4 tkinter,PIL图片转换
Jun 21 Python
python模块之subprocess模块级方法的使用
Mar 26 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
May 13 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
wxPython实现绘图小例子
Nov 19 Python
用Python做一个久坐提醒小助手的示例代码
Feb 10 Python
解决Python 函数声明先后顺序出现的问题
Sep 02 Python
用Python提取PDF表格的方法
Apr 11 Python
python多线程方法详解
Jan 18 Python
解决jupyter notebook启动后没有token的坑
numpy数据类型dtype转换实现
Apr 24 #Python
解决python存数据库速度太慢的问题
Apr 23 #Python
python实战之90行代码写个猜数字游戏
Apr 22 #Python
python实战之一步一步教你绘制小猪佩奇
Apr 22 #Python
python 破解加密zip文件的密码
python入门之算法学习
Apr 22 #Python
You might like
简单谈谈PHP vs Node.js
2015/07/17 PHP
php cli模式下获取参数的方法
2017/05/05 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
jQuery中:has选择器用法实例
2014/12/30 Javascript
JavaScript通过select动态更换图片的方法
2015/03/23 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
vue观察模式浅析
2018/09/25 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
2018/10/09 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
python 多进程通信模块的简单实现
2014/02/20 Python
在python的WEB框架Flask中使用多个配置文件的解决方法
2014/04/18 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
Python 实现链表实例代码
2017/04/07 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
python实现坦克大战
2020/04/24 Python
微观物理专业自荐信
2014/01/26 职场文书
学生会招新策划书
2014/02/14 职场文书
信息技术毕业生自荐信范文
2014/03/13 职场文书
团支部推优材料
2014/05/21 职场文书
党的生日演讲稿
2014/09/10 职场文书
2016元旦主持人开场白
2015/12/03 职场文书