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 相关文章推荐
浅谈编码,解码,乱码的问题
Dec 30 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
python正则实现计算器功能
Dec 14 Python
Centos7 Python3下安装scrapy的详细步骤
Mar 15 Python
Python Numpy:找到list中的np.nan值方法
Oct 30 Python
详解一种用django_cache实现分布式锁的方式
Sep 01 Python
python实现高斯(Gauss)迭代法的例子
Nov 20 Python
Pycharm安装并配置jupyter notebook的实现
May 18 Python
python爬虫实例之获取动漫截图
May 31 Python
.img/.hdr格式转.nii格式的操作
Jul 01 Python
python 下划线的不同用法
Oct 24 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 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 AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
jQuery Tips 为AJAX回调函数传递额外参数的方法
2010/12/28 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
Python实现excel转sqlite的方法
2017/07/17 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
Django模型序列化返回自然主键值示例代码
2019/06/12 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
Python安装依赖(包)模块方法详解
2020/02/14 Python
python和c语言哪个更适合初学者
2020/06/22 Python
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
数据库连接池的工作原理
2012/09/26 面试题
c++工程师面试问题
2013/08/04 面试题
财务与信息服务专业推荐信
2013/11/28 职场文书
葡萄牙语专业个人求职信
2013/12/10 职场文书
《中国的气候》教学反思
2014/02/23 职场文书
学术会议主持词
2014/03/17 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
父母教会我观后感
2015/06/17 职场文书
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
基于Redis的List实现特价商品列表功能
2021/08/30 Redis
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android