How to generate an RGB image from a 8-bit greyscale image that has an uneven background?

2 次查看(过去 30 天)
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 个评论
DGM
DGM 2023-12-6
编辑:DGM 2023-12-6
What is the intent?
  1. a linear colormapping process based on intensity
  2. a discrete colormapping based on some sort of classification
What is the image?

请先登录,再进行评论。

采纳的回答

DGM
DGM 2023-12-6
编辑:DGM 2023-12-6
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 个)

类别

Help CenterFile Exchange 中查找有关 Colormaps 的更多信息

产品


版本

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by