Python OpenCV实现图片缺陷检测 (讲解直方图以及相关系数对比法)
在这篇文章中,我们将使用Python的OpenCV库实现图片缺陷检测。缺陷指的是图像中的一些问题或损坏,例如像素失真或色彩偏差等。
具体来说,我们将使用直方图以及相关系数对比法来检测图像中的缺陷。
1. 准备工作
在开始之前,我们需要在我们的电脑上安装必要的软件。我们需要安装以下软件:
- Python 3
- OpenCV库
- 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()函数计算了该图像的直方图,该函数接受以下参数:
- 第一个参数是一个列表,包含了我们要计算直方图的图像。
- 第二个参数是一个列表,指定每个通道的范围。在这个例子中,我们计算了RGB图像的直方图,所以我们使用了[0,1,2]这个列表来指定每个通道的范围。
- 第三个参数是一个可选的掩膜,用于限定要计算的像素。
- 第四个参数是指定要计算的像素强度的范围。在这个例子中,我们将强度范围设置为256,因此我们有了一个256x256x256大小的直方图。
- 第五个参数是一个列表,指定每个通道的范围。在这个例子中,我们使用了[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技术站