How to control color and the intensity in a pcolor figure?

2 Ansichten (letzte 30 Tage)
I'm try in to simulate a Coronae (diffraction of droplet). There are color depends by wavelength, and intensity depends by diffraction. How can I control both color by wavelength (lambda) and intensity (I) ?
I can only control lambda to have different color of diffraction pattern now.
lambda=400; % wavelength [nm]
a=10e3; % obstruct disc radius [nm](um)
x=linspace(-0.2,0.2,1000);
y=x;
[X,Y]=meshgrid(x,y);
r=sqrt(X.^2+Y.^2);
% diffraction pattern
u=2.*pi.*a./lambda;
J=besselj(1,u.*sin(r));
I=sqrt((u.*((1+cos(r))./2).*(J./sin(r))).^2); % Intensity
% colormap
w=lambda;
if (w >= 380) && (w < 440)
R = -(w - 440.) / (440. - 380.);
G = 0.0;
B = 1.0;
elseif (w >= 440) && (w < 490)
R = 0.0;
G = (w - 440.) / (490. - 440.);
B = 1.0;
elseif (w >= 490) && (w < 510)
R = 0.0;
G = 1.0;
B = -(w - 510.) / (510. - 490.);
elseif (w >= 510) && (w < 580)
R = (w - 510.) / (580. - 510.);
G = 1.0;
B = 0.0;
elseif (w >= 580) && (w < 645)
R = 1.0;
G = -(w - 645.) / (645. - 580.);
B = 0.0;
elseif (w >= 645) && (w <= 780)
R = 1.0;
G = 0.0;
B = 0.0;
else
R = 0.0;
G = 0.0;
B = 0.0;
end
c=[R,G,B];
h=linspace(0,1,256); % illumination (intensity) from [0,1]
for i=1:length(h)
S{i}=h(i).*c;
end
map=cell2mat(S');
% figure
pcolor(X,Y,I); shading flat; axis image; title([num2str(lambda)]);
colormap(map);
This is what I'm trying to simulate. (picture from google search)
And this is what I get so far (can change color by wavelength)
  4 Kommentare
Bjorn Gustavsson
Bjorn Gustavsson am 4 Dez. 2020
@Image Analyst, if there are small droplets in the atmosphere light will be diffracted, leading to coronae around light-sources (sun, moon etc): Corona
chia ching lin
chia ching lin am 4 Dez. 2020
@Image Analyst, Can you give me an example of how to done it?

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Bjorn Gustavsson
Bjorn Gustavsson am 4 Dez. 2020
You could try something like this:
lambda = 400:700; % Wavelengths in nm.
I_of_lambda = % Solar-spectral intensity as a function of wavelength
rgb_of_lambda = % your RGB-colour-map, one tripplet for each wavelength, like yours above
C_of_lambda = ones(size(lambda)); % Relative sensitivity at each wavelength, compare with ccd quantum efficiency. This is jus a placeholder
a=10e3; % obstruct disc radius [nm](um)
x=linspace(-0.2,0.2,1000);
y=x;
[X,Y]=meshgrid(x,y);
r=sqrt(X.^2+Y.^2);
Img_rgb = zeros([size(X),3]);
% diffraction pattern
for i_lambda = 1:numel(lambda)
% Here we calculate the diffraction-pattern wavelength-by-wavelength, and add their
% contributions to the R, G and B-channels together, one by one.
u=2.*pi.*a./lambda(i_lambda);
J=besselj(1,u.*sin(r));
I=sqrt((u.*((1+cos(r))./2).*(J./sin(r))).^2); % Intensity
Img_rgb(:,:,1) = Img_rgb(:,:,1) + I*rgb_of_lambda(i_lambda,1)*C_of_lambda(i_lambda);
Img_rgb(:,:,2) = Img_rgb(:,:,2) + I*rgb_of_lambda(i_lambda,2)*C_of_lambda(i_lambda);
Img_rgb(:,:,3) = Img_rgb(:,:,3) + I*rgb_of_lambda(i_lambda,3)*C_of_lambda(i_lambda);
end
Img_rgb = Img_rgb/max(Img_rgb(:)); % scale to 0-1
imagesc(X(1,:),Y(:,1),Img_rgb); shading flat; axis image; title('4000 - 7000 Å');
This should give you something to work with. You might have to scale the blue channel up. The colour-balancing in these type of tasks are notoriously confusing due to the characteristics of the colour-vision of our eyes.
HTH

Weitere Antworten (0)

Kategorien

Mehr zu Image Processing Toolbox 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!

Translated by