Высокие собственные значения всегда для обнаружения краев - PullRequest
1 голос
/ 06 апреля 2019

Я пытаюсь понять детектор Харриса, используя объяснение здесь . Согласно объяснению, я понимаю, что если мы вычислим собственные значения, то

enter image description here

Однако, когда я пытаюсь вычислить собственные значения всегда высоки. Ниже мое основное изображение, из которого я извлекаю части для вычисления собственных значений.

enter image description here

Для плоской области без видимых элементов, я получаю это распределение (справа), что хорошо, но собственные значения большие 260935.70201362,434796.29798638

enter image description here

Для линейного ребра я также получаю высокие собственные значения: 16290305.45393251 567780.54606749

enter image description here

Для угла ожидается получение высоких значений, но теперь я сомневаюсь, что эти высокие значения верны из-за вышеописанных случаев.

8958127.80563239 10986758.19436761

enter image description here

Вот мой метод, переведенный с кода Matlab здесь . Это значение vals, которое я непосредственно получаю из библиотеки линейной алгебры numpy.

def plot_derivatives_1(img_rgb, mode=1):
    '''
    img_rgb = image in rgb color space (3 channeled)
    '''
    img_1c = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
    if mode == 1:  # method 1 derivative
        Ix = cv2.Sobel(img_1c, cv2.CV_64F, 1, 0, ksize=3)
        Iy = cv2.Sobel(img_1c, cv2.CV_64F, 0, 1, ksize=3)
    else:
        # another method of derivatives
        dx = np.array([
            [-1, 0, 1],
            [-1, 0, 1],
            [-1, 0, 1]
            ]);

        dy = np.transpose(dx)
        Ix = signal.convolve2d(img_1c, dx, mode='valid')
        Iy = signal.convolve2d(img_1c, dy, mode='valid')    
        Ix, Iy = Ix.astype(np.float64), Iy.astype(np.float64) # else gaussian blur later is failing

    # yet to solve why we need A and eigen outputs
    A = np.array([
        [ np.sum(Ix*Ix), np.sum(Ix*Iy) ],
        [ np.sum(Ix*Iy), np.sum(Iy*Iy) ]
    ])
    vals, V = linalg.eig(A)
    lamb = vals/np.max(vals)
    print('lambda values:{}'.format(vals))

    fig, ax = plt.subplots(1,4, figsize=(20,5))
    ax[0].imshow(img_rgb);ax[0].set_title('Input Image')
    ax[1].imshow(Ix, cmap='gray');ax[1].set_title('$I_x = \dfrac{\partial I}{\partial x}$')
    ax[2].imshow(Iy, cmap='gray');ax[2].set_title('$I_y = \dfrac{\partial I}{\partial y}$')    
    ax[3].scatter(Ix, Iy);ax[3].set_xlim([-200,200]);ax[3].set_ylim([-200,200]);
    ax[3].set_aspect('equal');ax[3].set_title('Derivatives Distribution');
    ax[3].set_xlabel('Ix');ax[3].set_ylabel('Iy')
    ax[3].axvline(x=0, color = 'r');ax[3].axhline(y=0, color ='r')
    plt.tight_layout();plt.show()    

    return Ix, Iy

Пример вызова для случая (здесь показано для угла).

img = cv2.imread(SRC_FOLDER + 'checkersandbooksmall_sample_6.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

Ix, Iy = plot_derivatives_1(img_rgb, mode=1)

Я использую ноутбук Jupyter, и код только что создан, когда я пытаюсь понять концепцию.

Что я делаю не так, чтобы всегда получать высокие собственные значения для всех случаев?

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

...