2017-09-19 32 views
0

複合ポートレートモザイク(つまり、他のポートレートで作成されたポートレート)を作成する必要があります。以下の参考文献を参照してください。合成ポートレートモザイクをプログラムで生成する

もう1つの参考資料は、AndreaMosaicです。 http://www.andreaplanet.com/andreamosaic/samples/

またはダウンロードする準備ができていたJPEGファイルを生成し、その後これを行うための最善の方法を探して、このユーチューブチュートリアル(5分マークにスキップ) https://www.youtube.com/watch?v=9cy2gVm_ztQ

。 Node/Javascriptでこれを行うのが理想ですが、PHPなどを使用することができます。

どこから始めたらよいですか?ここにはいくつかの図書館がありますが、私がしようとしているものにはまったく適したものはありません。

enter image description here

+0

[ASCIIアート変換の画像](https://stackoverflow.com/q/32987103/2521214)を参照してください。これは非常によく似た問題です。あなたは単に文字の代わりに画像を持っているだけでなく、モノクロの文字の代わりに色と強度を含む類似点を比較する必要がありますが、ほとんどのものは同じです。 – Spektre

+0

ありがとうございますが、ここでは問題は多少異なると思います。それは私が考える画像処理の問題です。ビデオの最後にあるものと同様の処理を行う方法を探していました。私はリファレンスとして提供しました。 – jcbmb

+0

リンクされた答えは画像処理です。 Fontからの文字でさえ、スプライト画像として扱われます。唯一の違いは、輝度や色をB/Wだけ使用しないことですが、これは係数を計算する方法に過ぎません。だから、あなたは単にそのループの和(または変数のデータ型だけ)を変更します。それはそれです...あなたは、使用するサンプルのテクスチャアトラスを持っていますか?好ましくは単一画像 – Spektre

答えて

0

偽造モザイクは簡単です。さて、私は単純な乗算を試み、ティのように見えます。

  1. 入力画像
  2. の大きさをカバーするフォトテクスチャパターンを作成

    単純な乗算を行いますグレースケールの写真のパターンと元の画像を調節します。

両方のステップを1つにまとめることができます。このため、ここで簡単なC++コード:私はイメージのために自分の絵のクラスを使用し

// globals 
const int txrs=41; // number of textures for mosaic 
picture txr[txrs]; // mosaic textures 
picture pic0,pic1; // input and output images 

// init 
pic0.load("MonaLisa.jpg"); 
int sz=32; // mosaic grid size 
for (int i=0;i<txrs;i++) // load/resize/grayscale textures 
    { 
    txr[i].load(AnsiString().sprintf("textures\\%03i.jpg",i)); // load image 
    txr[i].resize_fit(sz,sz,0x00000000);      // resize to tile size 
    txr[i].enhance_range(); 
    txr[i].pixel_format(_pf_u);         // convert to grayscale <0,765> 
    txr[i].pixel_format(_pf_rgba);        // convert to grayscale RGBA 
    } 
pic0.resize_fit((pic0.xs/sz)*sz,(pic0.ys/sz)*sz,0x00000000); // cut not full tile size part of pic1 

// mosaic 
int xx,yy,x,y,i,j,sz=txr[0].xs,a,b; 
color c0,c1; 
pic1=pic0; // copy source image to destination 
// process all regions 
for (y=0;y<pic1.ys;y+=sz) 
for (x=0;x<pic1.xs;x+=sz) 
    { 
    // select random texture 
    i=Random(txrs); 
    // proces region 
    for (yy=0;yy<sz;yy++) 
    for (xx=0;xx<sz;xx++) 
     { 
     // grayscale texture and original color image pixels 
     c0=txr[i].p[yy][xx]; 
     c1=pic1.p[y+yy][x+xx]; 
     // mutiply them 
     for (j=0;j<3;j++) 
      { 
      a=BYTE(c0.db[j]); 
      b=BYTE(c1.db[j]); 
      a=(a*b)>>8; 
      c0.db[j]=a; 
      } 
     // store to destinatio image 
     pic1.p[y+yy][x+xx]=c0; 
     } 
    } 
pic1.save("out.png"); 

ので、いくつかのメンバーは以下のとおりです。


xs,ysピクセル
p[y][x].ddで画像のサイズをピクセルが(x,y)にされています32ビット整数型としての位置
clear(color)color
resize(xs,ys)新しい解像度
bmpに画像をリサイズ
pfは、画像の実際のピクセルフォーマットを保持GDIビットマップアクセスCanvasで封入VCLある:

enum _pixel_format_enum 
    { 
    _pf_none=0, // undefined 
    _pf_rgba, // 32 bit RGBA 
    _pf_s,  // 32 bit signed int 
    _pf_u,  // 32 bit unsigned int 
    _pf_ss,  // 2x16 bit signed int 
    _pf_uu,  // 2x16 bit unsigned int 
    _pixel_format_enum_end 
    }; 


color画素は次のように符号化される。

union color 
    { 
    DWORD dd; WORD dw[2]; byte db[4]; 
    int i; short int ii[2]; 
    color(){}; color(color& a){ *this=a; }; ~color(){}; color* operator = (const color *a) { dd=a->dd; return this; }; /*color* operator = (const color &a) { ...copy... return this; };*/ 
    }; 


バンドは以下のとおりです。

enum{ 
    _x=0, // dw 
    _y=1, 

    _b=0, // db 
    _g=1, 
    _r=2, 
    _a=3, 

    _v=0, // db 
    _s=1, 
    _h=2, 
    }; 

私が使用した入力画像がこのだった:それはいくつかの明るさの調整が必要になる場合があります

output

:結果

input

そして、ここに元の入力画像のプロパティと一致させる。

+0

。私はJSでそれを得ることができるかどうか見て、参照してください。 – jcbmb

+0

@jcbmb私はピクセル単位で編集しています...私はJSでは画像を結合する方法もあるはずだと思います...そのような場合は、ループの 'xx、yy'を無視して結合/ブレンドを使用します代わりにメソッド。しかし、私はJSでコード化したり、gfx用のAPIを知っていません...色 '(r、g、b)'をグレースケールに変換するには 'i = r + g + b/3; color(i、i、i) 'あなたはバンドのウェイトを使ってバンドを良くすることもできます... – Spektre

関連する問題