Matthew Petroff https://mpetroff.net mpetroff.net Sat, 27 Oct 2018 16:14:11 +0000 en-US hourly 1 Randomly Generating Color Sets with a Minimum Perceptual Distance https://mpetroff.net/2018/10/randomly-generating-color-sets-with-a-minimum-perceptual-distance/ https://mpetroff.net/2018/10/randomly-generating-color-sets-with-a-minimum-perceptual-distance/#respond Sat, 27 Oct 2018 16:14:11 +0000 https://mpetroff.net/?p=2732 Continue reading ]]> Earlier this year, I released a color cycle picker that enforces a minimum perceptual distance between colors, including color vision deficiency simulations, with the goal of creating a better color cycle to replace the “category 10” color palette used by default in Matplotlib, along with other data visualization packages. While the picker works well for what it was designed for—allowing a user to create a color cycle—it requires user intervention to create color sets or cycles.1 The basic technique used—performing color vision deficiency simulations2 for various types of deficiencies and enforcing a minimum perceptual difference for the simulated colors using the CAM02-UCS3 perceptually uniform color space (where each type of deficiency is treated separately) and a minimum lightness distance (for grayscale)—is still valid for the random generation of color sets; it just needs to be extended to randomly sample the color space.


To randomly sample the available RGB color space, I started with the excellent Colorspacious Python library, which is capable of doing the requisite color vision deficiency simulations and perceptual distance calculations. However, it’s too slow for what I wanted to accomplish. Thus, I stripped the library down to the bare essentials and optimized it with the Numba JIT compiler. Since RGB to CAM02-UCS conversions are computationally expensive, but the 16.8 million possible 8-bit RGB colors easily fit in memory, the CAM02-UCS colors are precomputed for every possible color, both for normal color vision and the three types of color vision deficiency. Since very dark and very light colors are poor choices for data visualization, only colors with J \in [40, 90] are used, leaving 13.1 million colors to sample from.

To generate a color set, a starting color is chosen at random. Then, each possible color is check to see if it is far enough away in both lightness and perceptual distance, both for normal color vision and for those with color vision deficiency, at the maximum chosen color vision deficiency severity. Of these remaining colors, one is chosen at random. The process is then repeated until the color set contains the desired number of colors. This method has an advantage over rejection sampling, since it is guaranteed to return and was found to be faster. After the color set is generated, it is checked at intermediate levels of color vision deficiency severity to ensure that the minimum perceptual distance requirement is met there as well; it the distance requirement is not met, the color set is thrown out. Checking a coarse color vision deficiency interval during set generation was tried but removed, since the performance penalty outweighs the gains from having to try again fewer times. With this method in place, it is now possible to randomly generate color sets of various sizes that meets various minimum perceptual distance and minimum lightness distance requirements. However, substantial computational resources required to generate a large number of color sets.

Using this code, I’ve generated six, eight, and ten color sets with what I think are reasonable minimum perceptual and lightness distances, where reasonable means that the colors are easy enough to tell apart while still allowing a reasonably large range of different colors to be used. Full deuteranopia, protanopia, and tritanopia simulations were used. For each configuration, 10 000 random sets were generated on a 28-core machine, a process that took from around nine hours for the six color configuration to around three days for the ten color configuration. The code and generated color sets are available in a repository on GitHub.

