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 2023年5月19日
    00
  • python scipy求解非线性方程的方法(fsolve/root)

    当我们需要求解非线性方程式时,可以用到Python中的Scipy库中的fsolve(或root)函数。以下是求解非线性方程式的攻略: 准备工作 在使用fsolve/root函数前,需要安装Scipy库。可以使用以下命令进行安装: pip install scipy 调用方法 Scipy库中的fsolve(或root)函数,可以解决非线性方程组。它通过提供一个…

    python 2023年6月5日
    00
  • python中关于数据类型的学习笔记

    那我来为你详细讲解一下 “Python中关于数据类型的学习笔记” 的完整攻略。 数据类型简介 在程序中,数据类型是指变量的值所代表的数据类型。Python中共有以下基本数据类型: 数字类型:包括整数、浮点数和复数; 字符串类型:单引号字符串、双引号字符串和多行字符串; 列表类型:使用中括号”[]”定义,可以存储任意类型的数据; 元组类型:使用小括号”()”定…

    python 2023年6月3日
    00
  • Python利用百度地图获取两地距离(附demo)

    下面我将详细讲解“Python利用百度地图获取两地距离(附demo)”的完整实例教程。 简介 本文主要介绍如何使用Python代码实现利用百度地图API获取两地距离的方法。百度地图API提供了计算两点间经纬度距离的服务,而Python则可以通过调用相应的API接口实现对距离的获取。 我们将分以下五个步骤来讲解实现过程: 准备工作 百度地图API开发者密钥申请…

    python 2023年5月13日
    00
  • Python读csv文件去掉一列后再写入新的文件实例

    以下是详细讲解“Python读csv文件去掉一列后再写入新的文件实例”的完整攻略: 1. 导入必要的库 在处理csv文件时,需要使用Python内置的csv库来读取和写入文件,因此第一步就是导入csv库: import csv 2. 读取csv文件 接下来,我们需要使用csv库中的csv.reader()方法来读取csv文件。例如,假设我们要读取名为inpu…

    python 2023年6月3日
    00
  • python skimage图像处理

    Python skimage图像处理完整攻略 概述 Skimage(即scikit-image)是一款基于Python的开源图像处理库,提供了许多处理图像和计算机视觉任务的算法。 常见的图像处理任务,如色彩空间转换、图像平滑、形态学操作、阈值处理、边缘检测、图像分割、特征提取与描述等,都可以使用Skimage来完成。 起步 要使用Skimage,需要先安装库…

    python 2023年5月14日
    00
  • Python基于time模块求程序运行时间的方法

    要使用Python基于time模块求程序运行时间的方法,可以按照以下攻略进行: 第一步:导入time模块 在Python中使用time模块可以获取程序运行时间。要开始使用此模块,需要在程序中首先导入时间模块: import time 第二步:获取程序开始时间 在程序运行之前,需要先获取程序的开始时间,这样才能计算出程序运行的时间长度。可以调用time模块中的…

    python 2023年6月2日
    00
  • Pycharm中配置远程Docker运行环境的教程图解

    以下是“Pycharm中配置远程Docker运行环境的教程图解”的完整攻略: 配置远程Docker运行环境 1. 确认操作系统和安装Docker 首先需要确认服务器操作系统是Linux,并且已经安装了Docker。如果没有安装Docker,可以按照官方文档进行安装:https://docs.docker.com/engine/install/ 2. 配置SS…

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