10

明確に定義されたある点から別の点まで線をプロットし、それを画像マトリックスに変換して、平滑化のためにガウス フィルターを使用したいと考えています。このために、関数lineとを使用しgetframeて線をプロットし、図ウィンドウを画像にキャプチャしますが、getframe非常に遅く、信頼性が高くありません。コンピューターがロックされていると何もキャプチャされず、out of memory170 回の実行後にエラーが発生することに気付きました。

私の質問は次のとおりです。

  • 私が使用できる代替品はありgetframeますか?
  • 画像マトリックスを作成して線を直接描画する方法はありますか?

最小限のコード サンプルを次に示します。

figure1=line([30 35] ,[200 60]);
F= getframe;
hsize=40; sigma=20;
h = fspecial('gaussian',hsize,sigma); 
filteredImg = imfilter(double(F.cdata), h,256);
imshow(uint8(filteredImg));

[アップデート]

を使用した高性能 Mark のアイデアlinspaceは非常に有望に見えますが、 で計算された行列座標にアクセスするにはどうすればよいlinspaceですか? 次のコードを試しましたが、思うように動作しません。これは非常に単純で基本的な MATLAB のものだと思いますが、頭を包むことはできません。

matrix=zeros(200,60);
diagonal=round([linspace(30,200,numSteps); linspace(35,60,numSteps)]);
matrix(diagonal(1,:), diagonal(2,:))=1;
imshow(matrix);
4

4 に答える 4

17

線をマトリックスに直接描画する例を次に示します。まず、空の画像のためにゼロのマトリックスを作成します。

mat = zeros(250, 250, 'uint8');  % A 250-by-250 matrix of type uint8

次に、 から までの線を引きたいとしましょ(30, 35)(200, 60)。最初に、線の長さが何ピクセルになるかを計算します。

x = [30 200];  % x coordinates (running along matrix columns)
y = [35 60];   % y coordinates (running along matrix rows)
nPoints = max(abs(diff(x)), abs(diff(y)))+1;  % Number of points in line

次に、 を使用してライン ピクセルの行インデックスと列インデックスを計算し、 を使用linspaceして添字付きインデックスから線形インデックスに変換し、sub2indそれらを使用して を変更しmatます。

rIndex = round(linspace(y(1), y(2), nPoints));  % Row indices
cIndex = round(linspace(x(1), x(2), nPoints));  % Column indices
index = sub2ind(size(mat), rIndex, cIndex);     % Linear indices
mat(index) = 255;  % Set the line pixels to the max value of 255 for uint8 types

次に、次のようにして、線とフィルター処理されたバージョンを視覚化できます。

subplot(1, 2, 1);
image(mat);        % Show original line image
colormap(gray);    % Change colormap
title('Line');

subplot(1, 2, 2);
h = fspecial('gaussian', 20, 10);  % Create filter
filteredImg = imfilter(mat, h);    % Filter image
image(filteredImg);                % Show filtered line image
title('Filtered line');

ここに画像の説明を入力

于 2009-12-21T17:00:05.267 に答える
5

Computer Vision System ツールボックスがある場合は、使用可能な ShapeInserter オブジェクトがあります。これを使用して、画像上に線、円、長方形、および多角形を描画できます。

mat = zeros(250,250,'uint8');
shapeInserter = vision.ShapeInserter('Shape', 'Lines', 'BorderColor', 'White');
y = step(shapeInserter, mat, int32([30 60 180 210]));
imshow(y);

http://www.mathworks.com/help/vision/ref/vision.shapeinserterclass.html

于 2013-01-14T13:55:22.600 に答える
0

ここで私の答えを確認できます。それはあなたが求めていることを達成するための強力な方法です。私のアプローチの利点は、描画される線の密度を制御するために追加のパラメーターを必要としないことです。

于 2013-01-13T21:50:57.947 に答える
-1

このようなもの:

[linspace(30,200,numSteps); linspace(35,60,numSteps)]

それはあなたのために働きますか?

マーク

于 2009-12-21T15:53:09.243 に答える