While the individual colors in the color sets are easy enough to tell apart, the colors and their combinations are not necessarily aesthetically pleasing. I’m currently working on something to address this shortcoming; details will follow in a subsequent blog post.


  1. A color set doesn’t have a defined order, while a color cycle does. 

  2. G. M. Machado, M. M. Oliveira, and L. A. F. Fernandes, “A Physiologically-based Model for Simulation of Color Vision Deficiency,” in IEEE Transactions on Visualization and Computer Graphics, vol. 15, no. 6, pp. 1291-1298, Nov.-Dec. 2009. doi:10.1109/TVCG.2009.113  

  3. Luo M.R., Li C. (2013) CIECAM02 and Its Recent Developments. In: Fernandez-Maloigne C. (eds) Advanced Color Image Processing and Analysis. Springer, New York, NY. doi:10.1007/978-1-4419-6190-7_2  

]]>
https://mpetroff.net/2018/10/randomly-generating-color-sets-with-a-minimum-perceptual-distance/feed/ 0
3D-Printed Hilbert Curve Absorbers https://mpetroff.net/2018/08/3d-printed-hilbert-curve-absorbers/ https://mpetroff.net/2018/08/3d-printed-hilbert-curve-absorbers/#comments Sat, 11 Aug 2018 22:21:21 +0000 https://mpetroff.net/?p=2674 Continue reading ]]> Fused filament fabrication (FFF) 3D printers are good for many things,1 but production of sharp points is not among those strengths. Thus, the traditional structure of millimeter wave absorbers—a periodic array of square pyramids—is poorly suited for production via FFF printers. Millimeter wave absorbers serve a crucial role in Cosmic Microwave Background (CMB) telescopes by terminating stray light, which is necessary for reducing systematic errors. Not only are the points difficult to produce; they’re also fragile, since a print is generally weakest along its layer lines. Thus, a new geometry was needed, as is detailed in my paper titled A 3D-printed broadband millimeter wave absorber.

Space-filling curves such as the Hilbert curve completely fill the unit square. Furthermore, the Hilbert curve can be described by a sequence of physically realizable geometric approximations. Tracing a wedge along such an approximation creates a geometry with similar optical properties as a pyramidal array but with enhanced mechanical robustness. Importantly, this geometry can be printed without repeatedly starting and stopping extrusion, making it well suited for FFF printers.

Hilbert Curve Absorber (Detail)

Hilbert Curve Absorber

When such a geometry is printed out of a carbon-loaded plastic, it makes a reasonably effective millimeter wave absorber. A prototype was manufactured out of a conductive HIPS filament2 and was measured to have sub-percent reflection in the frequency range 63–215 GHz. Proto-pasta’s off-the-shelf Conductive PLA filament also works to an extent, but it’s too conductive for this use, which results in increased reflection. When printing the bottom layers of the model, aligning the fill lines with the sides of the square instead of on the diagonal seems to make the print less likely to prematurely peel off of the print bed. For the HIPS, using a higher bed temperature for the bottom layer may also help, but if too high a bed temperature is maintained for the rest of the print, the print ends up with some undesirable waviness in the wedge cross section.

The Hilbert curve is not the only space-filling curve that works in this application. The 37a-1 generalized Gosper curve,3 which roughly fills a regular hexagon, was also prototyped, as it can more easily tile the interior of a circle. Various other space-filling curves, such as the Peano curve, could work in some applications, but they may not have a uniform polarization response, an important property of absorbers used in polarization-sensitive CMB instruments.

The code for producing the Hilbert curve geometry was written using CadQuery. The code and resulting solid models are available from DOI:10.5281/zenodo.1322839. See the paper, arXiv:1808.00820, for more details.

37a-1 Gosper Curve Absorber

37a-1 Gosper Curve Absorber (Detail)


  1. A LulzBot TAZ 6, in this case. 

  2. PS-715 from Modern Dispersions, Inc. 

  3. Fukuda, Hiroshi, Michio Shimizu, and Gisaku Nakamura. “New Gosper space filling curves.” In Proceedings of the International Conference on Computer Graphics and Imaging (CGIM2001), vol. 34, p. 34–38. 2001. 

]]>
https://mpetroff.net/2018/08/3d-printed-hilbert-curve-absorbers/feed/ 1
Geysers del Tatio https://mpetroff.net/2018/06/geysers-del-tatio/ https://mpetroff.net/2018/06/geysers-del-tatio/#respond Sat, 30 Jun 2018 20:58:47 +0000 https://mpetroff.net/?p=2659 Continue reading ]]> I recently returned from a couple months working in Chile. While there, I finally made it out to see the El Tatio geyser field, which is the third largest geyser field in the world. The geysers are around an 80 km, hour and a quarter drive north of San Pedro de Atacama and are normally seen just before sunrise. Some photos I took are below.

Geyser Field

Geyser

Geyser Field

Geyser Field

Geyser Field

