2009-09-15 139 views
4

我有一個強度/灰度圖像,我選擇了這個圖像中的一個像素。我想從所有方向/角度的這個像素開始發送矢量,並且我想對所有矢量求和所有接觸一個矢量的像素的強度。獲取圖像內的矢量的所有像素座標

經過這一步,我想繪製一個軸上的強度和另一個軸上的角度的直方圖。我想我可以自己做最後一步,但我不知道如何在我的灰度圖像中創建這些矢量,以及如何獲取矢量觸摸的像素座標。

我以前在C++中做過這個,它需要很多代碼。我相信這可以在MATLAB中花費更少的精力完成,但是我對MATLAB很新穎,所以任何幫助都會被讚賞,因爲我沒有在文檔中找到任何有用的幫助。

回答

4

它可能不是解決這個問題的最好辦法,但你可以用一點代數的做到這一點,繼承人如何...
我們知道,通過點線的Point-Slope formula(A,B)與角theta爲:

y = tan(theta) * (x-a) + b 

因此一個簡單的想法是計算這條線的交點,其中y =常數對所有常量,並在交叉點處讀出的強度值。你會重複這一過程,各個角度...
的樣本代碼來說明這一概念:

%% input 
point = [128 128];    % pixel location 
I = imread('cameraman.tif');  % sample grayscale image 

%% calculations 
[r c] = size(I); 
angles = linspace(0, 2*pi, 4) + rand; 
angles(end) = []; 
clr = lines(length(angles)); % get some colors 

figure(1), imshow(I), hold on 
figure(2), hold on 

for i=1:length(angles) 
    % line equation 
    f = @(x) tan(angles(i))*(x-point(1)) + point(2); 

    % get intensities along line 
    x = 1:c; 
    y = round(f(x)); 
    idx = (y<1 | y>r);  % indices of outside intersections 
    vals = diag(I(x(~idx), y(~idx))); 

    figure(1), plot(x, y, 'Color', clr(i,:)) % plot line 
    figure(2), plot(vals, 'Color', clr(i,:)) % plot profile 
end 
hold off 
+0

荷銀嗨!我昨天晚上寫了一些非常相似的東西,用「bresenham算法」代替四捨五入(y = round(f(x)))。感謝您的代碼,我在代碼中發現了錯誤。非常感謝!! – zhengtonic 2009-09-16 09:23:22

+0

事實上,舍入只是一個快速的解決方案..你可以通過沿着線插入強度值來改善這種「探測」技術 – Amro 2009-09-16 17:11:25

3

這個例子將類似於Amro's,但它是一個稍微不同的實現,應該對任意座標系工作分配給圖像...

讓我們假設您有矩陣的規則間距的x和y座標是與您的圖像相同的大小,使得像素(i,j)的座標由(x(i,j),y(i,j))給出。作爲一個例子,我將創建5乘5整數的組座標使用MESHGRID樣品:

>> [xGrid,yGrid] = meshgrid(1:5) 

xGrid = 

    1  2  3  4  5 
    1  2  3  4  5 
    1  2  3  4  5 
    1  2  3  4  5 
    1  2  3  4  5 

yGrid = 

    1  1  1  1  1 
    2  2  2  2  2 
    3  3  3  3  3 
    4  4  4  4  4 
    5  5  5  5  5 

接下來,我們可以定義通過爲常數和計算選擇一些值通過座標系傳遞線y = m*(x - a) + by使用網格的x座標:

>> a = 0; 
>> b = 1; 
>> m = rand 

m = 

    0.5469 

>> y = m.*(xGrid(1,:)-a)+b 

y = 

    1.5469 2.0938 2.6406 3.1875 3.7344 

最後,我們發現在網格通過從上面計算的不同點在y點小於網格尺寸:

>> index = abs(yGrid-repmat(y,size(yGrid,1),1)) <= yGrid(2,1)-yGrid(1,1) 

index = 

    1  0  0  0  0 
    1  1  1  0  0 
    0  1  1  1  1 
    0  0  0  1  1 
    0  0  0  0  0 

,並使用該索引矩陣得到由線越過像素x和y座標:

>> xCrossed = xGrid(index); 
>> yCrossed = yGrid(index);