画像をぼかす。。って、ちょこちょこ書いてたわけですが、
技術的には、非常に簡単な考え方です。
下図の黒い部分がドット(ピクセル)だとすると、
その周辺を含めた平均を出し、その値に変換してしまうのです。
要するに、赤いピクセルに着目し(下図の■)、
その周辺、たとえば前後左右を1ピクセルずつ考慮すると、
9ピクセルの矩形が考えられます(下図の□)。
これの平均を出して、変換後のピクセルの色にしてしまうだけです。
この画像を前後左右1ピクセルを考慮すると、
↓
こうなります。
どうようにして、こんな画像を用意して、
影響範囲を前後左右1ピクセルの3*3=9ドットの平均すると
↓
影響範囲を前後左右2ピクセルの5*5=25ドットの平均すると
↓
影響範囲を前後左右3ピクセルの7*7=49ドットの平均すると
↓
影響範囲を前後左右4ピクセルの9*9=81ドットの平均すると
↓
影響範囲を前後左右7ピクセルの15*15=225ドットの平均すると
↓
影響範囲を前後左右15ピクセルの31*31=961ドットの平均すると
↓
っとこれでわかるように、演算量は、2乗に比例するような気もするのですが、
実は、タテと横を別々に行っており、最初にヨコでぼかした画像を生成し、
それをさらにタテにぼかして画像を生成します。
よって、計算量は、2乗ではなく、2Nですかね。。
間単に、【平均】なんて書いてしまいましたけど、平均のとりかたに、
重みをつけたりすると、微妙に結果がかわります。
そこらへんは、、、まぁ、いろいろ調べてみましょう^^;^^;
その中のひとつに、【ガウスぼかし】なるものがあります。
まぁたいしたものでもないのですが、たまにはSRCを乗せると。。
二重のLOOPを2回まわしてるだけですね。^^;
二重のLOOPを2回まわしてるだけですね。^^;
int minusv = (haba - 1) / 2; for(int yy = 0;yy<hh;yy++){ for(int xx = 0;xx<ww;xx++){ for(int z=0;z<haba;z++){ int idxx = xx + z - minusv; int idxy = yy;// + z - 2; if(getPixelIndex(G,idxx,idxy)){ uc[z] = G.GetPixelsDirect3(idxx,idxy); } } unsigned int ucc = getBock5(uc,haba); GO.SetPixels32(xx,yy,ucc); } } for(int yy = 0;yy<hh;yy++){ for(int xx = 0;xx<ww;xx++){ for(int z=0;z<haba;z++){ int idxx = xx;// + z - 2; int idxy = yy + z - minusv; if(getPixelIndex(GO,idxx,idxy)){ uc[z] = GO.GetPixelsDirect3(idxx,idxy); } } unsigned int ucc = getBock5(uc,haba); G.SetPixels32(xx,yy,ucc); } }
0 件のコメント:
コメントを投稿