2012-05-02 66 views
16

Tôi muốn đọc trong một hình ảnh - một hình ảnh của một vòng tròn và tính toán trường vector gradient của hình ảnh đó (ví dụ: vectơ chỉ ra đồng nhất và bình thường với hình tròn). Logic của tôi là không cho tôi một chút, nhưng tôi có:Tính toán trường vector gradient của hình ảnh

clear all; 
im = im2double(imread('littlecircle.png')); 
im = double(im); 
[nr,nc]=size(im); 
[dx,dy] = gradient(im); 
[x y] = meshgrid(1:nc,1:nr); 
u = x; 
v = y; 
quiver(x,y,u,v) 

nếu tôi chỉ đơn giản là làm việc trên, tôi nhận được một trường vector, nhưng nó chỉ đơn giản là gradient của một lưới trống (tức là chỉ là một trường vector của gradient y = x). Điều tôi thực sự muốn là sử dụng

[dx,dy] = gradient(im); 

để phát hiện các cạnh của hình tròn trong hình ảnh, sau đó tính toán trường vector gradient do vòng tròn trong hình ảnh. rõ ràng, việc chỉ định u = x và v = y sẽ chỉ cho tôi trường vectơ của đường thẳng - vì vậy về cơ bản, tôi muốn nhúng độ dốc của hình ảnh vào vectơ u và v. Làm cách nào để làm điều này?

my result

image that i am getting error with

+0

Bạn có thể gửi littlecircle.png? –

Trả lời

13

Bạn đã thực hiện một sai lầm trong các mã (khác hơn thế, nó hoạt động tốt). Bạn nên thay thế như sau:

u = dx; 
v = dy; 

không

u = x; 
v = y; 

Nó hoạt động với this hình ảnh như một nét duyên dáng!

EDIT: Nếu bạn muốn siêu áp đặt các vectơ trên hình ảnh, sau đó làm như sau:

clear all; 
im = imread('littlecircle.png'); 
[nr,nc]=size(im); 
[dx,dy] = gradient(double(im)); 
[x y] = meshgrid(1:nc,1:nr); 
u = dx; 
v = dy; 
imshow(im); 
hold on 
quiver(x,y,u,v) 

ý rằng tôi không chuyển đổi im sẽ tăng gấp đôi, vì nó sẽ không xuất hiện một cách chính xác với imshow (cần uint8). Tùy thuộc vào kích thước hình ảnh của bạn, bạn có thể muốn phóng to để xem các vectơ grad.

Bạn có thể xem phóng to khu vực của các vectơ chồng vào hình ảnh bên dưới:

Gradient vectors of a circle in an image

Better chất lượng hình ảnh là http://i.stack.imgur.com/fQbwI.jpg

+0

Cảm ơn bạn đã trả lời. Tuy nhiên tôi nghĩ rằng tôi đã không giải thích vấn đề đủ kỹ lưỡng. các vectơ gradient được tạo ra trong mã của tôi và mã của bạn không phải là các vectơ gradient do vòng tròn trong hình ảnh gây ra. Trường gradient được tạo ra sẽ hướng ra ngoài và ở bình thường với vòng tròn. vì vậy bạn thấy tôi không chỉ đơn giản muốn có u = x, mà là u = gradient của miền hình ảnh theo hướng x. – brucezepplin

+0

nếu bạn chạy mã này xóa tất cả; im = imread ('littlecircle.png'); im = im (:,:, 1); im = double (im); [nr, nc] = kích thước (im); [dx, dy] = gradient (im); rung động (dx, dy); trên bất kỳ hình ảnh nào bạn thích, bạn sẽ thấy những gì tôi sau (xem những gì âm mưu rung động như thế nào). mặc dù ở đây tôi chỉ đơn giản là quay trở lại một quiverplot của một trường vô hướng. Tuy nhiên, tôi muốn trả về trường vector thực tế và sử dụng trường vectơ sau này trong chương trình của tôi. – brucezepplin

+0

Tôi không chắc chắn bạn muốn làm gì. Trong mã tôi đăng các vectơ * do * chỉ ra ngoài từ vòng tròn (tôi đính kèm một ảnh chụp màn hình được phóng to).Tất nhiên, vì bạn có một thói quen tính toán tính grad trong một không gian rời rạc (hình ảnh), các vec tơ không thể hoàn toàn bình thường với vòng tròn do lượng tử tức là không mong đợi thấy các vectơ grad "hoàn hảo" như được tính toán phân tích cho cho vòng tròn toán học. – Jorge

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