Bootstrap

产品缺陷检测:形状和结构分析_10.缺陷检测中的图像处理技术

10. 缺陷检测中的图像处理技术

在这里插入图片描述

在产品缺陷检测中,图像处理技术是关键的一环。通过图像处理,可以提取产品的形状和结构特征,进而进行缺陷检测。本节将详细介绍几种常见的图像处理技术及其在缺陷检测中的应用。

10.1 图像预处理

图像预处理是缺陷检测的第一步,其目的是提高图像的质量,减少噪声,增强特征,以便后续的处理步骤能够更准确地检测出缺陷。常见的图像预处理技术包括图像灰度化、图像去噪、图像增强和图像标准化。

10.1.1 图像灰度化

图像灰度化是将彩色图像转换为灰度图像的过程。灰度图像可以减少数据量,简化计算,同时保留图像的基本特征。在Python中,可以使用OpenCV库来实现图像灰度化。


import cv2

import matplotlib.pyplot as plt



# 读取彩色图像

image = cv2.imread('path/to/your/image.jpg')



# 将图像转换为灰度图像

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)



# 显示原始图像和灰度图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

plt.title('Original Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(gray_image, cmap='gray')

plt.title('Grayscale Image')

plt.axis('off')



plt.show()

10.1.2 图像去噪

图像去噪是为了减少图像中的噪声,提高图像的质量。常见的去噪方法有高斯滤波、中值滤波和双边滤波等。以下是一个使用高斯滤波去噪的示例:


import cv2

import matplotlib.pyplot as plt



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 应用高斯滤波去噪

blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)



# 显示原始灰度图像和去噪后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(blurred_image, cmap='gray')

plt.title('Denoised Image')

plt.axis('off')



plt.show()

10.1.3 图像增强

图像增强是为了改善图像的视觉效果,使其更适合后续的处理步骤。常见的图像增强方法有直方图均衡化、对比度增强等。以下是一个使用直方图均衡化进行图像增强的示例:


import cv2

import matplotlib.pyplot as plt



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 应用直方图均衡化

equalized_image = cv2.equalizeHist(gray_image)



# 显示原始灰度图像和增强后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(equalized_image, cmap='gray')

plt.title('Enhanced Image')

plt.axis('off')



plt.show()

10.1.4 图像标准化

图像标准化是为了使图像在不同的光照条件下保持一致,通常包括归一化和白化等步骤。以下是一个使用归一化进行图像标准化的示例:


import cv2

import matplotlib.pyplot as plt

import numpy as np



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 归一化图像

normalized_image = cv2.normalize(gray_image, None, 0, 255, cv2.NORM_MINMAX)



# 显示原始灰度图像和标准化后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(normalized_image, cmap='gray')

plt.title('Normalized Image')

plt.axis('off')



plt.show()

10.2 图像分割

图像分割是将图像分成若干个区域或对象的过程,有助于后续的特征提取和缺陷检测。常见的图像分割方法有阈值分割、边缘检测和区域生长等。

10.2.1 阈值分割

阈值分割是根据图像的灰度值将图像分成前景和背景。常用的方法有全局阈值分割和自适应阈值分割。以下是一个使用全局阈值分割的示例:


import cv2

import matplotlib.pyplot as plt



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 应用全局阈值分割

_, threshold_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)



# 显示原始灰度图像和分割后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(threshold_image, cmap='gray')

plt.title('Threshold Segmented Image')

plt.axis('off')



plt.show()

10.2.2 边缘检测

边缘检测是提取图像中物体的边界,有助于检测形状和结构缺陷。常用的方法有Canny边缘检测和Sobel算子。以下是一个使用Canny边缘检测的示例:


import cv2

import matplotlib.pyplot as plt



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 应用Canny边缘检测

edges = cv2.Canny(gray_image, 100, 200)



# 显示原始灰度图像和边缘检测后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(edges, cmap='gray')

plt.title('Edge Detection')

plt.axis('off')



plt.show()

10.2.3 区域生长

