現在この質問をフォロー中です
- アクティビティ フィードにアップデートが表示されます。
- 通知基本設定に応じて電子メールを受け取ることができます。
Why figure doesn't render properly? (Opengl painters)
5 ビュー (過去 30 日間)
表示 古いコメント
I was trying to save a uint8 3D RGB matrix into png format with print(), but some pixels showed undesired shades. First try, I was saving a simple magenta rectangle (matrix 300x600x3) and the shades were on the borders: I solved setting the renderer to 'painters' (figures attached)


But when I tried the same on a much larger matrix (945x2556x4355) with more complex plot, even '-painters' does not work

Maybe here is not very clear, but in the original output I just want white and magenta pixels, while you can see here there are a lot of pink and grey shades that (I checked it) are not present in the original matrix and they don't show up when I display the image with imshow(). It's a matter of how Matlab represent the output.
I've read that Matlab can't mantain 'painters' for complex plot and adjust automatically the renderer to Opengl, so I tried to force it with several solutions:
imshow(layer1) % my matrix
s=1
fig=get(groot,'CurrentFigure');
fig.PaperUnits='points';
fig.PaperPosition=[0 0 288 144]; % I need a 600x300 pixel output
fig.Renderer='painters';
fig.RendererMode='manual';
filenamearray=["layer",s];
loopfilename=strjoin(filenamearray,'_');
axis off;
print('-painters','-dpng',loopfilename);
%%% or
print('-painters',loopfilename,"-dpng");
%%% or
print('-vector',loopfilename,"-dpng");
%%% or
print('-zbuffer',loopfilename,"-dpng");
%%% or
saveas(fig,"layer1",'png');
but they work only for the simple rectangle.
Any hint? Thanks in advance
8 件のコメント
Jan
2022 年 10 月 13 日
Did you update the drivers of your graphics card? Which Matlab version are you using? The last version, which supported "ZBuffer" was R2014a.
Simone Cotta Ramusino
2022 年 10 月 13 日
How can I update them and in which way do they affect the output?
I am using R2021B. I tried zbuffer just to try everything, but I am quite sure that the solution must be within 'painters'. I don't know if there are other figure options that can avoid this "antialiasing" effect
Simone Cotta Ramusino
2022 年 10 月 13 日
Ok, I have checked the driver and they are already updated. According to you, can I try something else?
Robert U
2022 年 10 月 14 日
Check, whether you deactivated the default-graphics improvements such as smoothing: https://de.mathworks.com/help/matlab/ref/rendererinfo.html?searchHighlight=painters&s_tid=srchtitle_painters_4
Additionally, I am not sure, whether or not the resolution and dpi values are forced correctly. Have a look here: https://de.mathworks.com/matlabcentral/answers/415952-plot-resolution-and-size?s_tid=srchtitle
Kind regards,
Robert
Simone Cotta Ramusino
2022 年 10 月 14 日
Dear Robert, thanks for your answer. If I check the info with painter renderer, I get no meaningful details of default graphics, while opengl has all the graphics parameters set to 1. But I am not sure that's what I need, on the contrary I think that something like smoothing can be the problem. Anyway, I tried to run it again with opengl and SupportGraphicsSmoothing set to 0 and it still doesn't work properly.
Yes I am quite sure the resolution is set correctly.
Have you ever faced such a problem? I read everywhere and they usually solved it with painters renderer..unfortunately, that's not the case..
Simone Cotta Ramusino
2022 年 10 月 14 日
Do you think it would be more helpful a hardware accelerated (that has already Smoothing set to 0) or software graphics?
Robert U
2022 年 10 月 14 日
Can you provide some data you are working with. Then, it would be possible to reconstruct your problem maybe, and try to fix it.
Kind regards,
Robert
Simone Cotta Ramusino
2022 年 10 月 14 日
brick=zeros(300,600,3,'uint8');
brick(:,:,1)=165;
brick(:,:,2)=35;
brick(:,:,3)=99;
imshow(brick)
loops=100
for index=1:loops
filenamearray=["face",index];
loopfilename=strjoin(filenamearray,'_');
imshow(brick);
fig=get(groot,'CurrentFigure');
fig.PaperUnits='points';
fig.PaperPosition=[0 0 288 144]; %
axis off;
print('-painters',loopfilename,"-dpng");
end
This is how I create the little magenta block (with 'painters' specified I have no shade, as you will see). The second image is obtained in the same way, but, instead of a single whole color, there are two colors assigned randomly to some elements of the matrix and some black background. It would be complex to reproduce the whole code, but you can simply recreate it with randi/rand or just assigning some pixels. Let me know if you achieve anything or not. Your help is aprreciated.
Regards
回答 (2 件)
Robert U
2022 年 10 月 14 日
Hi Simone Cotta Ramusion,
as suspected I could reproduce the smoothing at the edges. Setting smoothing off, eliminates the shaded starting and ending pixels in each line. Even I use the default renderer.
brick=zeros(300,600,3,'uint8');
brick(:,:,1)=165;
brick(:,:,2)=35;
brick(:,:,3)=99;
imshow(brick)
loops=1;
for index=1:loops
filenamearray=["face",index];
loopfilename=strjoin(filenamearray,'_');
imshow(brick);
fig=get(groot,'CurrentFigure');
fig.PaperUnits='points';
fig.PaperPosition=[0 0 288 144]; %
fig.GraphicsSmoothing = 'off';
axis off;
print(loopfilename,"-dpng");
end
16 件のコメント
Simone Cotta Ramusino
2022 年 10 月 14 日
Yeah I know that it can be solved for this little "brick": It is the larger and multicolor matrix that keeps giving troubles, and I have already tried with GraphicsSmoothing='off', with no results. If you cannot reproduce it by yourself I will try to attach something here, but I think you can simply try to print multicolor random pixels on a black background.
Thanks again
Simone Cotta Ramusino
2022 年 10 月 14 日
If you creat the block like this, you can see that there is a minimal pink shade, that does not disappear even with 'painters' o GraphicsSmoothing='off'
brick=zeros(1300,1600,3,'uint8');
brick(:,:,1)=165;
brick(1160:1170,2:500,1)=255;
brick(:,:,2)=35;
brick(1160:1170,2:500,2)=255;
brick(:,:,3)=99;
brick(1160:1170,2:500,3)=255;
imshow(brick)
Simone Cotta Ramusino
2022 年 10 月 15 日
I fixed the code so that it's even more evident the difference between the Matlab visualization (the imshow output) and the saved results (the print output)
brick=zeros(1300,1600,3,'uint8');
colonnebianche=randi(1550,[500,1]);
righebianche=randi(1000,[400,1]);
brick(:,:,1)=165;
brick(righebianche,colonnebianche,1)=255;
brick(:,:,2)=35;
brick(righebianche,colonnebianche,2)=255;
brick(:,:,3)=99;
brick(righebianche,colonnebianche,3)=255;
imshow(brick)
Robert U
2022 年 10 月 17 日
Hi Simone Cotta Ramusino,
I tried to reproduce the problem with your test image. Unfortunately, I do not see any minimal pink shade. Maybe, you can attach a file with the region of interest.
brick=zeros(1300,1600,3,'uint8');
colonnebianche=randi(1550,[500,1]);
righebianche=randi(1000,[400,1]);
brick(:,:,1)=165;
brick(righebianche,colonnebianche,1)=255;
brick(:,:,2)=35;
brick(righebianche,colonnebianche,2)=255;
brick(:,:,3)=99;
brick(righebianche,colonnebianche,3)=255;
loops=1;
for index=1:loops
filenamearray=["face",index];
loopfilename=strjoin(filenamearray,'_');
imshow(brick);
fig=get(groot,'CurrentFigure');
fig.PaperUnits='points';
fig.PaperPosition=[0 0 288 144]; %
fig.GraphicsSmoothing = 'off';
axis off;
print(loopfilename,"-dpng");
end

