实验七、缺陷检测

一、 题目描述

​ 对下面的图片进行缺陷检测操作,请详细地记录每一步操作的步骤。

​ 第一站图片是标准样品,后面几张图中有几个样品有瑕疵,需要你通过计算在图片上显示出哪张是合格,哪张不合格。







**1.思路**

​ Python-Opencv中用compareHist函数进行直方图比较进而对比图片

图像直方图

图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。

图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。在实际工程中,图像直方图在特征提取、图像匹配等方面都有很好的应用。

直方图比较

1.图像相似度比较

如果我们有两张图像,并且这两张图像的直方图一样,或者有极高的相似度,那么在一定程度上,我们可以认为这两幅图是一样的,这就是直方图比较的应用之一。

2.分析图像之间关系

两张图像的直方图反映了该图像像素的分布情况,可以利用图像的直方图,来分析两张图像的关系。

直方图比较函数

cv2.compareHist(H1, H2, method)

其中:

  • H1,H2 分别为要比较图像的直方图

  • method - 比较方式

比较方式(method)

  • 相关性比较 (method=cv.HISTCMP_CORREL) 值越大,相关度越高,最大值为1,最小值为0
  • 卡方比较(method=cv.HISTCMP_CHISQR 值越小,相关度越高,最大值无上界,最小值0
  • 巴氏距离比较(method=cv.HISTCMP_BHATTACHARYYA) 值越小,相关度越高,最大值为1,最小值为0

二、 实现过程

1.给图片添加文字的函数

#用于给图片添加中文字符
def ImgText_CN(img, text, left, top, textColor=(0, 255, 0), textSize=20):
if (isinstance(img, np.ndarray)): #判断是否为OpenCV图片类型
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img)
fontText = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc', textSize, encoding="utf-8")
draw.text((left, top), text, textColor, font=fontText)
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

2.比较相关性并绘制文字

def compare(result,img0,i):
if result >0.9:
detect=ImgText_CN(img0, '合格', 10, 10, textColor=(255, 0, 0), textSize=30)
else:
detect=ImgText_CN(img0, '不合格', 10, 10, textColor=(255, 0, 0), textSize=30)
cv2.imshow("Detect_%d"%(i),detect)
key = cv2.waitKey(0)
if key==27: #按esc键时,关闭所有窗口
print(key)
cv2.destroyAllWindows()

3.创建灰度直方图

def create_hist(img):
img = cv2.imread(img) #读取图片
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #将图片转化为8bit灰度图 plt.imshow(img_gray, cmap=plt.cm.gray) #显示图片 hist = cv2.calcHist([img], [0], None, [256], [0, 256]) #灰度直方图 plt.figure()
plt.title("Grayscale Histogram")
plt.xlabel("Bins")
plt.ylabel("# of Pixels")
plt.plot(hist)
plt.xlim([0, 256])
plt.show()
return hist

4.完整代码

%matplotlib inline
from matplotlib import pyplot as plt
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont #用于给图片添加中文字符
def ImgText_CN(img, text, left, top, textColor=(0, 255, 0), textSize=20):
if (isinstance(img, np.ndarray)): #判断是否为OpenCV图片类型
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img)
fontText = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc', textSize, encoding="utf-8") ##中文字体
draw.text((left, top), text, textColor, font=fontText) #写文字
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) def compare(result,img0,i):
if result >0.9: #相关性大于0.9为合格,反之为不合格
detect=ImgText_CN(img0, '合格', 10, 10, textColor=(255, 0, 0), textSize=30)
else:
detect=ImgText_CN(img0, '不合格', 10, 10, textColor=(255, 0, 0), textSize=30)
cv2.imshow("Detect_%d"%(i),detect) #显示绘制后的图片
key = cv2.waitKey(0)
if key==27: #按esc键时,关闭所有窗口
print(key)
cv2.destroyAllWindows() def create_hist(img):
img = cv2.imread(img) #读取图片
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #将图片转化为8bit灰度图 plt.imshow(img_gray, cmap=plt.cm.gray) #显示图片
hist = cv2.calcHist([img], [0], None, [256], [0, 256]) #灰度直方图
plt.figure()
plt.title("Grayscale Histogram")
plt.xlabel("Bins")
plt.ylabel("# of Pixels")
plt.plot(hist)
plt.xlim([0, 256])
plt.show()
return hist hist1=create_hist("0.png") #给标准样品绘制直方图
for i in range(1,6):
print(i) #打印图片序号
img=cv2.imread("%d.bmp"%(i),1)
hist2=create_hist("%d.bmp"%(i)) #给测试样品绘制直方图
match1 = cv2.compareHist(hist1, hist2, cv2.HISTCMP_BHATTACHARYYA) #返回巴氏距离
match2 = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL) #返回相关性
print("巴氏距离:%s, 相关性:%s" %(match1, match2))
print("\n")
compare(match2,img,i) #比较并绘制

