偽造モザイクは簡単です。さて、私は単純な乗算を試み、ティのように見えます。
- 入力画像
の大きさをカバーするフォトテクスチャパターンを作成
単純な乗算を行いますグレースケールの写真のパターンと元の画像を調節します。
両方のステップを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,
};
私が使用した入力画像がこのだった:それはいくつかの明るさの調整が必要になる場合があります
:結果
そして、ここに元の入力画像のプロパティと一致させる。
[ASCIIアート変換の画像](https://stackoverflow.com/q/32987103/2521214)を参照してください。これは非常によく似た問題です。あなたは単に文字の代わりに画像を持っているだけでなく、モノクロの文字の代わりに色と強度を含む類似点を比較する必要がありますが、ほとんどのものは同じです。 – Spektre
ありがとうございますが、ここでは問題は多少異なると思います。それは私が考える画像処理の問題です。ビデオの最後にあるものと同様の処理を行う方法を探していました。私はリファレンスとして提供しました。 – jcbmb
リンクされた答えは画像処理です。 Fontからの文字でさえ、スプライト画像として扱われます。唯一の違いは、輝度や色をB/Wだけ使用しないことですが、これは係数を計算する方法に過ぎません。だから、あなたは単にそのループの和(または変数のデータ型だけ)を変更します。それはそれです...あなたは、使用するサンプルのテクスチャアトラスを持っていますか?好ましくは単一画像 – Spektre