Image quality loss when importing?

조회 수: 25(최근 30일)
Alexandria Baughman
Alexandria Baughman 2022년 12월 6일
댓글: Steve Eddins 2022년 12월 6일
I'm having an issue with importing an image to MatLab.
The image when opened in photos looks like this:
However after running this code:
imagefile = "MRI-brain-tumor-image.png";
I = imread(imagefile);
imshow(I)
The figue from MatLab looks like this:
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
Alexandria Baughman
Alexandria Baughman 2022년 12월 6일

댓글을 달려면 로그인하십시오.

채택된 답변

DGM
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
Steve Eddins
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
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.
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
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;

댓글을 달려면 로그인하십시오.

제품


릴리스

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by