{"id":149,"date":"2013-03-16T11:03:39","date_gmt":"2013-03-16T10:03:39","guid":{"rendered":"http:\/\/www.joesfer.com\/?p=149"},"modified":"2015-05-15T20:15:28","modified_gmt":"2015-05-15T19:15:28","slug":"color_stippling","status":"publish","type":"post","link":"https:\/\/www.joesfer.com\/?p=149","title":{"rendered":"Color Stippling"},"content":{"rendered":"<div id=\"attachment_159\" style=\"width: 505px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/130076155940007923_stippling_4096.png\" target=\"_blank\"><img aria-describedby=\"caption-attachment-159\" decoding=\"async\" loading=\"lazy\" class=\" wp-image-159    \" src=\"http:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/ragamalaparna_crop.png\" alt=\"Stippling using a CMYK color basis. Original image from pennlive.com\" width=\"495\" height=\"495\" \/><\/a><p id=\"caption-attachment-159\" class=\"wp-caption-text\">Stippling applying the Hard Disk Sampling method with a CMYK color basis. Original image from <a href=\"http:\/\/blog.pennlive.com\/go\/2012\/02\/ragamala_troupe_to_present_tra.html\" target=\"_blank\">pennlive.com<\/a>. Click for full resolution.<\/p><\/div>\n<p>At the end of writing my post on <a title=\"Stippling and Blue Noise\" href=\"http:\/\/www.joesfer.com\/?p=108\">Stippling and Blue Noise<\/a>, I left it wondering how would this apply if we wanted to use colors. Just to recapitulate, the idea of stippling is to generate a reproduction of an image by <a title=\"Halftoning\" href=\"http:\/\/en.wikipedia.org\/wiki\/Halftone\" target=\"_blank\">halftoning<\/a>, making use of fixed-size points distributed on a plane. The points need to be distributed in a way which is both aesthetically pleasing (for which we place the points carefully in a way which shows <a title=\"Blue Noise\" href=\"http:\/\/en.wikipedia.org\/wiki\/Colors_of_noise#Blue_noise\" target=\"_blank\">Blue Noise<\/a> properties) and be spaced according to the local density of the image. If we use black dots over a white background, this simply means we need to add more dots on the darker areas of the image.<\/p>\n<p>This is all better summarized in this awesome video:<\/p>\n<p><iframe loading=\"lazy\" src=\"https:\/\/player.vimeo.com\/video\/33091687\" width=\"780\" height=\"439\" frameborder=\"0\" title=\"The Making of &quot;Hero&quot;\" webkitallowfullscreen mozallowfullscreen allowfullscreen><\/iframe><\/p>\n<p>It also illustrates very well why we would want to use a computer program to carry out this task \ud83d\ude09<\/p>\n<h1>More than one sample class<\/h1>\n<p>So the principle looks simple enough for black and white. Now, if we want to add color, the first immediate question is: Can we not just do the same for each individual <strong><span style=\"color: #ff0000;\">R<\/span>, <span style=\"color: #339966;\">G<\/span>, <span style=\"color: #3366ff;\">B<\/span><\/strong> or <strong><span style=\"color: #00ffff;\">C<\/span>, <span style=\"color: #ff00ff;\">M<\/span>, <span style=\"color: #c1c100;\">Y<\/span>, K<\/strong> channel? As it turns out, that would more or less work, but it will look <em>worse<\/em> than the black and white image. The reason for it is that combining individual Blue Noise distributions does <strong>not<\/strong> lead to a result with the same propertie. This is easy to reason about by looking at the first row on <strong>Figure 1<\/strong> below: if we place samples carefully by enforcing a minimum distance between each one of them, but do so on a per-class (color) basis, nothing is preventing points belonging to different classes from ending up close to each other. Similarly, as shown in the second row, merging all samples into a single uniform distribution, and then sepparating them again into individual classes will cause noticeable gaps in the individual classes&#8217; distribution.<\/p>\n<p><div id=\"attachment_151\" style=\"width: 500px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/uniformClassesVsUniformResult.png\"><img aria-describedby=\"caption-attachment-151\" decoding=\"async\" loading=\"lazy\" class=\" wp-image-151  \" src=\"http:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/uniformClassesVsUniformResult.png\" alt=\"Top row: Uniform individual classes does not lead to uniform combined result. Bottom row: Uniform result does not lead to uniform individual classes.\" width=\"490\" height=\"323\" srcset=\"https:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/uniformClassesVsUniformResult.png 1013w, https:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/uniformClassesVsUniformResult-300x197.png 300w\" sizes=\"(max-width: 490px) 100vw, 490px\" \/><\/a><p id=\"caption-attachment-151\" class=\"wp-caption-text\"><strong>Figure 1.<\/strong> Top row: Uniform individual classes does not lead to uniform combined result.<br \/>Bottom row: Uniform result does not lead to uniform individual classes.<br \/>Image by [Wei 10], click for a better view.<\/p><\/div>A solution to this is to consider all color channels into a common distribution, but preserve class information while sampling. Li-Yi Wei wrote about this naming the method <strong><em>Multi-Class Blue Noise <\/em><a href=\"http:\/\/research.microsoft.com\/apps\/pubs\/default.aspx?id=12182\">[Wei 10]<\/a><\/strong>. In his paper, Li-Yi discusses two methods of achieving color stippling (or, in general, distribution of N classes of elements in the same space). On the simpler approach called <em>Hard-Disk Sampling<\/em>, which is derived from the original Poisson Sampling or <em>Dart-Throwing<\/em> method <strong><a href=\"http:\/\/www.google.co.uk\/url?sa=t&amp;rct=j&amp;q=cook%2C%20r.%20l.%201986.%20stochastic%20sampling%20in%20computer%20graphics.%20acm%20transactions%20on%20graphics%205%2C%201%2C%2051%E2%80%9372.&amp;source=web&amp;cd=1&amp;ved=0CB8QFjAA&amp;url=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.84.5916%26rep%3Drep1%26type%3Dpdf&amp;ei=b3_BTsOHNsiV8gP9hNzDBA&amp;usg=AFQjCNGattXhiwkd6R5HOwYe6dCxBGZF-A&amp;cad=rja\" target=\"_blank\">[Cook 86]<\/a><\/strong>, we work by extending the acceptance test to check neighbour points of <em>all<\/em> classes. This is done building a symmetrical distance matrix for each pair of classes where the elements on the diagonal correspond to the distance of each class to itself. Note that setting every other element in the conflict check matrix to zero degenerates into regular dart-throwing (first row of <strong>Figure 1<\/strong>). On the other extreme, treating samples as exclusive disks for all classes leads to the bottom row in <strong>Figure 1<\/strong>, where the\u00c2\u00a0 individual classes are not well distributed. The matrix generation method (refer to the paper for details) falls inbetween these two extremes, giving classes a priority according to their relevance on each region, and decreases the conflict radius with less-important classes (allowing for a higher density of these) so that the expected density of the combined result is proportional to the input reference.<\/p>\n<p>Therefore the Hard-Disk Sampling method boils down to an easy extension of the original dart-throwing approach, where we check this carefully-built conflict matrix to decide whether or not to accept each randomly-generated color sample, producing results that sit inbetween the two extreme cases depicted in <strong>Figure 1<\/strong>. This sounds easy-enough to give it a shot with a quick prototype!<\/p>\n<h1>Hard-Disk Sampling implementation<\/h1>\n<div id=\"attachment_158\" style=\"width: 505px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/result1.png\" target=\"_blank\"><img aria-describedby=\"caption-attachment-158\" decoding=\"async\" loading=\"lazy\" class=\" wp-image-158  \" src=\"http:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/result1.png\" alt=\"\" width=\"495\" height=\"202\" srcset=\"https:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/result1.png 2499w, https:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/result1-300x122.png 300w, https:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/result1-1024x419.png 1024w\" sizes=\"(max-width: 495px) 100vw, 495px\" \/><\/a><p id=\"caption-attachment-158\" class=\"wp-caption-text\"><strong>Figure 2. <\/strong>Stippling result using a CMYK color basis with subtractive blending. The source image is &#8220;Portrait of Jack Nicholson&#8221; by Martin Schoeller. Click for full resolution version.<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>The first detail to bear in mind is that the minimum distance values for each class <em>vary<\/em> in space: in our stippling case, each individual pixel of the original image has potentially a different color distribution which translates into different importance for each component of the color basis we choose. The distance matrix for a 2D image will thus be 2N dimensional, where N is the number of point classes we consider.<\/p>\n<p>How to choose the point classes depends on the look we&#8217;re after: we can use for instance Red, Green and Blue and combine them with additive blending over a black background to emulate a screen. Or we could use Cyan, Magenta, Yellow and Black over a white background to emulate print. Any combination will do, but obviously the more classes and the closer their respective colors are to the original image, the better match. I personally find the results of <em>restrictive<\/em> color basis like the two\u00c2\u00a0aforementioned to be more interesting, as they let you better appreciate how the result emerges from the combination of all the individual samples rather than from a perfect match of each individual sample.<\/p>\n<p>The UI in the prototype provided will let you pick a color basis, which has a blending mode associated: (+) for additive, and (-) for subtractive. Then the density for each individual color class is extracted from each pixel on the source image by projecting the original RGB values to the elements of the chosen basis. I&#8217;ve tried different approaches to generate the per-channel densities, and what seems to be working fairly well is to take a projection of each source color into the color basis by doing the dot-product of their resulting vectors in RGB space.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.joesfer.com\/wp-content\/ql-cache\/quicklatex.com-265153dd0ab328632fa038e9798af4c1_l3.png\" class=\"ql-img-inline-formula \" alt=\"&#92;&#109;&#97;&#116;&#104;&#98;&#102;&#123;&#83;&#125;&#32;&#61;&#32;&#091;&#83;&#94;&#82;&#44;&#32;&#83;&#94;&#71;&#44;&#32;&#83;&#94;&#66;&#093;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"128\" style=\"vertical-align: -5px;\"\/> = source pixel<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.joesfer.com\/wp-content\/ql-cache\/quicklatex.com-09f8f8a1100216398f87c1d59f0eb3f5_l3.png\" class=\"ql-img-inline-formula \" alt=\"&#92;&#109;&#97;&#116;&#104;&#98;&#102;&#123;&#67;&#125;&#32;&#61;&#32;&#123;&#32;&#091;&#67;&#95;&#48;&#94;&#82;&#44;&#32;&#67;&#95;&#48;&#94;&#71;&#44;&#32;&#67;&#95;&#48;&#94;&#66;&#093;&#44;&#32;&#091;&#67;&#95;&#49;&#94;&#82;&#44;&#32;&#67;&#95;&#49;&#94;&#71;&#44;&#32;&#67;&#95;&#49;&#94;&#66;&#093;&#44;&#32;&#46;&#46;&#46;&#44;&#32;&#091;&#67;&#95;&#123;&#78;&#45;&#49;&#125;&#94;&#82;&#44;&#32;&#67;&#95;&#123;&#78;&#45;&#49;&#125;&#94;&#71;&#44;&#32;&#67;&#95;&#123;&#78;&#45;&#49;&#125;&#94;&#66;&#093;&#32;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"21\" width=\"434\" style=\"vertical-align: -6px;\"\/> = desired N-class color basis<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.joesfer.com\/wp-content\/ql-cache\/quicklatex.com-00f6da719d9bee6e68eea964498456e0_l3.png\" class=\"ql-img-inline-formula \" alt=\"&#92;&#109;&#97;&#116;&#104;&#98;&#102;&#123;&#68;&#95;&#83;&#125;&#32;&#61;&#32;&#091;&#32;&#68;&#95;&#48;&#44;&#32;&#68;&#95;&#49;&#44;&#32;&#46;&#46;&#46;&#44;&#32;&#68;&#95;&#123;&#110;&#45;&#49;&#125;&#32;&#093;\" title=\"Rendered by QuickLaTeX.com\" height=\"18\" width=\"181\" style=\"vertical-align: -5px;\"\/> = densites for <img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.joesfer.com\/wp-content\/ql-cache\/quicklatex.com-e2e3ca05df769ab46780b3f23e81212e_l3.png\" class=\"ql-img-inline-formula \" alt=\"&#92;&#109;&#97;&#116;&#104;&#98;&#102;&#123;&#83;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"10\" style=\"vertical-align: 0px;\"\/>, where:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.joesfer.com\/wp-content\/ql-cache\/quicklatex.com-8427a87ab67b08b32c145052ce837417_l3.png\" class=\"ql-img-inline-formula \" alt=\"&#80;&#32;&#61;&#32;&#92;&#109;&#97;&#116;&#104;&#98;&#102;&#123;&#83;&#125;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#92;&#109;&#97;&#116;&#104;&#98;&#102;&#123;&#67;&#95;&#105;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"15\" width=\"81\" style=\"vertical-align: -3px;\"\/> is the projection of the input sample into the i-th color basis vector.<br \/>\n<img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.joesfer.com\/wp-content\/ql-cache\/quicklatex.com-1b0f0bf5bd5ceb8a4b1225937fb97f8b_l3.png\" class=\"ql-img-inline-formula \" alt=\"&#68;&#95;&#105;&#32;&#61;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#80;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"22\" width=\"57\" style=\"vertical-align: -6px;\"\/> for additive basis, and<br \/>\n<img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.joesfer.com\/wp-content\/ql-cache\/quicklatex.com-4679e666d8c36452907e5c2c5e3a17c3_l3.png\" class=\"ql-img-inline-formula \" alt=\"&#68;&#95;&#105;&#32;&#61;&#32;&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#49;&#45;&#80;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"23\" width=\"75\" style=\"vertical-align: -7px;\"\/> for subtractive basis<\/p>\n<p>Note this is a non-linear response to intensity, which I found to work a bit better than the linear one.<span style=\"color: #ff0000;\"><br \/>\n<\/span><\/p>\n<pre><code><code><p class=\"ql-center-picture\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.joesfer.com\/wp-content\/ql-cache\/quicklatex.com-c373393ccf41af0ca4cb0225fa880233_l3.png\" height=\"256\" width=\"348\" class=\"ql-img-picture \" alt=\"Rendered by QuickLaTeX.com\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/code>\r\n<\/code><\/code><\/pre>\n<p>Going back to the sampling issue shown in <strong>Figure 1<\/strong>, I was wondering: if for our particular case of stippling where we are interested in the combined result and not so much in the individual color channels, could we not get away with the simpler method of a uniform combined result, as shown in the second row, despite of the less uniform distribution of the individual color pigments?<\/p>\n<p>To test that out it was easy to simplify the algorithm to calculate the distance matrix based solely on the brightness of the input pixels, disregarding class information. Then, when once a random sample had been accepted based exclusively on the spatial density, its class is chosen randomly from the available color basis according to a probability distribution matching the underlying pixel color.<\/p>\n<div id=\"attachment_161\" style=\"width: 505px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/uniformComparison.png\" target=\"_blank\"><img aria-describedby=\"caption-attachment-161\" decoding=\"async\" loading=\"lazy\" class=\" wp-image-161 \" src=\"http:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/uniformComparison.png\" alt=\"Comparison between single class uniform distribution (left) taking only distances between samples into account, and hard disk sampling (right) producing a uniform distribution both per class and on the combined result. Note how the sharp edges around the eyes are defined similarly, but the results differ in the smooth areas.\" width=\"495\" height=\"834\" srcset=\"https:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/uniformComparison.png 1024w, https:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/uniformComparison-607x1024.png 607w\" sizes=\"(max-width: 495px) 100vw, 495px\" \/><\/a><p id=\"caption-attachment-161\" class=\"wp-caption-text\"><strong>Figure 3.<\/strong> Comparison between single class uniform distribution (left) taking only distances between samples into account, and hard disk sampling (right) producing a uniform distribution both per class and on the combined result. Note how the sharp edges around the eyes are defined similarly, but the results differ in the smooth areas. Click for a larger view.<\/p><\/div>\n<p>With this test I was expecting to still get the good spatial distribution of a single-class dart throwing, and an on-average correct color: each individual sample would be off, but on average the sum of the samples should more or less match the tone of the underlying region. <strong>Figure 3<\/strong> shows the comparison between the two methods, which differ much more than I was expecting. Truth is that in high-frequency regions the adaptive sampling predominates over the more even distribution of the former method &#8211; the difference is more evident in the smoother gradients on the image such as the clothing, where you can see that my naive simplification tends to produce noisier results. Having a uniform distribution for the combined result helps achieving good gradients of density, and having good per-class distribution produces more uniform, smoother tones, with less color clumps.<\/p>\n<h2>Retries<\/h2>\n<p>An interesting aspect of the Hard Disk Sampling method as proposed in Wei&#8217;s paper is that at the core of it, we still rely on random sampling to place points in the image. This is very fast at the beginning but once the image starts to fill up, it becomes increasingly unlikely for a sample to be accepted. More so, since for a given position on the image, we&#8217;ve prioritized the classes (the densities of each class), it may be extremely hard to place samples of faint tones in the image by just random chance. Recall from the <a title=\"Stippling and Blue Noise\" href=\"http:\/\/www.joesfer.com\/?p=108\">original stippling post<\/a> that this is the reason why Dart-throwing is so easy to implement, but also so slow for most practical uses.<\/p>\n<div id=\"attachment_157\" style=\"width: 510px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/restart.png\"><img aria-describedby=\"caption-attachment-157\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-157\" src=\"http:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/restart.png\" alt=\"A blue sample couldn't find a suitable place in the image by random chance, so it is 'forced' by removing much more likely green samples which will be reintroduced eventually.\" width=\"500\" height=\"432\" srcset=\"https:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/restart.png 500w, https:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/restart-300x259.png 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/a><p id=\"caption-attachment-157\" class=\"wp-caption-text\"><strong>Figure 4:<\/strong> A blue sample couldn&#8217;t find a suitable place in the image by random chance, so it is &#8216;forced&#8217; by removing much more likely green samples which will be reintroduced eventually.<\/p><\/div>\n<p>There are ways to be smarter about the way we place samples (other than rely on random chance), but the alternative method proposed in the paper is to <em>discard<\/em> existing samples after we&#8217;ve given up trying to place a new one. This is simple and ingenuous: we can think of this as having samples that settle down int he image, and from time to time we need to &#8220;shake&#8221; portions of the image to dust them off and allow room for improbable samples to settle. More rigurously though \ud83d\ude42 what we do is rely on the fact that the &#8220;probable&#8221; samples we remove to make room have a better chance to settle on the final image again, and the result will converge faster than if we expect the unlikely samples to find a suitable spot by randomness alone. This also leads to a better color rendition with less noise as you can see in <strong>Figure 3<\/strong>.<\/p>\n<h1>Downloads<\/h1>\n<p>I wrote a small prototype application which does color stippling of an input image using the Hard Disk Sampling method described in this post. It will generate both images and XML data files which should be easy to parse and render with other applications.<\/p>\n<p>The code is written in C# and is available as usual on GitHub at: <a href=\"https:\/\/github.com\/joesfer\/ColorStippling\" target=\"_blank\">https:\/\/github.com\/joesfer\/ColorStippling<\/a><br \/>\nAnd you can also download the precompiled binaries directly from <a href=\"http:\/\/joesfer.com\/wp-content\/uploads\/programming\/C\/ColorStipplingBinaries.zip\" target=\"_blank\">here<\/a>.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/screenshot.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter  wp-image-160\" src=\"http:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/screenshot.jpg\" alt=\"screenshot\" width=\"731\" height=\"471\" srcset=\"https:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/screenshot.jpg 1219w, https:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/screenshot-300x193.jpg 300w, https:\/\/www.joesfer.com\/wp-content\/uploads\/2013\/03\/screenshot-1024x659.jpg 1024w\" sizes=\"(max-width: 731px) 100vw, 731px\" \/><\/a><\/p>\n<h1>References<\/h1>\n<p><a href=\"http:\/\/research.microsoft.com\/apps\/pubs\/default.aspx?id=12182\"><strong>[Wei 10]<\/strong><\/a> Li-Yi Wei. 2010. <em>Multi-Class Blue Noise Sampling<\/em>. Siggraph.<\/p>\n<p><a href=\"http:\/\/www.google.co.uk\/url?sa=t&amp;rct=j&amp;q=cook%2C%20r.%20l.%201986.%20stochastic%20sampling%20in%20computer%20graphics.%20acm%20transactions%20on%20graphics%205%2C%201%2C%2051%E2%80%9372.&amp;source=web&amp;cd=1&amp;ved=0CB8QFjAA&amp;url=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.84.5916%26rep%3Drep1%26type%3Dpdf&amp;ei=b3_BTsOHNsiV8gP9hNzDBA&amp;usg=AFQjCNGattXhiwkd6R5HOwYe6dCxBGZF-A&amp;cad=rja\" target=\"_blank\"><strong>[Cook 86]<\/strong><\/a>\u00c2\u00a0 Cook, R. L. 1986. <em>Stochastic sampling in computer graphics.<\/em> ACM Transactions on Graphics 5, 1, 51\u00e2\u20ac\u201c72.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>At the end of writing my post on Stippling and Blue Noise, I left it wondering how would this apply if we wanted to use colors. Just to recapitulate, the idea of stippling is to generate a reproduction of an image by halftoning, making use of fixed-size points distributed on a plane. The points need <a class=\"more-link\" href=\"https:\/\/www.joesfer.com\/?p=149\">Read More &#8230;<\/a><\/p>\n","protected":false},"author":1,"featured_media":159,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[34,17,51,52,50,38,30,37],"_links":{"self":[{"href":"https:\/\/www.joesfer.com\/index.php?rest_route=\/wp\/v2\/posts\/149"}],"collection":[{"href":"https:\/\/www.joesfer.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.joesfer.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.joesfer.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.joesfer.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=149"}],"version-history":[{"count":0,"href":"https:\/\/www.joesfer.com\/index.php?rest_route=\/wp\/v2\/posts\/149\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.joesfer.com\/index.php?rest_route=\/wp\/v2\/media\/159"}],"wp:attachment":[{"href":"https:\/\/www.joesfer.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.joesfer.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.joesfer.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}