参考图:带孔焊条: https://i.sstatic.net/VaVQX3th.jpg
普通焊条: https://i.sstatic.net/MBcyyIyp.jpg
我在使用 opencv 检测缺陷(例如孔、不均匀性)时遇到问题。我是 opencv 的新手,尝试过轮廓检测、边缘检测,但没有得到想要的结果。我想使用 opencv 构建一个算法来检测这些漏洞并标记它们,而不标记任何其他不必要的东西,这不是缺陷。 这是我在代码中使用的方法
import cv2
import numpy as np
from matplotlib import pyplot as plt
# Load the image
image_path = "sample weld strip.jpg"
image = cv2.imread(image_path)
# Convert the image to HSV color space
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# Define HSV range for the weld strip
lower_hsv = (1, 1, 1)
upper_hsv = (177, 255, 255)
# Apply the HSV mask
mask = cv2.inRange(hsv_image, lower_hsv, upper_hsv)
masked_image = cv2.bitwise_and(image, image, mask=mask)
# Convert to grayscale
gray_image = cv2.cvtColor(masked_image, cv2.COLOR_BGR2GRAY)
# Apply Gaussian blur
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
# Edge detection using Canny
edges = cv2.Canny(blurred_image, 50, 150)
# Find contours
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Draw bounding boxes around significant contours (holes)
holes_image = image.copy()
for contour in contours:
area = cv2.contourArea(contour)
if 10 <area < 25: # Adjust this threshold based on your needs
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(holes_image, (x, y), (x+w, y+h), (0, 0, 255), 2)
我正在寻找有关此问题的一些帮助或指导。任何形式的意见或帮助将不胜感激。
我明白你想使用 OpenCV 检测焊条图像中的缺陷(如孔洞)。你目前的代码可以作为起点,但以下是一些改进建议,以及关于如何处理这些缺陷的解释:
-
预处理:
-
你当前的 HSV 掩码范围似乎过于宽泛,可能包含图像中的非焊条区域。为了更准确地分割焊条,请考虑使用颜色选择器工具来确定其在 HSV 颜色空间中的精确下限和上限值。
-
实验不同的去噪技术(如高斯模糊、中值模糊或双边滤波),看看哪种方法最适合你的图像,并有助于突出显示缺陷。
-
分割:
-
除了 Canny 边缘检测之外,还可以探索其他分割方法,例如:
- 阈值化: 如果焊条与背景有良好的对比度,可以使用自适应阈值化来创建二值图像,其中焊条像素为白色,背景像素为黑色。
- 分水岭算法: 这种方法可以有效地分割形状复杂的对象,可用于隔离焊条上的缺陷。
-
缺陷检测:
-
形态学操作: 在分割后的图像上使用形态学操作(例如开运算或闭运算)可以帮助减少噪声并完善检测到的缺陷的形状。开运算可以去除小的、孤立的像素组,而闭运算可以填补小孔并连接附近的区域。
- 基于轮廓的分析: 你可以分析检测到的轮廓的属性(例如面积、周长、圆度)来区分缺陷和误报。例如,孔洞通常具有较小的面积和较高的圆度,而焊条边缘上的不规则性可能具有更大的面积和更低的圆度。
-
机器学习: 对于更高级的缺陷检测,请考虑训练机器学习模型(例如支持向量机或卷积神经网络)来对缺陷和非缺陷区域进行分类。这将需要一个标记图像的数据集,用于训练模型。
-
标记:
-
一旦你识别出缺陷,就可以使用
cv2.rectangle()
或cv2.drawContours()
函数用边界框或轮廓突出显示它们。你还可以添加文本标签以指示缺陷类型或严重性。
代码示例(使用自适应阈值化和形态学操作):
import cv2
import numpy as np
# 加载图像
image_path = "sample weld strip.jpg"
image = cv2.imread(image_path)
# 预处理:转换为灰度并应用模糊
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
# 使用自适应阈值化进行分割
thresh = cv2.adaptiveThreshold(blurred_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 2)
# 形态学操作:使用开运算去除噪声
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
# 查找轮廓
contours, _ = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 分析轮廓并标记缺陷
defects_image = image.copy()
for contour in contours:
area = cv2.contourArea(contour)
if 10 < area < 100: # 根据需要调整此阈值
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(defects_image, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 显示结果
cv2.imshow("Defects", defects_image)
cv2.waitKey(0)
这只是一个示例,你可能需要根据你的特定图像和应用程序调整参数和方法。建议尝试不同的预处理、分割和缺陷检测技术,以找到最适合你的需求的技术组合。
标签:python,opencv,machine-learning,computer-vision From: 78813507