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进行缺陷检测的示例