2017-02-21 16 views
-4

私はC++による画像処理に関するプロジェクトを見つめています。C++/Cでの画像のブラー

私がこの問題についてオンラインで見つけたものはすべて(C++でイメージをぼかす)、CUDAまたはOpenCVのいずれかになります。

C++のみで画像をぼかす方法はありますか? (初心者向け)

「はい」の場合、誰かがコードを共有したり、説明したりできますか?

ありがとうございます!

+0

はい。平均フィルタ。しかし、まず画像を保持する構造が必要です。それをロードします。それを保存します。その間にフィルターを適用します。 – knivil

+0

[内蔵ガウス関数を使用せずに画像をガウスぼかしするにはどうすればよいですか?](http://stackoverflow.com/questions/1696113/how-do-i-gaussian-blur-an-image-without – davidsheldon

+0

私は** CImg **をお勧めしたいと思いますが、これはC++の軽量でインストールが簡単です(ヘッダファイル1つとライブラリなし)ので使いやすいです... http://cimg.eu –

答えて

0

自分でぼかしを実装したい場合は、何らかの形で画像をメモリに保存する必要があります。白黒画像をお持ちの場合は、

unsigned char[width*height] 

画像を保存するには十分です。カラー画像の場合は、同じ配列でサイズは3〜4倍になります(各カラーチャンネルに1つと、不透明度を表すいわゆるアルファ値用)。

黒と白の場合、各ピクセルの近傍を合計してその平均を計算する必要があります。このアプローチは、各カラーチャネルに操作を適用することによってカラー画像に転送する。

上記の操作は、別の操作を実装するためにも使用できる、いわゆるkernel filterの特殊なケースです。

+0

ありがとう!私はその原則を知っている。私はMATLABでそれを実装する方法を知っています。しかし、この特定のプロジェクトのために私はC++でそれを作る必要があります –

2

まず、画像をメモリに保存する必要があります。

次に、ワークスペースとして使用するために2番目のバッファが必要です。

フィルタが必要です。一般的なフィルタは、

  1 4 1 
      4 -20 4 
      1 4 1 

です。各ピクセルについて、フィルタを適用します。そこで、イメージを周囲のピクセルの加重平均に設定してから、全体のイメージが明るくなるか暗くなるのを避けるために減算します。

小さなフィルタを適用するのは非常に簡単です。

  for(y=0;y<height;y++) 
      for(x=0;x<width;x++) 
      { 
       total = image[(y+1)*width+x+1]; 
       for(fy=0; fy < 3; fy++) 
       for(fx = 0; fx < 3; fx++) 
        total += image[(y+fy)*width+x+fx] * filter[fy*3+x]; 
       output[(y+1)*width+x+1] = clamp(total, 0, 255); 

      } 

エッジは特別な場合がありますが、理論的には複雑ではありません。

ナイーブなアルゴリズムを使用すると、エッジを正しく設定することが重要になります。その後、周波数領域で計算を行い、大きなフィルタを使用すると非常に高速です。

+0

ありがとう!それはMATLABに似ています。 –