uiimage introduces artifacts? How to fix?
5 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I am building an application using App Designer and I am using images (Type = 'uiimage') and using the ImageSource property to display data. I am seeing artifacts on the GUI that are not in my data.
I can also produce the same behavior with a plain uiimage from the console.
img = ones(160, 160, 3, 'uint8') * 128;
img([48, 65], 1:4:end, :) = 0;
img([48, 65], 2:4:end, :) = 0;
fig = uifigure;
im = uiimage(fig);
im.ImageSource = img;
im.Position = [ 100, 100, 160, 160];
im.ScaleMethod = 'none';
The result from this is shown here:
Looking closely at the dashed lines shows the artifacts:
These look to me like jpeg artifacts. I am using ScaleMethod 'none' to try to rule out any resampling effects. In my application I am using a fixed size image that exactly matches the data size so it should not be performing scaling.
One of the purposes of my application is for users to closely scrutinize an image to look for artifacts in the underlying data, so it is important that the MxNx3 uint8 array is faithfully produced on the screen.
A "regular" figure with imshow does not show artifacts:
fig2 = figure;
imshow(img);
What's the best way to show the image in my application without artifacts?
3 commentaires
Réponse acceptée
Nitin Kapgate
le 10 Fév 2021
Modifié(e) : Nitin Kapgate
le 10 Fév 2021
Thank you @Jamie for bringing the issue of artifacts in the uifigure + uiimage workflow to my attention.
After revisiting the issue again, I could see artifacts being displayed when the image is displayed using the uifigure + uiimage workflow.
I have brought this issue to the concerned people and the issue might be resolved in future releases.
2 commentaires
Nitin Kapgate
le 11 Fév 2021
As a workaround, you can serve cdata as file:
imwrite(img, 'imgFile.png');
im.ImageSource = 'imgFile.png'
Plus de réponses (1)
DGM
le 26 Juin 2024
Interesting that this had already been reported before I reported it as a bug.
The reason for these artifacts is simple. Whenever uiimage() is given a filename, it reads the image using imread(). That means that it can read a broad range of filetypes and it can support indexed images and alpha content.
The other way to use uiimage() is to feed it image data from the workspace. In this case, it takes your image, writes it to disk as a low-quality 4:2:0 subsampled JPG, then it reads it back using imread(). Not only is the image unnecessarily damaged, the fact that it uses JPG means that it can't actually display indexed or transparent images.
This thread is where I first figured this out. The followup comments describe the problem, I give some demonstrations, and demonstrate a workaround.
As to whether this constitutes a bug, I'll reiterate what I said in the bug report. Are heavily lossy image facsimiles acceptable for display purposes? No. Not when the purpose of the displayed image is to monitor a technical image editing process and examine its details and exact pixel values. If Photoshop or GIMP or MSPaint wouldn't do it, then a technical environment like MATLAB shouldn't. The fact that it's trivial to modify the support files to use PNG for the temp file is enough for me to assert that there's no justification for the damage done to the working image. That's a bug.
The question remains whether there's any justification for using any tempfile. Even if there is, PNG would allow uiimage() to support transparency and indexed images from the workspace -- but since everything was written around using garbage JPG, there isn't any in place to handle the required extra arguments. I'm doubtful that a tempfile can't be avoided.
2 commentaires
DGM
le 26 Juin 2024
Oh wow. I hadn't even given speed a consideration, but yeah. That would be a great way to slow things down. I would suspect that the tempfile directory is on ramdisk, but maybe they aren't always. Either way, I don't see any reason for all the overhead of encoding/decoding.
Voir également
Catégories
En savoir plus sur Migrate GUIDE Apps dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!