目录
【OpenCV】使用Python进行缺陷检测和展示
图片数据预处理
展示检测结果
效果展示
完整代码如下:
在工业生产中,为了保证产品质量,通常需要对生产线上的产品进行缺陷检测。在数字图像处理领域,缺陷检测是一个非常重要的应用场景,也是一个比较复杂的问题。本篇文章将介绍如何使用Python和OpenCV库对产品进行缺陷检测,并将结果展示在画布上。
首先,我们需要加载所有的图片文件,这些文件通常位于同一个文件夹中,并且文件扩展名为“.jpg”或“.png”。可以使用Python的os和glob模块来实现这一步骤:
import os
import numpy as np
path = './images'
img_files = [os.path.join(path, file) for file in os.listdir(path) if file.endswith('.jpg') or file.endswith('.png')]
接下来,我们需要对每张图片进行缺陷检测。为了提高检测效果,通常需要对图片进行一些预处理,例如转换为灰度图像、二值化处理等。具体操作如下:
import cv2
# 加载原始图像
img = cv2.imread(img_file)
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 对灰度图像进行二值化处理
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 进行形态学处理,去除噪点和孤立的小区域
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# 寻找轮廓并绘制到原始图像上
contours, _ = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
以上代码中,我们先加载原始图像,然后将其转换为灰度图像,并进行二值化处理。接着使用形态学处理方法对图像进行优化,去除噪点和孤立的小区域。最后,我们使用OpenCV库提供的函数寻找图像中的轮廓,并将其绘制在原始图像上。
完成缺陷检测之后,我们需要将结果展示在画布上。可以使用Python的matplotlib库来实现这一步骤:
import matplotlib.pyplot as plt
# 创建画布
fig, axs = plt.subplots(nrows=3, ncols=4, figsize=(16, 12))
axs = axs.flatten()
# 对每张图片进行缺陷检测,并在画布上展示结果
for i, img_file in enumerate(img_files):
# 加载原始图像
img = cv2.imread(img_file)
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 对灰度图像进行二值化处理
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 进行形态学处理,去除噪点和孤立的小区域
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# 寻找轮廓并绘制到原始图像上
contours, _ = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
# 在画布上展示处理结果
axs[i].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
axs[i].set_title(os.path.basename(img_file))
axs[i].axis('off')
# 隐藏多余的子图
for i in range(len(img_files), nrows*ncols):
fig.delaxes(axs[i])
# 显示画布
plt.show()
以上代码中,我们首先创建一个3行4列共12个子图的画布,并对每张图片进行缺陷检测,在画布的相应位置上展示处理结果。最后,我们隐藏多余的子图,以确保画布的展示效果。最后,调用plt.show()函数显示画布。
至此,我们已经实现了图片的缺陷检测和展示。这个方法不仅适用于工业生产中的产品缺陷检测,也可以用于其他领域的图像处理任务。
import cv2
import os
import numpy as np
import matplotlib.pyplot as plt
# 加载所有图片文件
path = './01'
img_files = [os.path.join(path, file) for file in os.listdir(path) if file.endswith('.jpg') or file.endswith('.png')]
# 计算画布的行数和列数
nrows = int(np.ceil(len(img_files) / 4))
ncols = min(4, len(img_files))
# 创建画布
fig, axs = plt.subplots(nrows=nrows, ncols=ncols, figsize=(16, nrows*4))
axs = axs.flatten()
# 对每张图片进行缺陷检测,并在画布上展示结果
for i, img_file in enumerate(img_files):
# 加载原始图像
img = cv2.imread(img_file)
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 对灰度图像进行二值化处理
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 进行形态学处理,去除噪点和孤立的小区域
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# 寻找轮廓并绘制到原始图像上
contours, _ = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
# 在画布上展示处理结果
axs[i].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
axs[i].set_title(os.path.basename(img_file))
axs[i].axis('off')
# 隐藏多余的子图
for i in range(len(img_files), nrows*ncols):
fig.delaxes(axs[i])
# 显示画布
plt.show()