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