Сравнение моментов Ху

Я попытался сравнить два изображения и использовать момент Ху, чтобы сравнить контур, извлеченный из этих изображений: https://docs.google.com/file/d/0ByS6Z5WRz-h2WHEzNnJucDlRR2s/edit и https://docs.google.com/file/ d / 0ByS6Z5WRz-h2VnZyVWRRWEFva0k / edit Второе изображение равно первому, только оно повернуто, и я ожидал, что результат будет таким же, как и у Humoments. Они немного разные.

Надпись «Юмоменты» справа (первое изображение):

[[ 6.82589151e-01] [ 2.06816713e-01] [ 1.09088295e-01] [ 5.30020870e-03] [ -5.85888607e-05] [ -6.85171823e-04] [ -1.13181280e-04]] 

Надпись «Юмоменты» справа (второе изображение):

 [[ 6.71793060e-01] [ 1.97521128e-01] [ 9.15619847e-02] [ 9.60179567e-03] [ -2.44655863e-04] [ -2.68791106e-03] [ -1.45592441e-04]] 

В этом видео: http://www.youtube.com/watch?v=O-hCEXi3ymU на 4-й минуте я смотрел, как он получил то же самое. Где я не прав?

Вот мой код:

 nomeimg = "Sassatelli 1984 ruotato.jpg" #nomeimg = "Sassatelli 1984 n. 165 mod1.jpg" img = cv2.imread(nomeimg) gray = cv2.imread(nomeimg,0) ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV) element = cv2.getStructuringElement(cv2.MORPH_CROSS,(4,4)) imgbnbin = thresh imgbnbin = cv2.dilate(imgbnbin, element) #find contour contours,hierarchy=cv2.findContours(imgbnbin,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) #Elimination small contours Areacontours = list() area = cv2.contourArea(contours[i]) if (area > 90 ): Areacontours.append(contours[i]) contours = Areacontours print('found objects') print(len(contours)) #contorus[3] for sing in first image #contours[0] for sign in second image print("humoments") mom = cv2.moments(contours[0]) Humoments = cv2.HuMoments(mom) print(Humoments) 

One Solution collect form web for “Сравнение моментов Ху”

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

Чтобы получить некоторые содержательные ответы, мы берем преобразование log

поэтому, если мы делаем -np.sign(a)*np.log10(np.abs(a)) на данных, которые вы -np.sign(a)*np.log10(np.abs(a)) выше, получаем:

Первое изображение:

 [[ 0.16584062] [ 0.68441437] [ 0.96222185] [ 2.27570703] [-4.23218495] [-3.16420051] [-3.9462254 ]] 

Второе изображение:

 [[ 0.17276449] [ 0.70438644] [ 1.0382848 ] [ 2.01764754] [-3.61144437] [-2.57058511] [-3.83686117]] 

То, что они не идентичны, следует ожидать. Вы начинаете с растрированных изображений, которые затем обрабатываете довольно много, чтобы получить некоторые контуры, которые вы проходите.

Из документов opencv :

В случае растровых изображений вычисляемые инварианты Ху для исходных и преобразованных изображений немного отличаются.

  • Код порога Openc работает в python2.7 (Windows), но не работает. Малина Pi
  • Прочитайте изображение с OpenCV и покажите его с помощью Tkinter
  • как выполнить стабильное обнаружение угла глаз?
  • Pyinstaller распространяет opencv из Windows 10 в Windows <10, отсутствует ucrt dlls api-ms-win-crt
  • opencv 3.0.0-dev привязки python не работают должным образом
  • OpenCV / Array должен быть CvMat или IplImage / Освобождение объекта захвата
  • Как отслеживать blob с помощью OpenCV и Python
  • Остановить функцию от записи до stdout
  • Python - лучший язык программирования в мире.