微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于几何提取的图像处理操作和方法

如何解决用于几何提取的图像处理操作和方法

我已经问过这个问题并且我解决了我原来问题的一项任务。然而,我仍在努力获得一个像样的预处理图像。

一般来说,我试图用图形或理想情况下(但不一定)函数来近似增材制造中焊道几何横截面的不同形状。这些区域是外部形状以及各个层。 (见下图)在此之前,我必须对图像进行预处理,以便我可以应用我的算法来预测层之间的距离以及每层的宽度。

Original RGB Image

How the approximation should look like

到目前为止,我应用了一些预处理方法提取表示焊道几何形状的相关像素,这些像素显示为白色像素(参见第三张图片)并且与预测每个焊缝的高度和形状相关珠层。 在此之前,我使用精明的边缘检测和阈值方法在不同的颜色空间(包括灰度)以及多种形态学操作(例如闭合腐蚀和膨胀)导出了该图像。

如您所见,我的结果并不好,我要么丢失了“相关”过渡区域的太多信息,要么在焊道层之间产生了太多噪音。 “嘈杂”区域是各个金属层之间的过渡区域,仅以这种方式出现,因此通常不会在“噪声”较小的情况下出现“更好”或“更清晰”的过渡。图 3 和图 4 是我使用的一些图像预处理方法的示例。

在我看来,某种基于密度的(例如,对于关于白色像素的二值图像)去噪可能有助于消除层之间的噪声,因此在不需要的区域中,同时保留相关像素中的像素过渡区。

Image preprocessing using global thresholding

Pre-processed Image (to be approximated)

如果任何在图像处理或图像视觉方面有经验的人能给我一些建议,我将不胜感激!

如果您需要查看我的代码,请告诉我。谢谢! :)

解决方法

这是 Python/OpenCV 中的一个想法。

将图像缩小 25% 以强调暗带。然后沿每一列取平均值。然后得到平均数据的轮廓。然后,您可以在轮廓上更准确地测量间距,然后乘以 4 以补偿 25% 的减少。

输入:

enter image description here

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)
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)
plt.plot(mean,color = 'black')
major_ticks = np.arange(0,ww,50)
minor_ticks = np.arange(0,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()

enter image description here

enter image description here

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。