三、 运行结果(效果)






四、 问题及解决方法

  1. 中文无法输入,解决方案:引入中文字体

五、 实验总结

通过查阅资料,学习了OpenCV的缺陷检测技术,提升了自己的能力。

实验参考:https://blog.csdn.net/qq_44262417/article/details/89217011

Opencv+Python实现缺陷检测的更多相关文章

  1. OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  2. 手把手教你如何用 OpenCV + Python 实现人脸检测

    配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like Haar-like百科释义.通俗的来讲 ...

  3. opencv python:直线检测 与 圆检测

    霍夫直线变换介绍 霍夫圆检测 现实中: example import cv2 as cv import numpy as np # 关于霍夫变换的相关知识可以看看这个博客:https://blog.c ...

  4. opencv python运动人体检测

    采用非极大值抑制,将重叠的框合并成一个. # import the necessary packages from imutils.object_detection import non_max_su ...

  5. opencv+python实时人脸检测、磨皮

    import numpy as np import cv2 cap = cv2.VideoCapture(0) face_cascade = cv2.CascadeClassifier("d ...

  6. python opencv 图片缺陷检测(讲解直方图以及相关系数对比法)

    一.利用直方图的方式进行批量的图片缺陷检测(方法简单) 二.步骤(完整代码见最后) 2.1灰度转换(将原图和要检测对比的图分开灰度化) 灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关 ...

  7. Python人体肤色检测

    代码地址如下:http://www.demodashi.com/demo/12967.html Python人体肤色检测 概述 本文中的人体肤色检测功能采用 OpenCV 库实现, OpenCV是一个 ...

  8. OpenCV例程实现人脸检测

    前段时间看的OpenCV,其实有很多的例子程序,参考代码值得我们学习,对图像特征提取三大法宝:HOG特征,LBP特征,Haar特征有一定了解后. 对本文中的例子程序刚开始没有调通,今晚上调通了,试了试 ...

  9. OpenCV Python教程(3、直方图的计算与显示)

    转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...

随机推荐

  1. Django入门4: ORM 数据库操作

    大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...

  2. bfs—Dungeon Master—poj2251

    Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32228   Accepted: 12378 ...

  3. 使用PHP-Beast加密你的PHP源代码

    PHP-Beast是一个PHP源码加密的模块,其使用DES算法加密,用户可以自定义加密的key来加密源代码. 1. PHP-Beast的安装 $ wget https://github.com/lie ...

  4. 洛谷2014 选课(树形DP)树形背包问题

    题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...

  5. linux上github的简单使用

    Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目前,包括Rubinius ...

  6. Spring MVC的Controller接受请求方式以及编写请求处理方法

    Controller接受请求参数的常见方法: 1.通过Bean接受请求参数: 创建POJO实体类 创建pojo包,并在该包中创建实体类UserForm,代码: package pojo; public ...

  7. qt creator源码全方面分析(4-3)

    内外命名空间 QtCreator源码中,每一个子项目都有内外两层命名空间,一个是外部的,一个是内部的. 示例如下 namespace ExtensionSystem { namespace Inter ...

  8. dbcp数据源连接池

    一.数据源连接池 我们之前利用jdbc连接数据库,每次都要创建连接对象,销毁连接对象,如果并发访问量比较大,这样肯定比较辣 浪费数据库的效率,我们可以像之前mybatis中缓存查询到的数据一样,可以把 ...

  9. Prime Path素数筛与BFS动态规划

    埃拉托斯特尼筛法(sieve of Eratosthenes ) 是古希腊数学家埃拉托斯特尼发明的计算素数的方法.对于求解不大于n的所有素数,我们先找出sqrt(n)内的所有素数p1到pk,其中k = ...

  10. 【HBase】HBase和Hue的整合

    目录 一.修改hue.ini配置文件 二.启动HBase的thrift server服务 三.启动Hue 四.页面访问 一.修改hue.ini配置文件 cd /export/servers/hue-3 ...