Операции обработки изображений и методы извлечения геометрии

Я уже задавал этот вопрос, и я решил одну задачу моего первоначального вопроса. Тем не менее, я все еще борюсь с получением достойного изображения предварительной обработки.

В общем, я пытаюсь аппроксимировать различные формы поперечного сечения геометрии сварного шва в аддитивном производстве с помощью графика или в идеале (но не обязательно) функции. Области представляют собой внешнюю форму, а также отдельные слои. (см. следующие изображения). Перед этим я должен предварительно обработать изображение, чтобы применить свой алгоритм, который предсказывает расстояние между слоями, а также ширину каждого слоя.

Исходное изображение RGB

Как должно выглядеть приближение

До сих пор я применял некоторые методы предварительной обработки для извлечения соответствующих пикселей, представляющих геометрию сварного шва, которые показаны белыми пикселями (см. третье изображение) и которые важны для прогнозирования высоты и формы каждого слоя сварного шва. Я получил это изображение с помощью хитрых методов обнаружения краев и пороговой обработки в различных цветовых пространствах (включая оттенки серого) и нескольких морфологических операций, таких как закрытие эрозии и расширение до этого.

Как видите, мои результаты были не очень хорошими: либо я теряю слишком много информации о соответствующей переходной области, либо получаю слишком много шума между слоями сварных швов. Шумные области являются переходными областями между отдельными слоями металла и проявляются только таким образом, поэтому в целом нет лучшего или более резкого перехода при меньшем шуме. Изображения 3 и 4 являются примером некоторых методов предварительной обработки изображений, которые я использовал.

На мой взгляд, шумоподавление на основе плотности (например, для бинарного изображения с белыми пикселями) может быть полезно для устранения шума между слоями, то есть в области, где это нежелательно, при сохранении пикселей в соответствующей переходной области.

Предварительная обработка изображений с использованием глобального порогового значения

Предварительно обработанное изображение (приблизительно)

Если кто-нибудь, кто имеет опыт в обработке изображений или видении изображений, может дать мне несколько советов, я был бы очень признателен!

Если вам нужно взглянуть на мой код, просто дайте мне знать. Благодарю вас! :)


person PhilE    schedule 24.04.2021    source источник


Ответы (1)


Вот одна идея в 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()

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

person fmw42    schedule 24.04.2021
comment
Большое спасибо, ваше решение мне очень помогло! :) - person PhilE; 25.04.2021