python opencv 图片缺陷检测(讲解直方图以及相关系数对比法)
一、利用直方图的方式进行批量的图片缺陷检测(方法简单)

二、步骤(完整代码见最后)
2.1灰度转换(将原图和要检测对比的图分开灰度化)
灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关性比较
img = cv2.imread("0.bmp")
#原图灰度转换
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
#循环要检测的图,均灰度化
for i in range(1, 6):
t1=cv2.cvtColor(cv2.imread(str(i)+".bmp"),cv2.COLOR_RGB2GRAY)
2.2 直方图计算(结果其实是二维的图表--用画图的方式展示)

calcHist参数讲解
- 第一个参数:必须为列表[],哪怕只有一个图片,image输入图像
- channels::传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也得用[]传入。
- mask:掩膜图像。如果统计整幅图,那么为none。主要是如果要统计部分图的直方图,就得构造相应的炎掩膜来计算。
- histSize:灰度级的个数,需要中括号,比如[256]
- ranges:像素值的范围,通常[0,256],有的图像如果不是0-256,比如说你来回各种变换导致像素值负值、很大,则需要调整后才可以。
#直方图计算的函数,反应灰度值的分布情况
hist = cv2.calcHist([gray], [0], None, [256], [0.0,255.0]) h1 = cv2.calcHist([t1], [0], None, [256], [0.0,255.0])
2.3 相关性比较
cv2.compareHist(H1, H2, method)
其中:
- H1,H2 分别为要比较图像的直方图
- method - 比较方式
- 比较方式(method)
- 相关性比较 (method=cv.HISTCMP_CORREL) 值越大,相关度越高,最大值为1,最小值为0-----------------------只用一种固然不是很严谨,但这里做示范,把阈值调高也差不多(取大于等于0.9)
- 卡方比较(method=cv.HISTCMP_CHISQR 值越小,相关度越高,最大值无上界,最小值0
- 巴氏距离比较(method=cv.HISTCMP_BHATTACHARYYA) 值越小,相关度越高,最大值为1,最小值为0
#相关性计算,采用相关系数的方式
result = cv2.compareHist(hist,h1,method=cv2.HISTCMP_CORREL)
2.4 展示结果(判断阈值)
相关系数含义参考表

im = Image.open(str(i) + ".bmp")
draw = ImageDraw.Draw(im)
fnt = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc', 30)
#这里视作》=0.9认为相似,即合格
if result >=0.9:
draw.text((5, 10), u'合格', fill='red', font=fnt)
else:
draw.text((5, 10), u'不合格', fill='red', font=fnt)
im.show("result" +str(i) + ".png")
三、完整代码
# -*- coding: UTF-8 -*-
import cv2
from PIL import Image, ImageDraw, ImageFont img = cv2.imread("0.bmp")
#原图灰度转换
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) for i in range(1, 6):
t1=cv2.cvtColor(cv2.imread(str(i)+".bmp"),cv2.COLOR_RGB2GRAY) #直方图计算的函数,反应灰度值的分布情况
hist = cv2.calcHist([gray], [0], None, [256], [0.0,255.0]) h1 = cv2.calcHist([t1], [0], None, [256], [0.0,255.0])
#相关性计算,采用相关系数的方式
result = cv2.compareHist(hist,h1,method=cv2.HISTCMP_CORREL)
im = Image.open(str(i) + ".bmp") draw = ImageDraw.Draw(im)
fnt = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc', 30)
#这里视作》=0.9认为相似,即合格
if result >=0.9:
draw.text((5, 10), u'合格', fill='red', font=fnt)
else:
draw.text((5, 10), u'不合格', fill='red', font=fnt)
im.show("result" +str(i) + ".png")
参考博文:
- Python-Opencv中用compareHist函数进行直方图比较进行对比图片:https://blog.csdn.net/qq_44262417/article/details/89217011
- OpenCV-Python 直方图-1:查找、绘制和分析|二十六:http://baijiahao.baidu.com/s?id=1655424859576397139&wfr=spider&for=pc
希望帮助能大家理解直方图以及比较函数作用!!!
python opencv 图片缺陷检测(讲解直方图以及相关系数对比法)的更多相关文章
- 【python+opencv】直线检测+圆检测
Python+OpenCV图像处理—— 直线检测 直线检测理论知识: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进 ...
- Python OpenCV图片转视频 工具贴(三)
Python OpenCV图片转视频 粘贴即用,注意使用时最好把自己的文件按照数字顺序命名.按照引导输入操作. # 一键傻瓜式引导图片串成视频 # 注意使用前最好把文件命名为数字顺序格式 import ...
- python+OpenCV进行人脸检测【转】
OpenCV的人脸检测功能在一般场合还是不错的.而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码. 写代码之前应该先安装python-opencv: $ su ...
- 【小工具系列】Python + OpenCV 图片序列转换成视频
图片序列转换成视频 最近一直在找一个工具,能够将一堆图片转化成视频.网上找了一些小软件,还有 win10 的照片自带的视频制作功能,都不是很满意. 又不想下载那些专业的视频剪辑软件大材小用. 然后找到 ...
- python+OpenCV 特征点检测
1.Harris角点检测 Harris角点检测算法是一个极为简单的角点检测算法,该算法在1988年就被发明了,算法的主要思想是如果像素周围显示存在多于一个方向的边,我们认为该点为兴趣点.基本原理是根据 ...
- Python 实现图片对比检测
在写测试框架的时候,需要用到图片对比的方法来判断用例执行的情况,问了一下度娘,原来可以用PIL模块处理: from PIL import Image # 先安装Pillow, \>pip in ...
- Python+OpenCV+图片旋转并用原底色填充新四角
import cv2 from math import fabs, sin, cos, radians import numpy as np from scipy.stats import mode ...
- Opencv+Python实现缺陷检测
实验七.缺陷检测 一. 题目描述 对下面的图片进行缺陷检测操作,请详细地记录每一步操作的步骤. 第一站图片是标准样品,后面几张图中有几个样品有瑕疵,需要你通过计算在图片上显示出哪张是合格,哪张 ...
- 图片人脸检测——OpenCV版(二)
图片人脸检测 人脸检测使用到的技术是OpenCV,上一节已经介绍了OpenCV的环境安装,点击查看. 往期目录 视频人脸检测——Dlib版(六)OpenCV添加中文(五)图片人脸检测——Dlib版(四 ...
随机推荐
- 玩转 React(五)- 组件的内部状态和生命周期
文章标题总算是可以正常一点了-- 通过之前的文章我们已经知道:在 React 体系中所谓的 "在 JavaScript 中编写 HTML 代码" 指的是 React 扩展了 Jav ...
- 基础JavaScript练习(三)总结
任务目的 实践JavaScript数组.字符串相关操作 任务描述 基于任务四进行升级 将新元素输入框从input改为textarea 允许一次批量输入多个内容,格式可以为数字.中文.英文等,可以通过用 ...
- LaTex公式符号
下面这个网站是我认为比较齐全的网站 http://www.mohu.org/info/symbols/symbols.htm
- 安装skimage和cv2
因为第一次接触这个,所以当时安装的时候,也不是很清楚,现在明白了,记录一下,下次别入坑了. 1.安装skimage模块 skimage的全称是:scikit-image 如果说是这样安装,提示我不成功 ...
- 查看chrome插件源码
简介 想查看chrome插件的源码,就需要找到chrome插件安装的位置,接着再文件夹下查找此插件的id. mac cd ~/Library/Application Support/Google/Ch ...
- C++类的详解
目录 一.类成员的访问权限 二.成员变量的命名 三.构造函数 四.析构函数 五.C++程序也很优雅 六.类的其它知识 七.可变参数 八.课后作业 九.版权声明 超女选秀的例子我们玩了很久,为了学习的需 ...
- python的基本数据类型简介
python的基本数据类型有:数字-numbers.字符串-str.列表-list.元组-tuple.字典-dict.布尔-bool.集合-set 下面来个概览先大概了解一下,后面博文中咱再细说- 1 ...
- requests.exceptions.SSLError报错
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries excee ...
- django中CBV源码分析
前言:Django的视图处理方式有两种: FBV(function base views) 是在视图里基于函数形式处理请求. CBV(class base views)是在视图里基于类的形式处理请求. ...
- Python3 面向对象之:单继承
一:什么面向对象的继承? 比较官方的说法就是: 继承(英语:inheritance)是面向对象软件技术当中的一个概念.如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A ...