区域生长是通过选择一个初始点,然后根据一定的相似性准则将邻近的像素点逐步加入到这个区域中,从而实现图像分割。以下是一个使用区域生长进行图像分割的示例:


import cv2

import numpy as np

import matplotlib.pyplot as plt



def region_growth(image, seed, threshold):

    """

    实现区域生长算法

    :param image: 输入图像

    :param seed: 初始种子点

    :param threshold: 相似性阈值

    :return: 分割后的图像

    """

    # 初始化结果图像

    segmented = np.zeros_like(image)

    segmented[seed] = 255



    # 获取图像的尺寸

    rows, cols = image.shape



    # 定义相似性准则

    def is_similar(pixel1, pixel2, threshold):

        return abs(int(pixel1) - int(pixel2)) < threshold



    # 创建一个队列来存储待处理的像素点

    queue = [seed]



    while queue:

        (x, y) = queue.pop(0)

        for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:

            nx, ny = x + dx, y + dy

            if 0 <= nx < rows and 0 <= ny < cols and segmented[nx, ny] == 0 and is_similar(image[x, y], image[nx, ny], threshold):

                segmented[nx, ny] = 255

                queue.append((nx, ny))



    return segmented



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 选择初始种子点

seed = (100, 100)



# 应用区域生长

segmented_image = region_growth(gray_image, seed, 10)



# 显示原始灰度图像和分割后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(segmented_image, cmap='gray')

plt.title('Region Growth Segmentation')

plt.axis('off')



plt.show()

10.3 特征提取

特征提取是从图像中提取出有用的特征,以便进行缺陷检测。常见的特征提取方法有形状特征、纹理特征和颜色特征等。

10.3.1 形状特征提取

形状特征提取主要用于检测物体的形状和轮廓,常见的方法有轮廓检测和霍夫变换等。以下是一个使用轮廓检测提取形状特征的示例:


import cv2

import matplotlib.pyplot as plt



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 应用阈值分割

_, threshold_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)



# 找到轮廓

contours, _ = cv2.findContours(threshold_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)



# 绘制轮廓

contour_image = cv2.drawContours(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), contours, -1, (0, 255, 0), 2)



# 显示原始灰度图像和轮廓检测后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(contour_image)

plt.title('Contour Detection')

plt.axis('off')



plt.show()

10.3.2 纹理特征提取

纹理特征提取主要用于检测物体的表面纹理,常见的方法有灰度共生矩阵(GLCM)和局部二值模式(LBP)等。以下是一个使用灰度共生矩阵提取纹理特征的示例:


import cv2

import numpy as np

import matplotlib.pyplot as plt

from skimage.feature import greycomatrix, greycoprops



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 计算灰度共生矩阵

glcm = greycomatrix(gray_image, distances=[1], angles=[0], levels=256, symmetric=True, normed=True)



# 提取纹理特征

contrast = greycoprops(glcm, 'contrast')

dissimilarity = greycoprops(glcm, 'dissimilarity')

homogeneity = greycoprops(glcm, 'homogeneity')

energy = greycoprops(glcm, 'energy')

correlation = greycoprops(glcm, 'correlation')

ASM = greycoprops(glcm, 'ASM')



# 显示原始灰度图像和纹理特征

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(glcm[:, :, 0, 0], cmap='gray')

plt.title('Gray Level Co-occurrence Matrix')

plt.axis('off')



plt.show()



print(f'Contrast: {contrast[0, 0]}')

print(f'Dissimilarity: {dissimilarity[0, 0]}')

print(f'Homogeneity: {homogeneity[0, 0]}')

print(f'Energy: {energy[0, 0]}')

print(f'Correlation: {correlation[0, 0]}')

print(f'ASM: {ASM[0, 0]}')

10.3.3 颜色特征提取

颜色特征提取主要用于检测物体的颜色属性,常见的方法有颜色直方图和颜色矩等。以下是一个使用颜色直方图提取颜色特征的示例:


import cv2

import matplotlib.pyplot as plt



# 读取彩色图像

image = cv2.imread('path/to/your/image.jpg')



# 计算颜色直方图

