2016-12-12 8 views
1

Как я могу эффективно найти все пиксели (u',v') на расстоянии x от заданного пикселя (u,v). В частности все (u',v') такие, что sqrt((u-u')^2 +(v-v')^2) <= xКак найти все пиксели на некотором расстоянии от заданного пикселя?

+3

его почти невозможно найти 'SQRT ((U-U ')^2 + (v-v')^2) = x' потому, что пиксели в целых точках! Если вы не интерполируете –

+1

Да, вы правы. Я хотел спросить '<= x'. Я изменил вопрос. Извинения за путаницу –

ответ

2

Чтобы найти все пиксели на расстоянии x вы можете использовать эту индексацию трюк (для Манхэттенского расстояния)

u=10;v=10; 
x=3.4; 
pixels=img([floor(u-x) ceil(u+x)],[floor(v-x) ceil(v+x)]); 

Однако, обратите внимание, что это добавит все пиксели, находится в пределах досягаемости, даже если это всего лишь часть пикселя! Например. (6,6) внутри!


Для евклидова расстояния, необходимо определить круг вокруг точки

[xi,yi]=meshgrid(1:size(img,1),1:size(img,2)); 
mask=sqrt((xi-u).^2+(yi-v).^2)<x; % or ceil(x) 
pixel_values=img(mask); 
[pixel_indices_u pixel_indices_v]=find(mask); 
2
u = rand(1e2,1); % Create a 100 random points in the unit square 
v = rand(1e2,1); % Create a 100 random points in the unit square 
a = 0.3; % Choosen pixel 
b = 0.4; 
x = 0.1; % radius from the choosen pixel 

idx = (sqrt((u-a).^2 +(v-b).^2) <= x); % Create a logical index array 
locs = [u(idx) v(idx)]; % Index the locations 

В основном это именно то, что вы описали в вопросе, с точками помечены как (u,v) а «точка назначения», так сказать, помечена (a,b) в виде простого (') обозначает комплексную сопряженную транспонирование в MATLAB.

Подробнее о логической индексации в this very insightful answer by Luis Mendo