How to apply/attach a colormap from an image to another image
Joe Kington
joferkington at gmail.com
Thu Jan 28 16:29:38 EST 2016
<https://lh3.googleusercontent.com/-AqVVJ4kAElE/VqqHMmTuCkI/AAAAAAAAPNk/WGh9UxwHWQk/s1600/figure_1.png>
Hi Folks,
Matteo, I hope it's alright that I'm chiming in.
I was the one Matteo mentioned on the slack group. At first I thought
Matteo was referring to exactly what you described: Take a colormapped
single-band image and unmap/remap the color palette.
However, after farther discussion, it turns out the problem was dealing
with "full" 3-band imagery (i.e. true color). Essentially an image
quantization problem.
For that particular use case, it's easier to use/abuse pre-existing image
quantization methods in PIL or Pillow. Of course, you can also roll your
own, as well:
http://scikit-learn.org/stable/auto_examples/cluster/plot_color_quantization.html
import Image
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
im = Image.open('Jupiter_new_hubble_view_above_pole.png')
imnew = im.convert("P", palette=Image.ADAPTIVE)#, dither=Image.NONE)
data = np.asarray(imnew)
palette = imnew.getpalette()
colors = np.array(palette).reshape(-1, 3) / 255.0
cmap = mcolors.ListedColormap(colors)
fig, axes = plt.subplots(nrows=3, figsize=(8, 15))
axes[0].imshow(im)
for cm, ax in zip(['gray_r', cmap], axes[1:]):
cax = ax.imshow(data, cmap=cm)
fig.colorbar(cax, ax=ax)
fig.tight_layout()
plt.show()
Which produces:
Cheers,
-Joe
On Thursday, January 28, 2016 at 2:57:39 PM UTC-6, Matteo wrote:
>
> Hi Matthias
>
>
>
> AWESOME!!
>
> This is a great example, thank you, it will come handy pretty soon, if you
> are going to share it officially, so I'd love to see the blog post about
> it.
>
> In my current particular case, the problem is that I do not know the
> colormap of the original img to begin with. Someone from a slack group
> suggested to convert it to a paletted image format (PNG or GIF) using PIL,
> then grab the palette shared a solution involving quantization. I asked for
> their permission to share it in here, I'll keep you posted.
>
>
>
>
>
> Back on your example of converting a bad colormap to a good one, I was
> working on adapting a Matlab tool by Peter Kovesi
>
> http://peterkovesi.com/projects/colourmaps/index.html
>
>
> My idea would be to make it into a web app called 'rainbowbot' which would
> automatically detect bad colormaps either form online images or user
> uploaded images, and then provide them with tools to either equalize the
> colormaps or replace with a perceptual version with same hue range, or.....
>
> It is in here
>
> https://github.com/mycarta/rainbowbot
>
> I am open to suggestions, and offers to collaborate.
>
> Matteo
>
> On Thursday, January 28, 2016 at 12:35:44 PM UTC-7, Matthias Bussonnier
> wrote:
>>
>> Well as was planning on writing a blog post about that, but if you ask.
>>
>> I've been playing with converting images from Jet to Viridis, as you can
>> see here:
>>
>> https://gist.github.com/Carreau/7218a6b97fe71f698b0b
>>
>> It's crude, but the basic idea is to use SciPy find the closest point of
>> a colormap from a given pixel.
>> This can be done efficiently using KDTree of scipy (thanks Nathaniel
>> Smith for hint), which give you a 1-255 value,
>> that you can display again using your desired colormap.
>>
>> it of course sample the original colormap,so for a more precise result
>> you might want to interpolate the value using the 2/3 closes points of the
>> cmap, and to avoid extra pixel from the main area to be modified, you might
>> want to use skimage connected component and pick the bigger blob.
>> This woudl avoid artifact in the example I linked to, that you can see on
>> the brush icon in the toolbar (the original brush color is red), and the
>> close/minimize/maximise buttons that are also partially picked up.
>>
>> Is that what you like to do ?
>>
>> --
>> M
>>
>>
>>
>> Le jeudi 28 janvier 2016 08:39:28 UTC-8, Matteo a écrit :
>>>
>>>
>>> I've added a quick example to show where I am at. I would like to
>>> display the second image with the colors of the first one.
>>> Matteo
>>>
>>> On Thursday, January 28, 2016 at 9:14:32 AM UTC-7, Matteo wrote:
>>>>
>>>> Can something like this (which by the way I can't get to work) be done
>>>> using scikit-image?
>>>>
>>>> http://stackoverflow.com/questions/3114925/pil-convert-rgb-image-to-a-specific-8-bit-palette
>>>>
>>>>
>>>> I've done similar things in Matlab before:
>>>>
>>>> https://mycarta.wordpress.com/2012/04/05/visualization-tips-for-geoscientists-matlab-part-ii/
>>>> but I'd really like to be able to do it in Python.
>>>>
>>>>
>>>> What I would like to do currently is:
>>>> 1) Import an RGB image, which would have its own colormap - say this one
>>>> for example:
>>>>
>>>> https://upload.wikimedia.org/wikipedia/commons/b/b3/Jupiter_new_hubble_view_above_pole.png
>>>>
>>>> 2) convert it to intensity, say like this:
>>>>
>>>> intnst = 0.2989 * rgb[:,0] + 0.5870 * rgb[:,1] + 0.1140 * rgb[:,2] # get the intensityintensity = np.rint(intnst) # rounds up to nearest integer
>>>>
>>>>
>>>>
>>>> 3) display the intensity color-mapped to the same colours the original
>>>> RGB had.
>>>>
>>>> Any tips, ideally withrcode or pseudocode would be greatly appreciated.
>>>>
>>>> Thanks,
>>>> Matteo
>>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scikit-image/attachments/20160128/67a55cea/attachment.html>
More information about the scikit-image
mailing list