Kind regards,
Robert
Simone Cotta Ramusino
2022 年 10 月 17 日
Hi Robert,
are you sure there are no pink shades? Because I can almost see them without zooming in on the image. Did you try to save the print output and to open it with, for example, Paint3D and use the color picker? You will see that the white are not really white, but composed of, more or less, pink, red and rose pixels.
This is my (zoomed) Matlab output with imshow:

You can see that the white dots are clearly, purely and only white. Instead, if you consider the (zoomed) image saved with print:

you can see that the white areas are not perfectly white, you can check it with colorpicker.
Please try again magnifing your output and you will see what I am talking about. If not, then probably you have different image rendering settings that I would like to know (I have R2021b version).
Thanks again for your support
Robert U
2022 年 10 月 17 日
Hi Simone Cotta Ramusino,
I attached the saved file which I got with the code posted in the comment above with your example data. I ran it in R2021b.

When magnifying, I cannot see any shades. Looks ok to me.

Kind regards,
Robert
Simone Cotta Ramusino
2022 年 10 月 17 日
Ohh how's that possible? :(
How strange..did you see any particular options in your export settings? I just can't figure it out..because in the first one you posted the shades are visible. Did you change anything else?
Moreover, could you possibily try it even on R2022b version?
Kind regards
Simone Cotta Ramusino
2022 年 10 月 17 日
Ok, don't ask me why, but now, if I reproduce the code without 'painters' option in the print function, it seems ok! I will try on the more complex data and I'll let you know. I don't really get what can be the difference
Robert U
2022 年 10 月 17 日
Hi Simone Cotta Ramusino,
as written above, I only changed the smoothing on and off with that particular line:
fig.GraphicsSmoothing = 'off';
I did not change anything else. I did not use '-painters' renderer in comparison to your initial post.
Unfortunately, I cannot run the example in R2022b. Sorry.
Kind regards,
Robert
Simone Cotta Ramusino
2022 年 10 月 17 日
No way, it keeps giving me error. I found that, for the magenta brick, the solution is not GraphicsSmoothing (which I can remove), but setting: opengl hardware. But I do the same for the other data, it does not work
What is your opengl settings?
Best regards
Robert U
2022 年 10 月 17 日
opengl info
Version: '4.6.0 NVIDIA 472.98'
Vendor: 'NVIDIA Corporation'
Renderer: 'Quadro P2000/PCIe/SSE2'
RendererDriverVersion: '30.0.14.7298'
RendererDriverReleaseDate: '05-Jan-2022'
MaxTextureSize: 32768
Visual: 'Visual 0x09, (RGBA 32 bits (8 8 8 8), Z depth 16 bits, Hardware acceleration, Double buffer, Antialias 8 samples)'
Software: 'false'
HardwareSupportLevel: 'full'
SupportsGraphicsSmoothing: 1
SupportsDepthPeelTransparency: 1
SupportsAlignVertexCenters: 1
Extensions: {394×1 cell}
MaxFrameBufferSize: 32768
Simone Cotta Ramusino
2022 年 10 月 17 日
Same as me, more or less...
Version: '4.6.0 NVIDIA 516.40'
Vendor: 'NVIDIA Corporation'
Renderer: 'NVIDIA RTX A4000/PCIe/SSE2'
MaxTextureSize: 32768
Visual: 'Visual 0x09, (RGBA 32 bits (8 8 8 8), Z depth 16 bits, Hardware acceleration, Double buffer, Antialias 8 samples)'
Software: 'false'
HardwareSupportLevel: 'full'
SupportsGraphicsSmoothing: 1
SupportsDepthPeelTransparency: 1
SupportsAlignVertexCenters: 1
Extensions: {407×1 cell}
MaxFrameBufferSize: 32768
Thank you very much for your help, but it seems that this problem will remain unsolved..
Simone Cotta Ramusino
2022 年 10 月 18 日
Hi Robert, sorry for bothering you again. If you can, would you check if the magenta brick output change if you put:
fig.GraphicsSmoothing="on"
or
opengl software
?
So we can see on what your output depends too. No obligations, obviously.
Thanks again
Best
Simone Cotta Ramusino
2022 年 10 月 19 日
Moreover, if you try to still enlarge the figure, it will give you the same error. You can give it a try
brick=zeros(2300,2600,3,'uint8');
colonnebianche=randi(1550,[1000,1]);
righebianche=randi(1000,[400,1]);
brick(:,:,1)=165;
brick(righebianche,colonnebianche,1)=255;
brick(:,:,2)=35;
brick(righebianche,colonnebianche,2)=255;
brick(:,:,3)=99;
brick(righebianche,colonnebianche,3)=255;
loops=1;
for index=1:loops
filenamearray=["face",index];
loopfilename=strjoin(filenamearray,'_');
imshow(brick);
fig=get(groot,'CurrentFigure');
fig.PaperUnits='points';
fig.PaperPosition=[0 0 288 144]; %
fig.GraphicsSmoothing = 'off';
axis off;
print(loopfilename,"-dpng");
end
Robert U
2022 年 10 月 21 日
Hi Simone Cotta Ramusino,
I found another post here: https://de.mathworks.com/matlabcentral/answers/54750-getting-better-high-resolution-images leading to the website https://matlab.fandom.com/wiki/FAQ#How_do_I_save_my_figure,_axes,_or_image?_I'm_having_trouble_with_the_built_in_MATLAB_functions.
I tried https://github.com/altmany/export_fig but without changing settings I did not succeed to remove the artifacts in the bigger brick export. Maybe, investing more effort is necessary.
Kind regards,
Robert
Simone Cotta Ramusino
2022 年 10 月 21 日
Dear Robert,
thank you very much for your efforts. In the end, I think I will go for 'imwrite', even if it is not what I really wanted at the beginning. There are probably some rendering settings that I could not handle.
Thanks again
Best
参考
カテゴリ
Find more on Graphics Performance 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!エラーが発生しました
ページに変更が加えられたため、アクションを完了できません。ページを再度読み込み、更新された状態を確認してください。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)