hist = cv2.calcHist([image], [0, 1, 2], None, [8, 8, 8], [0, 256, 0, 256, 0, 256])



# 归一化直方图

hist = cv2.normalize(hist, hist).flatten()



# 显示原始图像和颜色直方图

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

plt.title('Original Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.plot(hist, color='r')

plt.title('Color Histogram')

plt.xlabel('Bins')

plt.ylabel('Frequency')



plt.show()



print(f'Color Histogram: {hist}')

10.4 缺陷检测算法

缺陷检测算法是将提取的特征与标准模型进行比较,从而检测出缺陷。常见的缺陷检测算法有基于模板匹配的检测、基于机器学习的检测和基于深度学习的检测等。

10.4.1 基于模板匹配的缺陷检测

模板匹配是通过比较图像与标准模板的相似性来检测缺陷。以下是一个使用模板匹配进行缺陷检测的示例:


import cv2

import matplotlib.pyplot as plt



# 读取原始图像和标准模板

image = cv2.imread('path/to/your/image.jpg')

template = cv2.imread('path/to/your/template.jpg')



# 转换为灰度图像

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

gray_template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)



# 应用模板匹配

result = cv2.matchTemplate(gray_image, gray_template, cv2.TM_CCOEFF_NORMED)

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)



# 在图像中标记匹配区域

top_left = max_loc

bottom_right = (top_left[0] + template.shape[1], top_left[1] + template.shape[0])

cv2.rectangle(image, top_left, bottom_right, (0, 255, 0), 2)



# 显示原始图像和标记后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

plt.title('Original Image with Matched Template')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(result, cmap='gray')

plt.title('Template Matching Result')

plt.axis('off')



plt.show()

10.4.2 基于机器学习的缺陷检测

基于机器学习的缺陷检测是通过训练分类器来区分正常和缺陷产品。以下是一个使用支持向量机(SVM)进行缺陷检测的示例:


import cv2

import numpy as np

from sklearn import svm

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

import matplotlib.pyplot as plt



# 读取训练图像

def load_images_from_directory(directory):

    images = []

    for filename in os.listdir(directory):

        img = cv2.imread(os.path.join(directory, filename), cv2.IMREAD_GRAYSCALE)

        if img is not None:

            images.append(img)

    return images



# 加载正常和缺陷图像

normal_images = load_images_from_directory('path/to/normal/images')

defect_images = load_images_from_directory('path/to/defect/images')



# 提取特征

def extract_features(images):

    features = []

    for img in images:

        # 计算图像的直方图

        hist = cv2.calcHist([img], [0], None, [256], [0, 256])

        hist = cv2.normalize(hist, hist).flatten()

        features.append(hist)

    return np.array(features)



normal_features = extract_features(normal_images)

defect_features = extract_features(defect_images)



# 创建标签

normal_labels = np.zeros(normal_features.shape[0])

defect_labels = np.ones(defect_features.shape[0])



# 合并特征和标签

X = np.vstack((normal_features, defect_features))

y = np.hstack((normal_labels, defect_labels))



# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)



# 训练SVM分类器

clf = svm.SVC()

clf.fit(X_train, y_train)



# 预测测试集

y_pred = clf.predict(X_test)



# 计算准确率

accuracy = accuracy_score(y_test, y_pred)

print(f'Accuracy: {accuracy}')



# 读取测试图像并进行预测

test_image = cv2.imread('path/to/your/test_image.jpg', cv2.IMREAD_GRAYSCALE)

test_feature = extract_features([test_image])

prediction = clf.predict(test_feature)



# 显示预测结果

plt.figure(figsize=(5, 5))

plt.imshow(test_image, cmap='gray')

plt.title(f'Prediction: {"Defect" if prediction[0] == 1 else "Normal"}')

plt.axis('off')

plt.show()

10.4.3 基于深度学习的缺陷检测

基于深度学习的缺陷检测是通过训练卷积神经网络(CNN)来识别和分类缺陷。以下是一个使用TensorFlow和Keras进行缺陷检测的示例:

10. 缺陷检测中的图像处理技术

