Matlab imread grayscale import has bad contrast

I'm trying to import a series of grayscale TIFF images. The pixels span the full range of values, from pure white to pure black. This can be seen when the image is viewed in a desktop program such as paint. However, when imread in Matlab is used to import the image, the contrast is greatly reduced: instead of spanning from 0 to 255 like it ought to, it covers only 70 to 95, for example. The range is different for each imported file.
The image is definitely grayscale, as imread outputs a 2D matrix.
Is there some trick that needs to be used, so that the image has the proper contrast after import?

17 Comments

Jacob - could you attach one of the images that should be showing pure white and pure black colours, but is only covering a subset of the range?
Actually I used Windows' "Remove Properties and Personal Information" tool in the file properties menu to remove anything sensitive and tried importing that and it works. Does Matlab have a way of removing file properties?
I'm sorry but I'd prefer not to upload the picture; my company takes IP very seriously.
Then how about create a sample TIFF that you generate (non IP gradient, random pixel values, take Lena (or matlab sample image) and convert to problematic TIFF) that also contains this problem. Which property that you removed which caused this to import correctly?
Interesting - I wonder what properties you removed? Could you do the following instead - on the tif file that has not had its properties removed, can you run the command
imfinfo('myTifWithProps.tif')
and compare those results with the file where you have removed all properties and personal info
imfinfo('myTifWithoutProps.tif')
Either or both might still show something sensitive, so if you'd rather not post, I understand.
I already did just that. Both Windows' property viewer and imfinfo show identical results. Yet the stripped file definitely has the proper grayscale.
What happens if you use the LibTiff routines on your problematic image?
t = Tiff('myTifWithProblems.tif','r');
image_one = t.read();
imshow(subimage_one)
I get an elaborate structure from Tiff(). What am I looking for? t has the following fields. Each one except file name is a structure.
t.FileName, t.TagID, t.SubFileType, t.Compression, t.Photometric, t.Thresholding, t.Orientation, t.PlanarConfiguration, t.ExtraSamples, t.Group3Options, t.ResolutionUnit, t.InkSet, t.SampleFormat, t.YCbCrPositioning, t.SGILogDataFmt, t.JPEGColorMode
The Tiff object returned by t = Tiff('image.tif','r') seems to be a directory of possible values rather than an actual list of properties.
imfinfo gives actual values for those fields but all of the data returned by imfinfo is the same before and after clearing the properties.
I was curious to see what happened when the TIFF library was used to load and read the image.
Did
img = t.read();
imshow(img)
show the same flawed image?
Ok I have no clue what happened but displaying the "stripped" file now has bad contrast just like the normal file. I have no clue what made it display properly before.
What are the lines of code that you are using to read the file - simply imread('image.tif'), or something else? Do you have (or can you create) a non-sensitive file that is exhibiting this behaviour? And, are you doing anything special/different when generating the tif?
What I'm doing right now as a workaround is I'll have the user manually convert the TIFFs to PNG in MSPaint. Matlab is displaying PNG's just fine with the help of the rgb2gray function. Obviously this is not ideal though so if you have any more insight that would be great.
I'm not sure what changed but the stripped TIFF displays wrong as well. I think I need to find some TIFF property that is improperly defining the luminance scale of the image.
The tif is generated from a 3rd party program, which is why I'm trying to find something embedded in the file.
I think I found a way around. The program can also export to .csv, so if I can parse through that, it might be the way I have to go. I'm sorry if I wasted your time, I really thought TIFF files would be easier to process.
If you do something like
[img,map] = imread('yourTifFile.tif');
is map empty?
I'm just driven by curiosity now. The map is the same as what was stored under the Colormap property. 256x3 array ranging from 0 to 1. Seems to be divided into blocks of 24 rows where it would start at zero and either be all zeros for the next 24 rows; or start at zero and irregularly increase towards 1. For some reason, loading the image using imshow in the command line displays it properly without the contrast issue. I think I may still stick with csv but it's interesting that the TIFF worked in the command prompt.
Jacob - so what happens if you do the following:
[img,map] = imread('yourTifFile.tif');
imshow(img);
At this point, is the image displaying the poor contrast? If so, then do the following
colormap(map)
What does the image look like now that you are using the colour map that is associated with the image?
Maybe the integers in the 2D img matrix are NOT colours but indices into the colour map that comes with the image.

Sign in to comment.

Answers (0)

Categories

Find more on Images in Help Center and File Exchange

Asked:

on 12 Aug 2014

Commented:

on 14 Aug 2014

Community Treasure Hunt

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

Start Hunting!