MATLAB Answers

Output of -RGBimage seems to have changed, any help?

10 views (last 30 days)
Brian Katz
Brian Katz on 27 Aug 2018
Answered: Brian Katz on 26 Nov 2020
I have worked on a function (applyhatch_plusC) which has been on the file exchange now for 15years. Recently, the functionality fails.
What seems to be the issue is the print(gcf,'-RGBimage') does not behave as before, and appears to be doing some internal dithering that I can't seem to turn off. In previous MatLab versions, even back to <2011 with the funtion hardcopy, an RGB copy of a figure (say, containing a red, green, and blue object) would output a cdata matrix of the image, with 5 unique colores (rgb and b&w). I do the same thing now, on the same image, and I get a whole slew of shades, maybe occuring on a few dozen pixels only.
Now, as my work exploits the unique colors to convert 1 color to soemthing else, this no longer works. hardcopy no longe exists, and I don't see how to get print(gcf,'-RGBimage') to accept options. I would like to avoid passing through a temp file, as this requires write access and isn't very elegant.
This is rather frustrating, as this undocumented MatLab change ruins a nice little function that's been download thousands of times...

  9 Comments

Show 6 older comments
Brian Katz
Brian Katz on 26 Nov 2020
This reduced the amount of dithering, but did not toally eliminate it. Here is an example, where you can see the assumed black, blue, and white, but also 2 gray shades being produced (ie some smoothing still occuring):
>> bar(rand(1,3)); % create simple 1 color bar graph
>> set(gcf,'GraphicsSmoothing','off')
>> fr = getframe(gca);
>> getf_r = fr.cdata(:,:,1);getf_g = fr.cdata(:,:,2);getf_b = fr.cdata(:,:,3);getf_rgb = [getf_r(:) getf_g(:) getf_b(:)];
>> [uniqueEntries,numberOfOccurences] = countEntries(getf_rgb,true)
uniqueEntries =
5×3 uint8 matrix
0 0 0
0 0 255
38 38 38
240 240 240
255 255 255
numberOfOccurences =
2099
72531
1623
1
73386
Walter Roberson
Walter Roberson on 26 Nov 2020
Try the below both with graphics smoothing on and off.
The [38 38 38] you are seeing is due to the default XColor and YColor for the tick marks and text.
Your countEntries appears to be from a file exchange submission https://www.mathworks.com/matlabcentral/fileexchange/23661-violin-plots-for-plotting-multiple-distributions-distributionplot-m so I substituted standard code for that part.
fig = gcf;
ax = axes(fig);
bar(ax, rand(1,3)); % create simple 1 color bar graph
%set(fig,'GraphicsSmoothing','off')
ax.XColor = [0 0 0];
ax.YColor = [0 0 0];
fr = getframe(ax);
getf_r = fr.cdata(:,:,1);getf_g = fr.cdata(:,:,2);getf_b = fr.cdata(:,:,3);getf_rgb = [getf_r(:) getf_g(:) getf_b(:)];
[uniqueEntries,~,G] = unique(getf_rgb,'rows');
numberOfOccurences = accumarray(G, 1);
uniqueEntries
uniqueEntries = 3×3
0 0 0 0 114 189 255 255 255
numberOfOccurences
numberOfOccurences = 3×1
2319 47846 111103

Sign in to comment.

Accepted Answer

Brian Katz
Brian Katz on 26 Nov 2020
Looking more closely, it appears that the no smoothing option (when also applied to the axis Font) works pretty well. I have tested it in combination with print('-RGBImage').
In doing so, I also discovered that the default color for axis text and box is not BLACK, but [0.15 0.15 0.15]. Setting these object properties (XColor,YColor,GridColor,...) finally resolves the whole problem.
Thank you to all for chiming in. I will update by FileExchange submission soon to reflect all this.

  0 Comments

Sign in to comment.

More Answers (2)

Image Analyst
Image Analyst on 18 Sep 2019
Maybe try the attached MaximizeFigureWindow function first, and then call either saveas(), imwrite(), or (on the File Exchange) export_fig

  0 Comments

Sign in to comment.


Image Analyst
Image Analyst on 25 Nov 2020
Try
theImage = getimage(gca);
or else
frame = getframe(gcf)
figure;
imshow(frame.cdata);
axis off

  3 Comments

Brian Katz
Brian Katz on 25 Nov 2020
Looking at the results of this function, the image is still dithered and not the original image. Looking at the exmaple of a single color bar graph, the present colors are blue, white, and black. However, using getimage produces an image with 9 colors, being interpolated colors at/near borders between colors:
uniqueEntries =
9×3 uint8 matrix
0 0 0
0 0 255
19 19 146
38 38 38
64 64 64
92 92 92
146 146 146
240 240 240
255 255 255
numberOfOccurences =
1240
39222
3
1618
6
4
21
343
106748
The older function did not do this, but actually created a "true" bitmap of the data, not an interpolated/dithered image.
Can you apply getimage, or an equivalent, without dithering?
Image Analyst
Image Analyst on 25 Nov 2020
Can you give a small example with an actual RGB image that you synthesize? Be aware that if you use something like plot() over the image, it will antialias the line so that line won't be that one single color that you drew it in.
Brian Katz
Brian Katz on 26 Nov 2020
Please see my original post for a very simple example using BAR.
What I am looking for is a replacement of the behaviour of the now defunct "hardcopy" function which would create a BMP version of a figure, without dithering/antialias processing, at a desired DPI (so not even a screendump).
For image processing of the figure, to replace colored regions as in the function I wrote, this is no longer possible because the number of colors is both incorrect and unpredictable.

Sign in to comment.

Tags

Products


Release

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by