Introduction: How to CNC a Photograph in Full Color (Relief in CMY)

About: Michael Koehle is the CNC shop assistant at Autodesk Pier 9. His background is in engineering and in art. He combines these to make work using drawing, painting, CNC, 3D printing, and laser cutting.

This instructable documents how to machine a full color photograph by layering and machining different colors of transparent resin. In previous Instructables (here and here), I’ve shown how a black and white image can be made by layering a transparent black layer, of varying thickness, over an opaque white layer. The thickness of the relief determines how much of the white leaks through, creating different shades. This process is similar. First, a white layer of resin is poured and then machined. Then cyan is poured over the white and machined. Then magenta, then yellow. By controlling each layer’s thickness, we can mix a full range of colors, and reproduce an image.

Step 1: The Fundamentals

CMY is a subtractive color model. Its three primary colors – cyan, magenta and yellow – can be mixed to make all possible colors (although in practice, the resulting black is imperfect). Most digital files, however, are saved in RGB color space. But this converts easily to CMY:

CMY = 1 – RGB

For example, say your pixel is orange, with an RGB = [1 .5 0]. Your CMY values would be [0 .5 1], or 100% of yellow and 50% of magenta. If we were to create this color value by layering transparent resins, we would begin with a white base layer, then a magenta layer whose thickness would give us half magenta saturation, and finally a layer of yellow thick enough to achieve full saturation.

Step 2: Model Development

In order to eliminate refractions that can obscure the image, the top surface needs to be flat. This flat is the top of the yellow layer and is at a max thickness Z. Yellow’s bottom surface equals Z-Y’, where Y’ is a nonlinear function of Y in CMY. The relationship of Y' (the depth of the Y layer for a given pixel) to Y (the color value of yellow at a given pixel) is defined by Y'=-log(Y)/A.

A is the attenuation coefficient, and is dependent on the amount of dye added to the resin. Similarly, the top surface of the magenta relief is yellow’s bottom surface, and its bottom surface is Z-Y’-M’, which is the cyan layer’s top surface. Cyan’s bottom surface is Z-Y’-M’-C’, which is white’s top surface.

I wrote code in Octave that would that would create the bottom surface of each layer as an STL file. The layers diagramed match the second image.

Step 3: The Making

In my code, I set each color’s max thickness to be .15 inches. In other words, at .15 inches, each color should be fully saturated. Determining how much dye to add to the resin in order to achieve this took a lot of trial and error, and was dependent on color. The first image is my best result. For vibrant colors, the base white layer should be nearly opaque.

Beginning with white, I mixed, dyed, poured, and then machined each layer, allowing the resin to fully cure before machining. I used a UV resistant resin with a 2 day curing time and Mixol tints for dying the resin. I used Visual Mill to create g-code for a DMS 5-axis CNC. The above images show the resin after each machining step, from cyan, to magenta, and finally yellow.