Image quality loss when importing?
15 次查看(过去 30 天)
显示 更早的评论
I'm having an issue with importing an image to MatLab.
The image when opened in photos looks like this:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1220472/image.png)
However after running this code:
imagefile = "MRI-brain-tumor-image.png";
I = imread(imagefile);
imshow(I)
The figue from MatLab looks like this:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1220477/image.png)
These are the first lines of code in this script, so I must be using imread or imshow wrong, but looking through their descriptions on mathworks I can't find my error.
Thanks in advance!
2 个评论
Image Analyst
2022-12-6
Please attach 'MRI-brain-tumor-image.png' with the paperclip icon so we can try it on the original file.
采纳的回答
DGM
2022-12-6
编辑:DGM
2022-12-6
Use the recommended syntax for indexed images.
[inpict map] = imread('MRI-brain-tumor-image.png');
imshow(inpict,map);
The 'colormap' parameter for imshow() is used for displaying grayscale inputs in pseudocolor using a unform quantization. It might sound similar, but the mapping will not generally be correct if you feed it an arbitrarily quantized image.
% create a linear grayscale ramp which does not span
% the full range of its numeric class
w = 150;
graypict = uint8(repmat(0:w-1,[round(w/2) 1]));
% create a smooth colormap of equal length
map = parula(w);
% demonstrate the difference in mapping behaviors
% each map entry corresponds to the unique values in graypict
subplot(2,1,1); imshow(graypict,map);
% each map entry corresponds to a uniform quantization of the interval [0 255]
subplot(2,1,2); imshow(graypict,'colormap',map);
While there appears to be a distinction made in the documentation, it's rather unclear in my opinion.
9 个评论
DGM
2022-12-6
One thing to avoid is
imagefile = strcat(filepath,'\',imagename);
instead, use
imagefile = fullfile(filepath,imagename);
That won't be causing any mapping issues though. So long as the different path expressions point to the same file, the output from imread() should be identical. That's something that can be tested.
imagename = "MRI-brain-tumor-image.png";
filepath="C:\Users\Alexa\OneDrive\not college\Documents\Documents\College\MatLab\BME\Proj09";
imagefile = fullfile(filepath,imagename);
[I1, map1] = imread(imagename);
[I2, map2] = imread(imagefile);
% test to see that the two calls return the same data
isequal(I1,I2)
isequal(map1,map2)
My guess is that there's something else happening outside the scope of these two code snippets. Perhaps it's something such as calls to caxis() or colormap() that would upset the mapping of the displayed image.
Steve Eddins
2022-12-6
Regarding this code in DGM's answer:
subplot(2,1,1); imshow(graypict,map);
% each map entry corresponds to a uniform quantization of the interval [0 255]
subplot(2,1,2); imshow(graypict,'colormap',map);
The variable graypict is being used in two different syntaxes:
imshow(X,map)
imshow(I,Name,Value)
The first call to imshow in DGM's code, then, interprets the first argument as X, a matrix of index values, and the values in X are used directly to look up colors from the second argument, map.
In the second call, the first argument is interpreted as I, a matrix containing grayscale values. Years ago, we used to call that an "intensity image" in the doc (hence the variable name "I"), and that term might be helpful here. When imshow displays a grayscale / intensity image, it scales the matrix values linearly to look up the colors in the colormap. The specific scaling depends on the data type of the input matrix. For a uint8 input matrix, the value 0 corresponds to the first colormap color, and the value 255 corresponds to the last colormap color. In this case, the input matrix values only go up to 155, and so the displayed colors come from the lower half (roughly) of the colormap.
Normally, imshow uses a grayscale colormap for the imshow(I) syntax. When you use imshow(I,'Colormap',map), however, imshow uses the colormap you specify. The documentation clue, admittedly subtle, is the sentence, "Use this argument [the Colormap name-value argument] to view grayscale images in false color."
The correspondence between matrix values and displayed colors is fully controlled by the image's CData, CLim, and CDataMapping properties, plus the Colormap property of either the axes or figure object.
更多回答(1 个)
Image Analyst
2022-12-6
Good question. The image is an indexed image, not a regular gray scale image. I did this in MATLAB:
fileName = 'MRI-brain-tumor-image.png';
% Read indexed image. It is not grayscale.
[grayImage, cmap] = imread(fileName);
whos grayImage
subplot(1, 2, 1);
imshow(grayImage, []);
impixelinfo;
fontSize = 20;
title('In MATLAB Without colormap', 'FontSize', fontSize)
subplot(1, 2, 2);
imshow(grayImage, 'Colormap', cmap);
impixelinfo;
title('In MATLAB With colormap', 'FontSize', fontSize)
colorbar;
g = gcf;
g.Name = 'Displayed from MATLAB'
I also brought it up in the Windows Picture viewer.
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1220537/image.png)
The Picture Viewer is on the left. The middle image above is just displaying the raw image in MATLAB. However if you ask it to return a colormap, you will see there is a colormap stored with the image, which means that the image is an indexed image, therefore the middle image would not be correct since it did not use the colormap while displaying it. The right image is displayed in MATLAB using the stored colormap, which should give the correct looking image, but it doesn't. And I don't know why. What's really weird is that the Windows picture viewer seems to be able to figure out the correct colormap and use it, but I don't know how.
Do you know how these images were made? Many or most medical images are saved in dicom format. Did this image originate in a dicom format? If so I'd recommend you use that dicom file and the dicomread function.
2 个评论
Image Analyst
2022-12-6
I would insist the professor give you the good images. Anyway, you can convert the indexed image into a grayscale image with ind2gray
fileName = 'MRI-brain-tumor-image.png';
% Read indexed image. It is not grayscale.
[grayImage, cmap] = imread(fileName);
% Convert from indexed image into grayscale image.
grayImage = ind2gray(grayImage, cmap);
% Display gray scale image.
imshow(grayImage, []);
impixelinfo;
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Blue 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!