Алгоритм создания углового изображения изображения смоделирован, а результат неверен - PullRequest
0 голосов
/ 23 марта 2019

Имитируется алгоритм создания углового изображения изображения, и результат неверен 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 ...

...