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

Python OpenCV实现图片缺陷检测 (讲解直方图以及相关系数对比法)

在这篇文章中,我们将使用Python的OpenCV库实现图片缺陷检测。缺陷指的是图像中的一些问题或损坏,例如像素失真或色彩偏差等。

具体来说,我们将使用直方图以及相关系数对比法来检测图像中的缺陷。

1. 准备工作

在开始之前,我们需要在我们的电脑上安装必要的软件。我们需要安装以下软件:

  1. Python 3
  2. OpenCV库
  3. Jupyter Notebook

您可以使用pip命令来安装OpenCV库:

pip install opencv-python

安装完成后,我们可以开始编写代码。

2. 加载和显示图像

首先,我们需要加载我们想要检测的图像。我们可以使用OpenCV提供的cv2.imread()函数来加载图像。该函数接受一个图像的文件路径作为输入,并返回一个表示图像的NumPy数组。

import cv2

# 加载图像
img = cv2.imread('test.jpg')

# 显示图像
cv2.imshow('Image', img)
cv2.waitKey(0)

在上面的代码中,我们首先使用cv2.imread()函数加载了一张名为test.jpg的图像。然后,我们使用cv2.imshow()函数来显示该图像。由于窗口只有在按下键盘上的任意键之后才会关闭,因此我们使用了cv2.waitKey(0)函数来等待用户的输入。

3. 计算直方图

在检测图像缺陷时,我们最常用的方法之一是直方图。OpenCV提供了cv2.calcHist()函数来计算图像的直方图。

import cv2
import numpy as np
from matplotlib import pyplot as plt

# 加载图像
img = cv2.imread('test.jpg')

# 计算直方图
hist = cv2.calcHist([img], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])

# 绘制直方图
plt.hist(hist.ravel(), 256, [0, 256])
plt.show()

在上面的代码中,我们首先使用cv2.imread()函数加载了一张名为test.jpg的图像。然后,我们使用cv2.calcHist()函数计算了该图像的直方图,该函数接受以下参数:

  1. 第一个参数是一个列表,包含了我们要计算直方图的图像。
  2. 第二个参数是一个列表,指定每个通道的范围。在这个例子中,我们计算了RGB图像的直方图,所以我们使用了[0,1,2]这个列表来指定每个通道的范围。
  3. 第三个参数是一个可选的掩膜,用于限定要计算的像素。
  4. 第四个参数是指定要计算的像素强度的范围。在这个例子中,我们将强度范围设置为256,因此我们有了一个256x256x256大小的直方图。
  5. 第五个参数是一个列表,指定每个通道的范围。在这个例子中,我们使用了[0,256,0,256,0,256]这个列表来指定每个RGB通道的范围。

接下来,我们使用matplotlib库中的plt.hist()函数来绘制直方图。

4. 相关系数对比法

除了直方图之外,我们还可以使用相关系数对比法来检测图像中的缺陷。在相关系数对比法中,我们比较两幅图像的相似性,以检测缺陷。

import cv2

# 加载图像
img1 = cv2.imread('test1.jpg')
img2 = cv2.imread('test2.jpg')

# 转换为灰度图像
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# 计算相关系数
corr = cv2.matchTemplate(gray1, gray2, cv2.TM_CCOEFF_NORMED)[0][0]

print(corr)

在上面的代码中,我们首先使用cv2.imread()函数加载了两张名为test1.jpg和test2.jpg的图像。然后,我们将这些图像转换为灰度图像,以便快速计算相关系数。我们使用cv2.cvtColor()函数来完成这项工作。

接下来,我们使用cv2.matchTemplate()函数计算了这两幅图像之间的相关系数。在这个例子中,我们使用了cv2.TM_CCOEFF_NORMED参数来计算相关系数,该参数代表相关性系数。

5. 示例

现在让我们看看一个完整的示例,该示例使用了直方图和相关系数对比法来检测图像中的缺陷。我们将加载两个图像,一个是正常的图像,一个是带有缺陷的图像。然后,我们将使用直方图和相关系数对比法来检测这两个图像之间的区别。

import cv2
import numpy as np
from matplotlib import pyplot as plt

# 加载图像
img1 = cv2.imread('normal.jpg')
img2 = cv2.imread('defected.jpg')

# 使用直方图检测缺陷
hist1 = cv2.calcHist([img1], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
hist2 = cv2.calcHist([img2], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
diff = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)

print("直方图差异:", diff)

# 使用相关系数对比法检测缺陷
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
corr = cv2.matchTemplate(gray1, gray2, cv2.TM_CCOEFF_NORMED)[0][0]

print("相关系数差异:", corr)

# 显示图像
plt.subplot(121), plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)), plt.title('Normal')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)), plt.title('Defected')
plt.xticks([]), plt.yticks([])
plt.show()

