2

指定されたグレースケールしきい値を下回るすべてのピクセルをフィルター処理するメソッドを作成しようとしています (下はすべて黒、上はすべて白になります)。この方法は機能しますが、私が感じるほど速くはありません。

クラスを使用することにしましたParallelが、何を設定してMaxDegreeOfParallelismも速度のメリットはありません。ビットマップに対して他の操作も実行しますが、操作の合計時間MaxDegreeOfParallelismは常に約 170 ミリ秒です。デバッグ時は、このフィルタリング自体に160ms程度かかるので、全体的にはかなり差が出ると思います。

i7 プロセッサ、4 つの物理コア、8 つの論理コアを使用しています。

コード:

Color black = System.Drawing.Color.FromArgb(0, 0, 0);
Color white = System.Drawing.Color.FromArgb(255, 255, 255);

int lowerBound = (int)((float)lowerBoundPercent * 255.0 / 100.0);
int upperBound = (int)((float)upperBoundPercent * 255.0 / 100.0);

int[][] border = new int[8][];
for (int i=0;i<8;i++)
{
    border[i] = new int[] { i*height/8, (i+1)*height/8-1};
}

Parallel.For(0, 8, new ParallelOptions { MaxDegreeOfParallelism = 8 }, i =>
    {
        for (int k = 0; k < width; k++)
        {
            for (int j = border[i][0]; j <= border[i][1]; j++)
            {
                Color pixelColor;
                int grayscaleValue;
                pixelColor = color[k][j];
                grayscaleValue = (pixelColor.R + pixelColor.G + pixelColor.B) / 3;
                if (grayscaleValue >= lowerBound && grayscaleValue <= upperBound)
                    color[k][j] = white;
                else
                    color[k][j] = black;
            }
        }
    });

color[][]のジャグ配列ですSystem.Drawing.Color

質問: これは正常ですか? そうでない場合、それを変更するにはどうすればよいですか?

編集:

ピクセル抽出:

Color[][] color;
color = new Color[bitmap.Width][];
for (int i = 0; i < bitmap.Width; i++)
{
    color[i] = new Color[bitmap.Height];
    for (int j = 0; j < bitmap.Height; j++)
    {
        color[i][j] = bitmap.GetOriginalPixel(i, j);
    }
}

Bitmap は、独自のクラス Bitmap のインスタンスです。

public class Bitmap
{
    System.Drawing.Bitmap processed;
    //...
    public Color GetOriginalPixel(int x, int y) { return processed.GetPixel(x, y); }
    //...
}
4

2 に答える 2