2013-01-24 13 views
6

Próbowałem porównać dwa obrazy i użyć Hu moment, aby porównać kontur wyodrębniony z tych obrazów: https://docs.google.com/file/d/0ByS6Z5WRz-h2WHEzNnJucDlRR2s/edit i https://docs.google.com/file/d/0ByS6Z5WRz-h2VnZyVWRRWEFva0k/edit Drugie zdjęcie jest równe pierwszemu tylko obrócone i spodziewam się w rezultacie tych samych Humoments. Są trochę inne.Porównanie momentów Hu

Humoments znak po prawej stronie (pierwsze zdjęcie):

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

Humoments znak po prawej stronie (drugi obrazek):

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

W tym filmie: http://www.youtube.com/watch?v=O-hCEXi3ymU na 4 Minut oglądałem on uzyskał dokładnie to samo. Gdzie się mylę?

Oto mój kod:

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) 

Odpowiedz

13

myślę numery są chyba ok, różnice między nimi są umiarkowanie niewielka. Jako facet mówi w filmie, który odwołuje się do (około 3 minuty):

dostać jakieś sensowne odpowiedzi Bierzemy dziennik przekształcić

więc jeśli zrobimy -np.sign(a)*np.log10(np.abs(a)) na danych publikowanych powyżej, otrzymujemy:

Pierwszy obraz:

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

drugi obraz:

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

Nie należy się spodziewać, że nie są identyczne. Zaczynają się z rasterized obrazów, które następnie przetwarzają sporo, aby uzyskać niektóre z konturami, które mijamy w

Z opencv docs.

W przypadku obrazów rastrowych, obliczone niezmienniki Hu dla oryginalne i przekształcone obrazy są nieco inne.

+0

Ostatnie pytania: 1) Jakiego zakresu mogę użyć do stwierdzenia, że ​​są to te same lub podobne obrazy dla każdego człowieka? 2) Muszę używać moich "surowych" HuMoments lub "log" Humoments dla Support Vector Machine lub K-nn? – postgres

+2

@postgres - 1) Jest nieco subiektywny, gdy używa obrazów, w dużej mierze zależy od tego, jak podobne obrazy muszą być, aby uznać za mecz. Najlepiej eksperymentować i ustawić odpowiedni próg. 2) Nie wiem zbyt wiele o SVN lub KNN, ale prawdopodobnie możesz też użyć, spróbuj i zobacz;) – fraxel