custom colormap with missing colors

2 views (last 30 days)
André
André on 4 Jul 2018
Commented: André on 10 Jul 2018
If I create the following image, with 3 possible values: 1, 2 and 10.
im = zeros(128,128)
im(1:32,:) = 1
im(33:64,:) = 2
im(65:end,:) = 10
ax = imshow(im,[])
%I apply the following colormap:
cmap = [0.9020 0.0980 0.2941
0.2353 0.7059 0.2941
0.8000 0.8000 0.8000]
colormap(ax.Parent,cmap)
I obtain an image with only 2 colors, when the colormap has 3 colors. Why isn't the colormap being respected? I want these specific colors for each value of the image. And I want my colormap to include only these colors, no more and no less. And no, my image does not contain values from 3 to 9. It is just 1, 2 and 10 and it is supposed to be like this.
Any help appreciated
André

Accepted Answer

Stephen23
Stephen23 on 4 Jul 2018
Edited: Stephen23 on 4 Jul 2018
You could:
1. specify the limits, and provide the axes handle when calling colormap:
imshow(im,[1,3]);
colormap(gca,cmap)
2. treat it as an indexed image (note that out-of-range indices are truncated to the end colors):
>> imshow(im,cmap)
3. convert it to a TrueColor (RGB) image:
>> [~,idx] = ismember(im,[1,2,10]);
>> rgb = ind2rgb(idx,cmap);
>> imshow(rgb)
  3 Comments
Stephen23
Stephen23 on 4 Jul 2018
Edited: Stephen23 on 4 Jul 2018
@André: Thank you. You might like to read these:
You can easily specify the patch 'CDataMapping' to be 'direct', in which case the patch CData corresponds one-to-one with the axes colormap, as does the colorbar. Like this:
>> cmap = [0,0,1;0,1,0;1,0,0;0,1,1;1,1,0;1,0,1]; % six ugly colors.
>> X = [0,1,0,1;1,2,1,2;1,2,1,2;0,1,0,1]; % four squares
>> Y = [0,0,1,1;0,0,1,1;1,1,2,2;1,1,2,2]; % four squares
>> patch(X,Y,[1;2;3;6],'FaceColor','flat','CDataMapping','direct')
>> colormap(cmap)
>> colorbar()
>> caxis([0.5,6.5])
Note the third input to patch: you can see how each patch C value corresponds to the colormap row/color. Note how all colormap colors are shown exactly in the colorbar, in the correct order:
A colorbar is just a narrow axes on one side of the figure, so you could easily create this yourself, which gives you complete control over its location, size, tick labels, etc.
André
André on 10 Jul 2018
Exactly what I needed. Thanks a lot.

Sign in to comment.

More Answers (0)

Categories

Find more on Colormaps in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!