在产品缺陷检测中,图像处理技术是关键的一环。通过图像处理,可以提取产品的形状和结构特征,进而进行缺陷检测。本节将详细介绍几种常见的图像处理技术及其在缺陷检测中的应用。

10.1 图像预处理

图像预处理是缺陷检测的第一步,其目的是提高图像的质量,减少噪声,增强特征,以便后续的处理步骤能够更准确地检测出缺陷。常见的图像预处理技术包括图像灰度化、图像去噪、图像增强和图像标准化。

10.1.1 图像灰度化

图像灰度化是将彩色图像转换为灰度图像的过程。灰度图像可以减少数据量,简化计算,同时保留图像的基本特征。在Python中,可以使用OpenCV库来实现图像灰度化。


import cv2

import matplotlib.pyplot as plt



# 读取彩色图像

image = cv2.imread('path/to/your/image.jpg')



# 将图像转换为灰度图像

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)



# 显示原始图像和灰度图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

plt.title('Original Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(gray_image, cmap='gray')

plt.title('Grayscale Image')

plt.axis('off')



plt.show()

10.1.2 图像去噪

图像去噪是为了减少图像中的噪声,提高图像的质量。常见的去噪方法有高斯滤波、中值滤波和双边滤波等。以下是一个使用高斯滤波去噪的示例:


import cv2

import matplotlib.pyplot as plt



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 应用高斯滤波去噪

blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)



# 显示原始灰度图像和去噪后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(blurred_image, cmap='gray')

plt.title('Denoised Image')

plt.axis('off')



plt.show()

10.1.3 图像增强

图像增强是为了改善图像的视觉效果,使其更适合后续的处理步骤。常见的图像增强方法有直方图均衡化、对比度增强等。以下是一个使用直方图均衡化进行图像增强的示例:


import cv2

import matplotlib.pyplot as plt



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 应用直方图均衡化

equalized_image = cv2.equalizeHist(gray_image)



# 显示原始灰度图像和增强后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(equalized_image, cmap='gray')

plt.title('Enhanced Image')

plt.axis('off')



plt.show()

10.1.4 图像标准化

图像标准化是为了使图像在不同的光照条件下保持一致,通常包括归一化和白化等步骤。以下是一个使用归一化进行图像标准化的示例:


import cv2

import matplotlib.pyplot as plt

import numpy as np



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 归一化图像

normalized_image = cv2.normalize(gray_image, None, 0, 255, cv2.NORM_MINMAX)



# 显示原始灰度图像和标准化后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(normalized_image, cmap='gray')

plt.title('Normalized Image')

plt.axis('off')



plt.show()

10.2 图像分割

图像分割是将图像分成若干个区域或对象的过程,有助于后续的特征提取和缺陷检测。常见的图像分割方法有阈值分割、边缘检测和区域生长等。

10.2.1 阈值分割

阈值分割是根据图像的灰度值将图像分成前景和背景。常用的方法有全局阈值分割和自适应阈值分割。以下是一个使用全局阈值分割的示例:


import cv2

import matplotlib.pyplot as plt



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 应用全局阈值分割

_, threshold_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)



# 显示原始灰度图像和分割后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(threshold_image, cmap='gray')

plt.title('Threshold Segmented Image')

plt.axis('off')



plt.show()

10.2.2 边缘检测

边缘检测是提取图像中物体的边界,有助于检测形状和结构缺陷。常用的方法有Canny边缘检测和Sobel算子。以下是一个使用Canny边缘检测的示例:


import cv2

import matplotlib.pyplot as plt



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 应用Canny边缘检测

edges = cv2.Canny(gray_image, 100, 200)



# 显示原始灰度图像和边缘检测后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(edges, cmap='gray')

plt.title('Edge Detection')

plt.axis('off')



plt.show()

10.2.3 区域生长

区域生长是通过选择一个初始点,然后根据一定的相似性准则将邻近的像素点逐步加入到这个区域中,从而实现图像分割。以下是一个使用区域生长进行图像分割的示例:


import cv2

import numpy as np

import matplotlib.pyplot as plt