在上面的代码中,我们首先使用cv2.imread()函数加载了两张名为normal.jpg和defected.jpg的图像。然后,我们使用cv2.calcHist()函数计算了这两个图像的直方图。接下来,我们使用cv2.compareHist()函数计算了这两个直方图之间的相关性。

然后,我们将这两个图像转换为灰度图像,并使用cv2.matchTemplate()函数计算它们之间的相关系数。

最后,我们使用matplotlib库中的plt.subplot()和plt.imshow()函数来显示这两个图像,并使用plt.show()函数来显示它们。

以上就是使用Python的OpenCV库实现图片缺陷检测的完整攻略,包括了直方图和相关系数对比法。在实际使用中,可以根据具体情况选择相应的方法来检测图像缺陷。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法) - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • python多进程控制学习小结

    Python多进程控制学习小结 在本文中,我们将探讨Python多进程控制的一些基础概念和方法。多进程在数据处理、机器学习等领域应用广泛。正因如此,掌握Python多进程控制将对我们的工作有很大的帮助。 什么是进程 进程是操作系统中正在运行的一个程序,有自己独立的内存空间,可以拥有自己的运行环境及资源。 什么是多进程 在一个操作系统中,同时可以运行多个进程。…

    python 2023年5月19日
    00
  • python中字符串内置函数的用法总结

    为了更好地让读者了解并掌握Python字符串内置函数的使用方法,本文将从以下几个方面进行介绍: Python字符串的基本操作 字符串内置函数的分类 字符串内置函数的用法总结 Python字符串的基本操作 字符串是Python中的一种基本数据类型,可以用单引号或双引号表示,例如: text1 = ‘hello world!’ text2 = "Pyt…

    python 2023年6月5日
    00
  • 基于PyQt5实现一个无线网连接器

    下面是基于PyQt5实现一个无线网连接器的完整攻略。 环境准备 首先,需要准备好以下环境: Python3.x环境 PyQt5库 界面设计 设计主窗口: 包含一个“SSID”文本框和一个“密码”文本框,用于输入WiFi名称和密码。 包含一个“连接”按钮,用于连接WiFi。 包含一个“连接状态”标签,用于显示连接状态。 设计连接状态窗口: 包含一个“连接成功”…

    python 2023年6月6日
    00
  • python利用百度AI实现文字识别功能

    Python利用百度AI实现文字识别功能 前言 百度AI开放平台提供了多种类型的API,其中文字识别API是非常实用的一种,它可以将多种形式的文字图片转换成文本,便于后续处理。本文将介绍如何使用百度AI实现Python文字识别功能。 准备工作 登录百度AI开放平台,创建自己的应用,获取APP_ID、API_KEY、SECRET_KEY信息; 安装Python…

    python 2023年5月18日
    00
  • Python3基础之基本运算符概述

    Python3基础之基本运算符概述 在Python3中,有一些基本运算符可以用来进行数学计算、逻辑运算等。本文将对Python3中常用的基本运算符进行详细讲解。 算术运算符 Python3的算术运算符包括加(+)、减(-)、乘()、除(/)、取余(%)、整除(//)和幂运算(*)。下面分别进行讲解。 加(+) 加号(+)可以用于两个数的相加,也可以用于字符串…

    python 2023年6月3日
    00
  • Python实现的朴素贝叶斯分类器示例

    以下是关于“Python实现的朴素贝叶斯分类器示例”的完整攻略: 简介 朴素贝叶斯分类器是一种常用的机器学习算法,用于分类和预测。在本教程中,我们将介绍如何使用Python实现一个朴素贝叶斯分类器,包括数据预处理、特征提取、模型训练和预测等步骤。 原理 朴素贝叶斯分类器是一种基于贝叶斯定理的分类器,它假设特征之间相互独立,从而简化了计算。在本教程中,我们将使…

    python 2023年5月14日
    00
  • Python算法中的时间复杂度问题

    Python算法中的时间复杂度问题 时间复杂度是算法分析中的一个重要概念,用于衡量算法的执行效率。在Python中,可以使用时间复杂度来评估算法的性能。本文将细讲解Python算中的时间复杂度问题,包括时间复杂度的定义、计算方法、常见时间复杂度的示例说明等。 时间复杂度的定义 时间复杂度是指算法执行所需的时间与问题规模之间的关系。通用大O符号表示,表示算法的…

    python 2023年5月13日
    00
  • pip报错“ModuleNotFoundError: No module named ‘setuptools’”怎么处理?

    当使用 pip 安装 Python 包时,可能会遇到 “ModuleNotFoundError: No module named ‘setuptools'” 错误。这个错误通常是由于缺少 setuptools 模块或 setuptools 模块版本不兼容导致的。以下是详细讲解 pip 报错 “ModuleNotFoundError: No module na…

    python 2023年5月4日
    00
合作推广
合作推广
分享本页
返回顶部