- a linear colormapping process based on intensity
- a discrete colormapping based on some sort of classification
How to generate an RGB image from a 8-bit greyscale image that has an uneven background?
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
I have a grey scale 8-bit image which I want to transform into an RGB image where R(red) corresponds to the brightest features, B(blue) stands for the darkest feature and G(green) corresponds to the grey features. At the same time I want the background to be black to highlight the colored features. The problem I have is that my background is (i) highly non-uniform, (ii) grey, while there are important grey features within the image. If I apply a global background subtraction, the important grey features will be lost from the image. I have attached an image from a published paper here. Any help in solving this problem is graetly appreciated. Thank you!
1 Kommentar
Akzeptierte Antwort
DGM
am 6 Dez. 2023
Bearbeitet: DGM
am 6 Dez. 2023
I'm not sure where this is going, but maybe this is a start.
% read the image
inpict = imread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/1561484/test_image.png');
% try to create a mask that selects the triangles?
% it's probably going to be pretty rough.
trianglemask = imflatfield(inpict,20);
trianglemask = imadjust(trianglemask);
trianglemask = imbinarize(trianglemask,'adaptive','sensitivity',0.77);
trianglemask = imopen(~trianglemask,strel('disk',3)); % despeckle
trianglemask = bwareaopen(trianglemask,500); % get rid of blobs below a given size
% get pixels within the mask
inmask = inpict(trianglemask); % pixels within the mask
imhist(inmask) % show the distribution of values
% what are the limiting values?
% are they the available dynamic range of the numeric class?
%inrange = getrangefromclass(inmask); % [0 255]
% or use image extrema within the mask
inrange = imrange(inmask); % the actual extrema
% or instead of using the extreme values at the tail, come in a bit
%p = 1; % ignore the upper and lower p% of pixels
%inrange = quantile(inmask,[p 100-p]/100); % the specified lower/upper quantile
% add some markers to the histogram
xline(inrange(1));
xline(inrange(2));
% create a pseudocolor image
CT = hsv(384);
CT = flipud(CT(1:256,:));
outpict = gray2pcolor(inpict,CT,inrange,'cdscale'); % attached
outpict = outpict.*trianglemask; % omit the background
imshow(outpict)
% assuming we just want equal-spaced bins?
% these outer bins are adjacent to the limiting values in inrange
edges = linspace(inrange(1),inrange(2),4);
hc = histcounts(inmask,edges);
hc = hc/sum(hc);
% make a grouped bar plot
hb = bar(1,hc);
hb(1).FaceColor = 'b';
hb(2).FaceColor = 'g';
hb(3).FaceColor = 'r';
legend({'low','medium','high'}) % the color is a proxy. describe the data
0 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Colormaps finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!