def region_growth(image, seed, threshold):

    """

    实现区域生长算法

    :param image: 输入图像

    :param seed: 初始种子点

    :param threshold: 相似性阈值

    :return: 分割后的图像

    """

    # 初始化结果图像

    segmented = np.zeros_like(image)

    segmented[seed] = 255



    # 获取图像的尺寸

    rows, cols = image.shape



    # 定义相似性准则

    def is_similar(pixel1, pixel2, threshold):

        return abs(int(pixel1) - int(pixel2)) < threshold



    # 创建一个队列来存储待处理的像素点

    queue = [seed]



    while queue:

        (x, y) = queue.pop(0)

        for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:

            nx, ny = x + dx, y + dy

            if 0 <= nx < rows and 0 <= ny < cols and segmented[nx, ny] == 0 and is_similar(image[x, y], image[nx, ny], threshold):

                segmented[nx, ny] = 255

                queue.append((nx, ny))



    return segmented



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 选择初始种子点

seed = (100, 100)



# 应用区域生长

segmented_image = region_growth(gray_image, seed, 10)



# 显示原始灰度图像和分割后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(segmented_image, cmap='gray')

plt.title('Region Growth Segmentation')

plt.axis('off')



plt.show()

10.3 特征提取

特征提取是从图像中提取出有用的特征,以便进行缺陷检测。常见的特征提取方法有形状特征、纹理特征和颜色特征等。

10.3.1 形状特征提取

形状特征提取主要用于检测物体的形状和轮廓,常见的方法有轮廓检测和霍夫变换等。以下是一个使用轮廓检测提取形状特征的示例:


import cv2

import matplotlib.pyplot as plt



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 应用阈值分割

_, threshold_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)



# 找到轮廓

contours, _ = cv2.findContours(threshold_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)



# 绘制轮廓

contour_image = cv2.drawContours(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), contours, -1, (0, 255, 0), 2)



# 显示原始灰度图像和轮廓检测后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(contour_image)

plt.title('Contour Detection')

plt.axis('off')



plt.show()

10.3.2 纹理特征提取

纹理特征提取主要用于检测物体的表面纹理,常见的方法有灰度共生矩阵(GLCM)和局部二值模式(LBP)等。以下是一个使用灰度共生矩阵提取纹理特征的示例:


import cv2

import numpy as np

import matplotlib.pyplot as plt

from skimage.feature import greycomatrix, greycoprops



# 读取灰度图像

gray_image = cv2.imread('path/to/your/grayscale_image.jpg', cv2.IMREAD_GRAYSCALE)



# 计算灰度共生矩阵

glcm = greycomatrix(gray_image, distances=[1], angles=[0], levels=256, symmetric=True, normed=True)



# 提取纹理特征

contrast = greycoprops(glcm, 'contrast')

dissimilarity = greycoprops(glcm, 'dissimilarity')

homogeneity = greycoprops(glcm, 'homogeneity')

energy = greycoprops(glcm, 'energy')

correlation = greycoprops(glcm, 'correlation')

ASM = greycoprops(glcm, 'ASM')



# 显示原始灰度图像和纹理特征

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(gray_image, cmap='gray')

