Symfoware

Symfowareについての考察blog

C# グレースケール画像操作の高速化(Parallel.For)

C#で8ビットグレースケール画像の操作について調べています。
C# 8ビット グレースケール画像をpng, jpeg, tiffで保存する


画像サイズが大きくなると、ループ回数が多くなって大変です。


  1.             int width = 5120;
  2.             int height = 5120;
  3.             // 0〜255のグレースケール画像
  4.             byte[] data = new byte[width * height];
  5.             // 画像の上から順に0から255へグラデーション
  6.             for (int h = 0; h < height; h++)
  7.             {
  8.                 for (int w = 0; w < width; w++)
  9.                 {
  10.                     data[h * width + w] = (byte)(h / 20);
  11.                 }
  12.             }



実行速度は120ミリ秒程度。

乗算をやめて、インクリメントに変更。


  1.             int width = 5120;
  2.             int height = 5120;
  3.             int scan = 0;
  4.             // 0〜255のグレースケール画像
  5.             byte[] data = new byte[width * height];
  6.             // 画像の上から順に0から255へグラデーション
  7.             for (int h = 0; h < height; h++)
  8.             {
  9.                 for (int w = 0; w < width; w++)
  10.                 {
  11.                     data[scan] = (byte)(h / 20);
  12.                     scan++;
  13.                 }
  14.             }



実行速度は110ミリ秒。
環境にもよると思いますが、思ったより縮まりませんでした。

ここでふと、この記事を見つけました。
RGB24bit→Gray8bit変換高速化

なるほど、Parallel.Forか。


  1.             int width = 5120;
  2.             int height = 5120;
  3.             // 0〜255のグレースケール画像
  4.             byte[] data = new byte[width * height];
  5.             // 画像の上から順に0から255へグラデーション
  6.             Parallel.For(0, height, h => {
  7.                 for (int w = 0; w < width; w++)
  8.                 {
  9.                     data[h * width + w] = (byte)(h / 20);
  10.                 }
  11.             });



※using System.Threading.Tasks;の追加が必要。

これで70ミリ秒になりました。

Parallel.For、知識としては知っていたのですがこういう局面で使えますね。
目から鱗でした。


【参考URL】

RGB24bit→Gray8bit変換高速化
[標準ライブラリ] 並列処理ライブラリ

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2018/06/18(月) 23:32:03|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Ubuntu 18.04からWindows Server 2016へリモートデスクトップ接続(Remmina) | ホーム | C# 8ビット グレースケール画像をpng, jpeg, tiffで保存する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
https://symfoware.blog.fc2.com/tb.php/2198-c40be56d
この記事にトラックバックする(FC2ブログユーザー)