3

画像が単色かどうかを確認する機能があります。

bool r = true;
Color checkColor = image.GetPixel(0, 0);

for (int x = 0; x < image.Width; x++)
  {
   for (int y = 0; y < image.Height; y++)
     {
      if (image.GetPixel(x, y) != checkColor) { r = false; }
     }
   }
// image color
clrOut = checkColor;
return r;

しかし、このアルゴリズムは大きな画像では遅くなります。ピクセル シェーダーと GPU を使用してこれを行う方法を知っている人はいますか?

4

4 に答える 4

6

これを高速化するために、ピクセル シェーダーや GPU は必要ありません。LockBitsを使用します。Bob Powell には、やりたいことを正確に行うための優れたチュートリアルがあります。

于 2012-02-15T15:39:05.760 に答える
2

また、コードを見て、for ループを逆にしてみてください。これにより、メモリ アクセスが向上します。

for( y... ... for ( x...

次のステップは、いくつかのピクセル アクセスを展開することです。インター ループで 4 または 8 ピクセルを取得してみてください

for( y... ... for ( x = 0; x < image.Width ; x +=4 )

  pixel0 = image.getpixel(x,Y)
  pixel1 = image.getpixel(x +1,Y)
  pixel2 = image.getpixel(x +2,Y)
  pixel3 = image.getpixel(x +3,Y)

  if ( pixel0 ....

前述のように、Bitmap Unlock を使用すると、ポインターを介してピクセルにアクセスできます。これは、CPU で取得できる最速のものです。その手法にも、ループ順序付けとピクセル展開を適用できます。
これが十分に速くない場合は、選択肢があります。OpenCL とその C# バインディングを使用した C# マルチスレッドまたは GPU。

于 2012-02-27T00:28:31.567 に答える
1

を使用しているため、このコードは低速ですGetPixel。直接ポインタ アクセスを使用すると、はるかに高速化できます。それだけでは不十分な場合にのみ、ピクセル シェーダーを検討します。

いくつかのヘルパー ライブラリを作成しました: https://github.com/CodesInChaos/ChaosUtil/tree/master/Chaos.Image

特に、Pixelsと のRawColorタイプが役立つはずです。

于 2012-02-15T15:39:52.727 に答える
0

同じ色の画像ではなく大きな変動領域を持つ画像のみを探している場合は、バイリニア フィルタリングを使用して画像を 1x1 ピクセルに縮小し、ピクセル 0,0 を読み取ることができます。ピクセルが予想したものと大きく異なる場合 (RGB 距離と許容範囲)、元の画像に何らかの変動があったことを確認できます。

もちろん、これはあなたが本当にこの情報で何をしたいかによって異なりますので、YMMV.

于 2012-02-15T16:22:23.947 に答える