Я пытаюсь понять детектор Харриса, используя объяснение здесь . Согласно объяснению, я понимаю, что если мы вычислим собственные значения, то
Однако, когда я пытаюсь вычислить собственные значения всегда высоки. Ниже мое основное изображение, из которого я извлекаю части для вычисления собственных значений.
Для плоской области без видимых элементов, я получаю это распределение (справа), что хорошо, но собственные значения большие
260935.70201362,434796.29798638
Для линейного ребра я также получаю высокие собственные значения: 16290305.45393251 567780.54606749
Для угла ожидается получение высоких значений, но теперь я сомневаюсь, что эти высокие значения верны из-за вышеописанных случаев.
8958127.80563239 10986758.19436761
Вот мой метод, переведенный с кода 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, и код только что создан, когда я пытаюсь понять концепцию.
Что я делаю не так, чтобы всегда получать высокие собственные значения для всех случаев?
Примеры изображений, использованных для вышеуказанных случаев, можно найти здесь