2

Octave を使用していくつかの画像を分析しています。現在、ネストされた 2 つの for ループを使用してすべてのピクセルにアクセスしていますが、これは非常に低速です。

私のコードは次のようなものです:

for i = 1:size(im,1)
    for j = 1:size(im,2)
    p = im(i,j,1:3);
        if (classRGB(class, [p(1),p(2),p(3)]) > 0)
            ## Apply some function to that pixel here
        endif
    endfor
endfor

Octave のループなしでこれを行う方法はありますか?

前もって感謝します。

4

3 に答える 3

6

よりマトリックス指向のアプローチを取ることをお勧めします。ループを使用すると、MATLAB/Octave が非常に遅くなります。

たとえば、グレースケール変換値 (0.3*R + 0.6*G + 0.1*B) が 128 以下のピクセルがゼロに設定されている RGB 画像を作成するとします。

# Read a 512x512 RGB image. 
# Resulting matrix size is [512  512  3]
im = imread('lena_rgb.png');

# Compute grayscale value (could be done more accurately with rgb2gray). 
# Resulting matrix size is [512 512 1] (same as [512 512])
grayval = 0.3*im(:,:,1) + 0.6*im(:,:,2) + 0.1*im(:,:,3);

# Create a bitmask of grayscale values above 128
# Contains 0 if less than or equal than 128, 1 if greater than 128
# Resulting matrix size is [512 512 1] (same as [512 512])
mask = (grayval > 128);

# Element-wise multiply the mask with the input image to get the new RGB image
# Resulting matrix size is [512  512  3]
result = im.* repmat(mask, [1 1 3]);

Octaveで行列操作、算術演算、アドレス指定についてさらに学習することをお勧めします。参照用に、私の例の元の画像と結果の画像を含めました。 元の画像 結果画像

于 2010-11-01T21:02:25.090 に答える
0

あなたは私たちに何をするかを伝える必要がありますclassRGB. そうでなければ、誰もあなたを助けることができません。classRGB一度に値の行列を計算できる場合は、行列を直接渡すことができますim(:,:,1:3)

于 2010-11-14T20:13:07.050 に答える
0

私は Octave の知識はありませんが、他の言語で最速の方法は、イメージ ピクセルを表すバイト配列へのポインターを取得して反復することです。たとえば、uint8 の色サイズを想定した擬似コード:

uint8 *ptr = getBytes(image);
foreach row{
    for each pixel{
      Red = *ptr;  ptr++;
      Green = *ptr;  ptr++;
      Blue = *prr;  ptr++;
      do something with Red, Green, Blue (or Alpha)
    } 
}

画像データ型が各行の最後で使用するパディングを把握するように注意する必要があります。

于 2010-11-01T07:43:09.773 に答える