【OpenCV】用Python进行缺陷检测和展示

目录

【OpenCV】使用Python进行缺陷检测和展示

 图片数据预处理

展示检测结果

效果展示

完整代码如下:


【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()

猜你喜欢

转载自blog.csdn.net/qq_62238325/article/details/131169703