Имитируется алгоритм создания углового изображения изображения, и результат неверен operator Оператор sobel_dir программного обеспечения HALCON возвращает изображение угла направления.Я использовал Python, чтобы переписать этот алгоритм в соответствии с инструкциями, но я не знаю, как рассчитать конечное значение в градациях серого.image, то есть получают и производные изображения соответственно Ex и Ey 2. Согласно Ex и Ey получают амплитудное изображение, то есть изображение обнаружения края 3. Присвойте значение градаций серого указанному диапазону согласнок положительным и отрицательным условиям Ex и Ey, и сгенерируйте изображение направления с углом амплитуды
Нет проблем с первым шагом и вторым шагом, но мой алгоритм неверен на третьем шаге.Ниже приводится описание третьего шага в исходном тексте:
————————————————————————————————————————————————————————————————————————————————— Направления кромок возвращаются в EdgeDirection и являютсясохраняются с шагом в 2 градуса, то есть направление края x градусов в математически положительном смысле и относительно горизонтальной оси сохраняется как x / 2 в изображении направления края.Кроме того, направление изменения интенсивности принимается во внимание.Пусть Ex, Ey обозначают градиент изображения.Затем следующие направления ребер возвращаются как r / 2:
увеличение интенсивности |Ex / Ey |
направление ребра r
снизу вверх |0 / + |0 |
от нижнего правого до верхнего левого |- / + |] 0,90 [
справа налево |- / 0 |90
сверху вниз справа налево |- / - |] 90 180 [
сверху вниз |- / 0 |180
от левого верхнего до правого нижнего |+/- |] 180 270 [
слева направо |+/- |270
от левого нижнего к верхнему правому |+ / + |180
Я знаю, что этот алгоритм должен заменить исходный касательный угол направлением угла, чтобы более эффективно использовать функцию угла. Но я не могу понять, как определитьзначения в градациях серого между 0 и 90, 90 и 180. Студент: в соответствии с величиной?
def sobel_dir(Image, FilterType, Size):
'''
使用Sobel算子检测边缘(振幅和方向)
:param Image: 输入图像
:param FilterType: 过滤器类型
:param Size: 掩码尺寸
:return EdgeAmplitude: 边缘振幅(梯度大小)图像
:return EdgeDirection: 图像边缘方向
'''
Image = Image.astype(np.float_)
hor = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]])
ver = np.array([[1, 0, -1], [2, 0, -2], [1, 0, -1]])
Size = Size * 2 + 1
if Size == 3:
pass
elif Size > 3 and 'binomial' in FilterType:
Image = Binomial2D(Image, Size)
elif Size > 3:
Image = cv2.GaussianBlur(Image, (Size, Size), 0)
s1 = cv2.filter2D(Image, -1, hor)
s2 = cv2.filter2D(Image, -1, ver)
EdgeDirection = np.zeros(Image.shape, np.float_)
Height, Width = s1.shape
if 'sum_sqrt' in FilterType:
EdgeAmplitude = np.sqrt(np.power(s1, 2) + np.power(s2, 2)) / 4
# EdgeDirection = np.arctan2(-s2, -s1)
elif 'sum_abs' in FilterType:
EdgeAmplitude = np.add(np.abs(s1), np.abs(s2)) / 4
EdgeAmplitudeMax = np.max(EdgeAmplitude)
EdgeAmplitudeMin = np.min(EdgeAmplitude)
EdgeAmplitudeNor = (EdgeAmplitude - EdgeAmplitudeMin) / (EdgeAmplitudeMax - EdgeAmplitudeMin) * 90
for y in range(Height):
for x in range(Width):
if s2[y, x] == 0 and s1[y, x] == 0:
EdgeDirection[y, x] = 255
continue
if s2[y, x] == 0 and s1[y, x] > 0:
EdgeDirection[y, x] = 0
continue
elif s2[y, x] < 0 and s1[y, x] > 0:
# EdgeDirection[y, x] = random.uniform(1, 89) 右下到左上
EdgeDirection[y, x] = abs(EdgeAmplitudeNor[y, x])
continue
elif s2[y, x] < 0 and s1[y, x] == 0:
EdgeDirection[y, x] = 90
continue
elif s2[y, x] < 0 and s1[y, x] < 0:
# EdgeDirection[y, x] = random.uniform(91, 179) 右上到左下
EdgeDirection[y, x] = 90 + abs(EdgeAmplitudeNor[y, x])
continue
elif s2[y, x] == 0 and s1[y, x] < 0:
EdgeDirection[y, x] = 180
continue
elif s2[y, x] > 0 and s1[y, x] < 0:
# EdgeDirection[y, x] = random.uniform(1, 45) 左上到右下
EdgeDirection[y, x] = 180 + abs(EdgeAmplitudeNor[y, x])
continue
elif s2[y, x] > 0 and s1[y, x] == 0:
EdgeDirection[y, x] = 270
continue
elif s2[y, x] > 0 and s1[y, x] > 0:
# EdgeDirection[y, x] = random.uniform(1, 45) 左下到右上
EdgeDirection[y, x] = 270 + abs(EdgeAmplitudeNor[y, x])
continue
return EdgeAmplitude.astype(np.uint8), EdgeDirection.astype(np.uint8)
Я нашел случайную картинку для тестирования, рассчитанное значение амплитуды точно такое же, как и в программном обеспечении Halcon, нона изображении угла я не знаю, как назначить эти значения серого в диапазоне от 0 до 90, от 90 до 180 ...
help ...