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

6 ビュー (過去 30 日間)
Brian Katz
Brian Katz 2018 年 8 月 27 日
回答済み: Brian Katz 2020 年 11 月 26 日
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 件のコメント
Brian Katz
Brian Katz 2020 年 11 月 26 日
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 2020 年 11 月 26 日
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

サインインしてコメントする。

採用された回答

Brian Katz
Brian Katz 2020 年 11 月 26 日
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.

その他の回答 (2 件)

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

Image Analyst
Image Analyst 2020 年 11 月 25 日
Try
theImage = getimage(gca);
or else
frame = getframe(gcf)
figure;
imshow(frame.cdata);
axis off
  3 件のコメント
Image Analyst
Image Analyst 2020 年 11 月 25 日
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 2020 年 11 月 26 日
編集済み: Brian Katz 2020 年 11 月 26 日
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.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeInteractive Control and Callbacks についてさらに検索

タグ

製品


リリース

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by