# Extract all unique values from a RGB raster

I have a .png file in RGB format showing the intensity of ship traffic:

For my analysis I need to convert it to a one-band raster with values between 0 and 1 where 0 means lowest density and 1 means highest density. When I click on a raster cell the value is for example (0, 109, 146) or (0, 77, 178) or (255, 255, 255). Knowing that the .png file uses a blue-yellow-green-red color ramp, is there a way to automatically convert it to the grayscale raster with values ranging from 0 to 1?

I thought about the folowing solution:

1. I extract all unique colors from the image
2. I assign a numeric value to each color and create a color - value lookup table
3. For each raster cell, I check the color and set the cell value to the corresponding value from the lookup table

Now, my question: How do I extract all the unique colors from the image?

I need to use open-source software like QGIS or R.

• Does the image come with a legend? That would help immensely, for otherwise you results will merely be a relative rank rather than a genuinely quantitative assessment of the underlying data. – whuber Oct 24 '14 at 15:36

This does not probably work generally but it should give a correct result in your case.

I captured your image above and saved it as "pngtest.png". I checked that it is a RGB png file with alpha channel. However, because it looks like a classified image I decided to try what happens if I convert it into a paletted tiff with GDAL tool rgb2pct.py http://gdal.org/rgb2pct.html

``````python rgb2pct.py pngtest.png palettetest.png
``````

Then I checked what I get with gdalinfo. Colours 0-91 should be the distinct RGB values of your image, all the rest are 0,0,0,255.

``````gdalinfo palettetest.png
Driver: GTiff/GeoTIFF
Files: palettetest.png
Size is 1036, 731
Coordinate System is `'
INTERLEAVE=BAND
Corner Coordinates:
Upper Left  (    0.0,    0.0)
Lower Left  (    0.0,  731.0)
Upper Right ( 1036.0,    0.0)
Lower Right ( 1036.0,  731.0)
Center      (  518.0,  365.5)
Band 1 Block=1036x7 Type=Byte, ColorInterp=Palette
Color Table (RGB with 256 entries)
0: 48,48,48,255
1: 104,104,104,255
2: 40,40,40,255
3: 96,96,96,255
4: 144,144,144,255
5: 64,64,64,255
6: 16,16,16,255
7: 200,200,200,255
8: 136,136,136,255
9: 56,56,56,255
10: 8,8,8,255
11: 0,0,0,255
12: 216,216,216,255
13: 32,32,32,255
14: 248,40,0,255
15: 24,24,24,255
16: 176,176,176,255
17: 248,8,0,255
18: 168,168,168,255
19: 248,88,0,255
20: 248,32,0,255
21: 248,112,0,255
22: 248,136,0,255
23: 248,56,0,255
24: 248,24,0,255
25: 248,80,0,255
26: 248,176,0,255
27: 248,104,0,255
28: 248,152,0,255
29: 248,128,0,255
30: 248,72,0,255
31: 248,208,0,255
32: 248,168,0,255
33: 248,16,0,255
34: 248,200,0,255
35: 248,64,0,255
36: 248,232,0,255
37: 216,248,0,255
38: 248,120,0,255
39: 248,160,0,255
40: 232,248,0,255
41: 248,192,0,255
42: 184,248,0,255
43: 248,224,0,255
44: 248,48,0,255
45: 200,248,0,255
46: 232,232,232,255
47: 176,248,0,255
48: 152,248,0,255
49: 224,248,0,255
50: 248,144,0,255
51: 248,216,0,255
52: 120,248,0,255
53: 144,248,0,255
54: 104,248,0,255
55: 168,248,0,255
56: 208,248,0,255
57: 136,248,0,255
58: 248,0,0,255
59: 72,248,0,255
60: 248,184,0,255
61: 96,248,0,255
62: 48,248,0,255
63: 128,248,0,255
64: 88,248,0,255
65: 192,248,0,255
66: 248,96,0,255
67: 8,248,0,255
68: 40,248,0,255
69: 80,248,0,255
70: 0,240,8,255
71: 32,248,0,255
72: 160,248,0,255
73: 0,232,16,255
74: 24,248,0,255
75: 112,248,0,255
76: 0,216,32,255
77: 0,168,80,255
78: 0,200,48,255
79: 64,248,0,255
80: 240,248,0,255
81: 112,112,112,255
82: 0,128,120,255
83: 0,184,64,255
84: 0,152,96,255
85: 0,104,144,255
86: 0,248,0,255
87: 0,72,176,255
88: 248,248,0,255
89: 248,240,0,255
90: 240,240,240,255
91: 248,248,248,255
92: 0,0,0,255
93: 0,0,0,255
``````
• This brings me closer to the solution. When I filter out the "gray" (R=G=B) colors from the color table, I notice that the red colors are near the beginning and blue colors are towards the end. Now, I must find a way how to order the colors in the color table according to the color ramp. I think that the image uses the same color ramp as in: stackoverflow.com/questions/7706339/… – jirikadlec2 Oct 24 '14 at 16:58