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日

相关文章

  • 利用selenium 3.7和python3添加cookie模拟登陆的实现

    下面是详细讲解如何利用selenium 3.7和python3添加cookie模拟登陆的实现。 1. 安装selenium和ChromeDriver 首先,需要在电脑上安装selenium和ChromeDriver。可以通过以下命令安装selenium: pip3 install selenium ChromeDriver需要和本地Chrome浏览器的版本匹…

    python 2023年6月2日
    00
  • 容易被忽略的Python内置类型

    当我们学习Python编程语言时,通常只关注一些最常见的数据类型,比如:数字,字符串和列表等。然而,Python还有许多不常见但非常有用的内置数据类型,在编程过程中很容易地被忽略。接下来,我们将详细讲解这些容易被忽略的Python内置类型。 1. 元组(Tuple) 元组与列表类似,但相对少用,常用来临时存储、传递和返回多个值。与列表不同的是,元组是只读的,…

    python 2023年5月14日
    00
  • Python Parser的用法

    PythonParser的用法 PythonParser是Python中用于解析和处理网页的一个库。它提供了许多API,可以帮助开发者高效地获取并处理网页上的数据。下面我们将详细介绍PythonParser的用法。 安装和引入 PythonParser可以使用pip工具进行安装,安装方式如下: pip install pythonparser 安装完成之后,…

    python 2023年5月13日
    00
  • Python 对象作为课堂讲师的可选参数

    【问题标题】:Python object as an optional argument of a class instructorPython 对象作为课堂讲师的可选参数 【发布时间】:2023-04-02 06:36:01 【问题描述】: 当创建一个类的新实例(比如 A)时,我希望另一个类的实例(比如 B)成为构造函数的可选参数。如果 B 作为参数给出,…

    Python开发 2023年4月8日
    00
  • python时间日期操作方法实例小结

    标题:Python时间日期操作方法实例小结 在Python中,时间日期的操作是相当重要的。针对时间日期常见的操作,本篇文章将总结常见的时间日期操作方法,并且提供具体的代码示例以方便初学者学习。 1. 获取当前的时间日期 使用datetime模块可以获取当前的时间日期,具体代码如下: from datetime import datetime now = da…

    python 2023年6月2日
    00
  • 深度解析Python线程和进程

    深度解析Python线程和进程 Python是一门高级编程语言,它支持多线程和多进程编程。但是线程与进程是操作系统层面的概念,因此在Python中,我们使用操作系统提供的多线程/多进程API来实现多线程/多进程编程。 本文将深度解析Python中的线程和进程,介绍它们的定义、工作原理以及使用方法。 线程 定义 线程是操作系统能够进行运算调度的最小单位,它被包…

    python 2023年5月19日
    00
  • 使用NumPy和pandas对CSV文件进行写操作的实例

    使用NumPy和pandas可以方便地对CSV文件进行读写操作。下面将详细介绍如何使用这两个库对CSV文件进行写操作。 准备工作 在使用NumPy和pandas对CSV文件进行写操作之前,需要安装这两个库。可以通过以下命令在命令行中安装: pip install numpy pandas 安装完成后,就可以在Python中使用这两个库了。 使用NumPy写入…

    python 2023年6月3日
    00
  • Python各种扩展名区别点整理

    Python是一种高级编程语言,常用于数据分析、Web开发和机器学习等领域。在Python中,扩展名指的是文件的扩展名,不同的扩展名代表不同类型的文件和不同的用途。本文将详细讲解Python各种扩展名的区别点,并提供相应示例进行说明。 .py文件 .py文件是Python程序的标准扩展名,用于保存Python源代码。Python源代码是一种文本文件,可以使用…

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