用于几何提取的图像处理操作和方法
Image processing operations and methods for geometry extraction
我已经问过这个问题并且我解决了我原来问题的一个任务。但是,我仍然在努力获得像样的预处理图像。
一般来说,我试图用图表或理想情况下(但不一定)函数来近似增材制造中焊缝几何横截面的不同形状。这些区域是外部形状以及各个层。 (见下图)在此之前,我必须对图像进行预处理,以便我可以应用我的算法来预测层之间的距离以及每层的宽度。
到目前为止,我应用了一些预处理方法来提取代表焊道几何形状的相关像素,这些像素显示为白色像素(参见第三张图像),并且与预测高度和形状相关每个焊缝层。
我在不同的颜色空间(包括灰度)和多种形态学操作(例如在此之前关闭腐蚀和膨胀)中使用精明的边缘检测和阈值方法导出了这张图像。
如您所见,我的结果并不好,我要么丢失了太多“相关”过渡区域的信息,要么在焊道层之间获得了太多噪音。 “嘈杂”区域是各个金属层之间的过渡区域,并且只会以这种方式出现,因此一般来说,“噪声”较少时不会出现“更好”或“更锐利”的过渡。图3和图4是我使用的一些图像预处理方法的例子。
在我看来,以某种方式基于密度(例如,对于关于白色像素的二值图像)去噪可能有助于消除层之间的噪声,因此在不需要的区域同时保留像素相关过渡区域。
如果有任何在图像处理或图像视觉方面有经验的人能给我一些建议,我将不胜感激!
如果您需要查看我的代码,请告诉我。谢谢! :)
这是 Python/OpenCV 中的一个想法。
将图像缩小 25% 以突出暗带。然后平均每列。然后得到平均数据的轮廓。然后,您可以更准确地测量间距的轮廓,然后乘以 4 以补偿 25% 的减少。
输入:
import cv2
import numpy as np
from matplotlib import pyplot as plt
# Read image
img = cv2.imread('weld_bead.jpg')
# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# scale image by 25%
img_small = cv2.resize(gray, (0,0), fx=0.25, fy=0.25, interpolation=cv2.INTER_AREA)
hh, ww = img_small.shape[:2]
# compute mean of each column
mean = np.mean(img_small, axis=0)
# scale the mean up vertically for viewing
mean_stretch = cv2.resize(mean, (hh,ww), fx=0, fy=0, interpolation=cv2.INTER_AREA).transpose()
# show results
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
plt.imshow(img_small, cmap='gray')
ax = plt.axes()
ax.xaxis.grid(color='black')
plt.title("Weld Bead Scaled By 25%")
plt.savefig('weld_bead_small.png')
plt.show()
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
plt.imshow(mean_stretch, cmap='gray')
ax = plt.axes()
ax.xaxis.grid(color='black')
plt.title("Weld Bead Average Stretched In Y")
plt.savefig('weld_bead_ave_stretch.png')
plt.show()
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
plt.plot(mean,color = 'black')
major_ticks = np.arange(0, ww, 50)
minor_ticks = np.arange(0, ww, 10)
ax.set_xticks(major_ticks)
ax.set_xticks(minor_ticks, minor=True)
ax.grid(which='minor', alpha=0.5)
ax.grid(which='major', alpha=1)
plt.grid(color='gray')
plt.title("Weld Bead Profile")
plt.savefig('weld_bead_plot.png')
plt.show()
我已经问过这个问题并且我解决了我原来问题的一个任务。但是,我仍然在努力获得像样的预处理图像。
一般来说,我试图用图表或理想情况下(但不一定)函数来近似增材制造中焊缝几何横截面的不同形状。这些区域是外部形状以及各个层。 (见下图)在此之前,我必须对图像进行预处理,以便我可以应用我的算法来预测层之间的距离以及每层的宽度。
到目前为止,我应用了一些预处理方法来提取代表焊道几何形状的相关像素,这些像素显示为白色像素(参见第三张图像),并且与预测高度和形状相关每个焊缝层。 我在不同的颜色空间(包括灰度)和多种形态学操作(例如在此之前关闭腐蚀和膨胀)中使用精明的边缘检测和阈值方法导出了这张图像。
如您所见,我的结果并不好,我要么丢失了太多“相关”过渡区域的信息,要么在焊道层之间获得了太多噪音。 “嘈杂”区域是各个金属层之间的过渡区域,并且只会以这种方式出现,因此一般来说,“噪声”较少时不会出现“更好”或“更锐利”的过渡。图3和图4是我使用的一些图像预处理方法的例子。
在我看来,以某种方式基于密度(例如,对于关于白色像素的二值图像)去噪可能有助于消除层之间的噪声,因此在不需要的区域同时保留像素相关过渡区域。
如果有任何在图像处理或图像视觉方面有经验的人能给我一些建议,我将不胜感激!
如果您需要查看我的代码,请告诉我。谢谢! :)
这是 Python/OpenCV 中的一个想法。
将图像缩小 25% 以突出暗带。然后平均每列。然后得到平均数据的轮廓。然后,您可以更准确地测量间距的轮廓,然后乘以 4 以补偿 25% 的减少。
输入:
import cv2
import numpy as np
from matplotlib import pyplot as plt
# Read image
img = cv2.imread('weld_bead.jpg')
# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# scale image by 25%
img_small = cv2.resize(gray, (0,0), fx=0.25, fy=0.25, interpolation=cv2.INTER_AREA)
hh, ww = img_small.shape[:2]
# compute mean of each column
mean = np.mean(img_small, axis=0)
# scale the mean up vertically for viewing
mean_stretch = cv2.resize(mean, (hh,ww), fx=0, fy=0, interpolation=cv2.INTER_AREA).transpose()
# show results
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
plt.imshow(img_small, cmap='gray')
ax = plt.axes()
ax.xaxis.grid(color='black')
plt.title("Weld Bead Scaled By 25%")
plt.savefig('weld_bead_small.png')
plt.show()
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
plt.imshow(mean_stretch, cmap='gray')
ax = plt.axes()
ax.xaxis.grid(color='black')
plt.title("Weld Bead Average Stretched In Y")
plt.savefig('weld_bead_ave_stretch.png')
plt.show()
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
plt.plot(mean,color = 'black')
major_ticks = np.arange(0, ww, 50)
minor_ticks = np.arange(0, ww, 10)
ax.set_xticks(major_ticks)
ax.set_xticks(minor_ticks, minor=True)
ax.grid(which='minor', alpha=0.5)
ax.grid(which='major', alpha=1)
plt.grid(color='gray')
plt.title("Weld Bead Profile")
plt.savefig('weld_bead_plot.png')
plt.show()