Difference Map Generative Art

Target Image

In[]:=
Show[Image[obama=ImageData@ColorConvert[ImageResize[ImageCrop[ImageCrop[Import["https://upload.wikimedia.org/wikipedia/en/5/55/Barack_Obama_Hope_poster.jpg"],{225,235},Bottom],{225,225},Top],16],"Grayscale"]],ImageSize->300]
Out[]=
In[]:=
GraphicsRowMapThreadShow[createPict[#1,Last@#2],ImageSize300]&,
tileDataWang
,
tileDataDark
,
tileDataSmith
,
wang-tiles_obama16x16_rr25_blocked-array
,
dark-tiles_obama30x30_rr05_blocked-array
,
smith-tiles_obama30x30_rr05_blocked-array
,​​ImageSize->900
Out[]=

Wang Tiles

In[]:=
tileDataWang=mkWangTiles[GrayLevel/@Subdivide[3]];​​tileValuesWang=First/@ColorConvert[tileDataWang["tileColorValue"],"Grayscale"];​​tileDataWang["allTilesImg"][[;;32]]
Out[]=

,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,

In[]:=
(*linearProgrammingSolutionWang=partitionSolve[tileDataWang,Image[obama],30];​​Show[createPict[tileDataWang,linearProgrammingSolutionWang],ImageSize300]*)
In[]:=
arrayWang=ConstantArray[N[RandomReal[{0,1},Append[Dimensions[obama],Length[tileDataWang["allTilesImg"]]]]],3];​​bestTilingErrorWang=100.;​​arrayToKeepWang={blockProjection[arrayWang//Mean].Range[Length[tileDataWang["allTilesImg"]]]};
In[]:=
Do[​​​​arrayWang=differenceMapIteration[0.25][tileDataWang["topologyH"],tileDataWang["topologyV"],obama][0.125,tileValuesWang][arrayWang];​​meanArrayWang=arrayWang//Mean;​​​​horizontalCostWang=horizontalTilingCost[tileDataWang][meanArrayWang]*100;​​verticalCostWang=verticalTilingCost[tileDataWang][meanArrayWang]*100;​​pixelValuesCostWang=pixelCost[obama,tileValuesWang][meanArrayWang]*100;​​​​If[​​Mean[{horizontalCostWang,verticalCostWang}]<=bestTilingErrorWang,​​bestTilingErrorWang=Mean[{horizontalCostWang,verticalCostWang}];​​bestArrayWang=meanArrayWang​​];​​​​If[Mod[i,20]==0,​​AppendTo[arrayToKeepWang,blockProjection[meanArrayWang].Range[Length[tileDataWang["allTilesImg"]]]]];​​​​errorWang=StringTemplate["Best Tiling Cost: `1` %Iteration `2`:-- Current Horizontal Tiling Cost: `3` %-- Current Vertical Tiling Cost: `4` %-- Current Pixel Values Cost: `5` %"][bestTilingErrorWang,i,horizontalCostWang,verticalCostWang,pixelValuesCostWang];​​,{i,100000}​​]
Out[]=
$Aborted
In[]:=
Dynamic[errorWang]
In[]:=
Show[createPict[tileDataWang,arrayToKeepWang[[-1]]],ImageSize300]
In[]:=
arrayToKeepWang=Import["wang-tiles_obama16x16_rrr05.mx"];
In[]:=
Export["wang-tiles_obama16x16_rrr05.mx",arrayToKeepWang]
Out[]=
wang-tiles_obama16x16_rrr05.mx
In[]:=
framesWang=Show[createPict[tileDataWang,#],ImageSize300]&/@arrayToKeepWang;
In[]:=
Export["wang-tiles_obama16x16_rrr05.gif",framesWang]
Out[]=
wang-tiles_obama16x16_rrr05.gif
In[]:=
Iconize[arrayWang,"wang-tiles_obama16x16_rrr05_final-array"]
Out[]=
wang-tiles_obama16x16_rrr05_final-array

Dark Tiles

In[]:=
{darkCol,backgroundCol,lightCol}={Black,Gray,White};​​tileDataGrayscale=mkDarkTiles[backgroundCol,{darkCol,lightCol}];​​tileValuesGrayscale=First/@ColorConvert[tileDataGrayscale["tileColorValue"],"Grayscale"];​​tileDataGrayscale["allTilesImg"]
Out[]=

,
,
,
,
,
,
,
,
,
,
,
,
,
,
,

In[]:=
linearProgrammingSolution=partitionSolve[tileDataGrayscale,Image[obama],30];​​Show[createPict[tileDataGrayscale,linearProgrammingSolution],ImageSize300]
Out[]=

Smith Tiles

Tiling Initialization Functions

Projection Initialization Functions