2013-01-24 30 views
6

Tôi đã cố gắng so sánh hai hình ảnh và sử dụng thời điểm Hu để so sánh đường viền được trích xuất từ ​​những hình ảnh sau: https://docs.google.com/file/d/0ByS6Z5WRz-h2WHEzNnJucDlRR2s/edithttps://docs.google.com/file/d/0ByS6Z5WRz-h2VnZyVWRRWEFva0k/edit Hình ảnh thứ hai chỉ bằng hình ảnh đầu tiên được xoay và tôi dự kiến ​​là kết quả giống nhau. Chúng hơi khác một chút.So sánh thời điểm Hu

Humoments dấu trên bên phải (hình ảnh đầu tiên):

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

Humoments dấu trên bên phải (hình ảnh thứ hai):

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

Trong video này: http://www.youtube.com/watch?v=O-hCEXi3ymU tại Minut 4th tôi xem ông thu được chính xác như nhau. Tôi sai ở đâu?

Dưới đây là mã của tôi:

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) 

Trả lời

13

Tôi nghĩ con số của bạn có lẽ là ok, sự khác biệt giữa chúng là tương đối nhỏ. Khi chàng nói trong đoạn video mà bạn liên kết đến (khoảng 3min):

Để nhận được một số câu trả lời có ý nghĩa chúng ta hãy đăng nhập transform

vì vậy nếu chúng ta làm -np.sign(a)*np.log10(np.abs(a)) trên các dữ liệu bạn gửi ở trên, chúng tôi nhận được:

hình ảnh đầu tiên:

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

thứ hai hình ảnh:

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

Thực tế chúng không giống hệt nhau. Bạn đang bắt đầu với hình ảnh rasterized mà bạn sau đó xử lý khá nhiều để có được một số những đường nét mà bạn vượt qua trong

Từ opencv docs:.

Trong trường hợp các hình ảnh raster, các bất biến Hu tính cho hình ảnh ban đầu và chuyển đổi có một chút khác biệt.

+0

Câu hỏi cuối cùng: 1) Phạm vi tôi có thể sử dụng để nói rằng chúng giống nhau hoặc hình ảnh tương tự cho mọi sự bất thường? 2) Tôi phải sử dụng HuMoments "thô" của tôi hoặc "đăng nhập" Humoments cho một máy Vector hỗ trợ hoặc một K-nn? – postgres

+2

@postgres - 1) Hơi chủ quan của nó khi sử dụng hình ảnh, nó phụ thuộc phần lớn vào hình ảnh tương tự như thế nào, được coi là một trận đấu. Tốt nhất để thử nghiệm và đặt ngưỡng thích hợp. 2) Tôi không biết nhiều về SVN hoặc KNN, nhưng bạn có thể sử dụng, hãy thử và xem;) – fraxel

Các vấn đề liên quan