1

画像のサイズが大きくgetPixel、and メソッドとsetPixelメソッドを使用してビットにアクセスしましたが、遅すぎることがわかったので、ロック ビットとロック解除ビットを実装しましたが、理解できませんでした。ボブ・パウエルのチュートリアルも見ましたが、チュートリアルは理解できませんでした。そこで、画像から GLCM を取得するためにここで助けを求めています。

4

1 に答える 1

4

GLCM は一般に、非常に計算量の多いアルゴリズムです。隣接するピクセルごとに、各ピクセルを反復処理します。C++ 画像処理ライブラリでさえ、この問題を抱えています。

ただし、GLCM は、各参照ピクセルの計算が独立しているため、並列 (マルチスレッド) 実装に非常に適しています。

ロック ビットとアンロック ビットの使用に関しては、以下のサンプル コードを参照してください。覚えておくべきことの 1 つは、最適化のために画像がパディングされる可能性があることです。また、画像のビット深度が異なる場合や複数のチャンネルがある場合は、それに応じてコードを調整する必要があります。

BitmapData data = image.LockBits(new Rectangle(0, 0, width, height), 
     ImageLockMode.ReadOnly, PixelFormat.Gray8);

byte* dataPtr = (byte*)data.Scan0;

int rowPadding = data.Stride - (image.Width);

// iterate over height (rows)
for (int i = 0; i < height; i++)
{
    // iterate over width (columns)
    for (int j = 0; j < width; j++)
    {
        // pixel value
        int value = dataPtr[0];

        // advance to next pixel
        dataPtr++;

    // at the end of each column, skip extra padding
    if (rowPadding > 0)
    {
        dataPtr += rowPadding;
    }
}

image.UnlockBits(data1);
于 2013-04-27T05:27:10.330 に答える