Geyser Field

]]>
https://mpetroff.net/2018/06/geysers-del-tatio/feed/ 0
Photogrammetry Targets https://mpetroff.net/2018/05/photogrammetry-targets/ https://mpetroff.net/2018/05/photogrammetry-targets/#respond Sat, 26 May 2018 21:53:08 +0000 https://mpetroff.net/?p=2638 Continue reading ]]> The Scanreference photogrammetry system includes 149 magnetic coded targets and PDFs for printing 192 more targets. However, while measuring something that isn’t ferromagnetic, the magnetic targets aren’t particularly helpful, and the 192 printable coded targets aren’t always enough. Unfortunately, AICON wouldn’t provide the full set of printable coded targets when I asked and instead tried to sell me a multi-thousand dollar software package for generating printable coded targets. Instead, I looked in the literature and found multiple references to a 1991 paper1 as the original publication about the ring code targets. Unfortunately, the paper is not available electronically, so I had to request a copy via interlibrary loan; I received a copy just to find out that it didn’t include any technical details on the targets.

Fortunately, further research turned up expired German patent DE19733466A1. The patent contains all of the details needed to generate the ring codes for the coded targets, except for the exact parameters and numbering scheme used for the Scanreference targets. This missing information was fairly straightforward to figure out—the targets are 14-bit with no restrictions on the number of transitions from black segments to white segments and are ordered by increasing binary value. With this information, I was then able to write a script to generate the ring codes and a script to generate a set of printable targets, resulting in a PDF with all 516 targets ready to print on stickers.


  1. Schneider, C. T. “3-D Vermessung von Oberflächen und Bauteilen durch Photogrammetrie und Bildverarbeitung.” Proc. IDENT/VISION 91 (1991): 14-17.  

]]>
https://mpetroff.net/2018/05/photogrammetry-targets/feed/ 0
Color Cycle Picker https://mpetroff.net/2018/03/color-cycle-picker/ https://mpetroff.net/2018/03/color-cycle-picker/#respond Sat, 31 Mar 2018 01:36:29 +0000 https://mpetroff.net/?p=2610 Continue reading ]]> The “category10” color palette, originally developed by Tableau, was adopted as the default color cycle for Matplotlib 2.0 and is also used by default by D3.js and Vega, along with other software packages. While more aesthetically pleasing than the old Matplotlib default, it is unfortunately not colorblind-friendly.1 In an effort to improve this and promote the development of colorblind-friendly color cycles for scientific visualization, I built a color cycle picker that incorporates color vision deficiency simulation and enforces a minimum perceptual distance between colors, for both normal and anomalous trichromats. This is accomplished by performing color vision deficiency simulations2 for various types of deficiencies and enforcing a minimum perceptual difference for the simulated colors using the CAM02-UCS3 perceptually uniform color space (each type of deficiency is treated separately). Additionally, a minimum lightness distance is enforced, for better grayscale printability. The tool allows colors to be picked from a visualization of the CAM02-UCS color gamut and assembled into a color cycle. This visualization is performed using hardware-accelerated WebGL to allow for real-time interactive adjustment of parameters; the resulting palette is also visualized. The minimum perceptual color distance, lightness distance, and color vision deficiency simulation parameters are all adjustable. A hosted copy is provided, and the code is available in a repository on GitHub.

Color Cycle Picker Screenshot


  1. Personally, I have difficulty telling the second and third colors apart.  

  2. G. M. Machado, M. M. Oliveira and L. A. F. Fernandes, “A Physiologically-based Model for Simulation of Color Vision Deficiency,” in IEEE Transactions on Visualization and Computer Graphics, vol. 15, no. 6, pp. 1291-1298, Nov.-Dec. 2009. doi:10.1109/TVCG.2009.113  

  3. Luo M.R., Li C. (2013) CIECAM02 and Its Recent Developments. In: Fernandez-Maloigne C. (eds) Advanced Color Image Processing and Analysis. Springer, New York, NY. doi:10.1007/978-1-4419-6190-7_2  

]]>
https://mpetroff.net/2018/03/color-cycle-picker/feed/ 0