plt.title('Original Grayscale Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(glcm[:, :, 0, 0], cmap='gray')

plt.title('Gray Level Co-occurrence Matrix')

plt.axis('off')



plt.show()



print(f'Contrast: {contrast[0, 0]}')

print(f'Dissimilarity: {dissimilarity[0, 0]}')

print(f'Homogeneity: {homogeneity[0, 0]}')

print(f'Energy: {energy[0, 0]}')

print(f'Correlation: {correlation[0, 0]}')

print(f'ASM: {ASM[0, 0]}')

10.3.3 颜色特征提取

颜色特征提取主要用于检测物体的颜色属性,常见的方法有颜色直方图和颜色矩等。以下是一个使用颜色直方图提取颜色特征的示例:


import cv2

import matplotlib.pyplot as plt



# 读取彩色图像

image = cv2.imread('path/to/your/image.jpg')



# 计算颜色直方图

hist = cv2.calcHist([image], [0, 1, 2], None, [8, 8, 8], [0, 256, 0, 256, 0, 256])



# 归一化直方图

hist = cv2.normalize(hist, hist).flatten()



# 显示原始图像和颜色直方图

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

plt.title('Original Image')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.plot(hist, color='r')

plt.title('Color Histogram')

plt.xlabel('Bins')

plt.ylabel('Frequency')



plt.show()



print(f'Color Histogram: {hist}')

10.4 缺陷检测算法

缺陷检测算法是将提取的特征与标准模型进行比较,从而检测出缺陷。常见的缺陷检测算法有基于模板匹配的检测、基于机器学习的检测和基于深度学习的检测等。

10.4.1 基于模板匹配的缺陷检测

模板匹配是通过比较图像与标准模板的相似性来检测缺陷。以下是一个使用模板匹配进行缺陷检测的示例:


import cv2

import matplotlib.pyplot as plt



# 读取原始图像和标准模板

image = cv2.imread('path/to/your/image.jpg')

template = cv2.imread('path/to/your/template.jpg')



# 转换为灰度图像

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

gray_template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)



# 应用模板匹配

result = cv2.matchTemplate(gray_image, gray_template, cv2.TM_CCOEFF_NORMED)

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)



# 在图像中标记匹配区域

top_left = max_loc

bottom_right = (top_left[0] + template.shape[1], top_left[1] + template.shape[0])

cv2.rectangle(image, top_left, bottom_right, (0, 255, 0), 2)



# 显示原始图像和标记后的图像

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)

plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

plt.title('Original Image with Matched Template')

plt.axis('off')



plt.subplot(1, 2, 2)

plt.imshow(result, cmap='gray')

plt.title('Template Matching Result')

plt.axis('off')



plt.show()

10.4.2 基于机器学习的缺陷检测

基于机器学习的缺陷检测是通过训练分类器来区分正常和缺陷产品。以下是一个使用支持向量机(SVM)进行缺陷检测的示例:


import cv2

import numpy as np

from sklearn import svm

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

import matplotlib.pyplot as plt

import os



# 读取训练图像

def load_images_from_directory(directory):

    images = []

    for filename in os.listdir(directory):

        img = cv2.imread(os.path.join(directory, filename), cv2.IMREAD_GRAYSCALE)

        if img is not None:

            images.append(img)

    return images



# 加载正常和缺陷图像

normal_images = load_images_from_directory('path/to/normal/images')

defect_images = load_images_from_directory('path/to/defect/images')



# 提取特征

def extract_features(images):

    features = []

    for img in images:

        # 计算图像的直方图

        hist = cv2.calcHist([img], [0], None, [256], [0, 256])

        hist = cv2.normalize(hist, hist).flatten()

        features.append(hist)

    return np.array(features)



normal_features = extract_features(normal_images)

defect_features = extract_features(defect_images)



# 创建标签

normal_labels = np.zeros(normal_features.shape[0])

defect_labels = np.ones(defect_features.shape[0])



# 合并特征和标签

X = np.vstack((normal_features, defect_features))

y = np.hstack((normal_labels, defect_labels))



# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)



# 训练SVM分类器

clf = svm.SVC()

clf.fit(X_train, y_train)



# 预测测试集

y_pred = clf.predict(X_test)



# 计算准确率

accuracy = accuracy_score(y_test, y_pred)

print(f'Accuracy: {accuracy}')



# 读取测试图像并进行预测

test_image = cv2.imread('path/to/your/test_image.jpg', cv2.IMREAD_GRAYSCALE)

test_feature = extract_features([test_image])

prediction = clf.predict(test_feature)



# 显示预测结果

plt.figure(figsize=(5, 5))

plt.imshow(test_image, cmap='gray')

plt.title(f'Prediction: {"Defect" if prediction[0] == 1 else "Normal"}')

plt.axis('off')

plt.show()

10.4.3 基于深度学习的缺陷检测

基于深度学习的缺陷检测是通过训练卷积神经网络(CNN)来识别和分类缺陷。以下是一个使用TensorFlow和Keras进行缺陷检测的示例

;