how to create gray scale gradient image?

14 views (last 30 days)
Mubashir Ali
Mubashir Ali on 8 Nov 2017
Commented: Chunru on 12 Oct 2022
how to create gray scale image like the attached file.

Answers (2)

DGM
DGM on 12 Oct 2022
Edited: DGM on 12 Oct 2022
Observe that the image profile is not piecewise-linear, but rather it's a cosine function.
% observe that the profile is not PWL
A = imread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/93802/image.png');
A = imcrop(A,[54 22 88 405]);
A = rgb2gray(A);
A = mean(A,2);
plot(A)
So one way is to simply generate the image using basic tools:
% generate a gradient image (strictly grayscale)
outsize = [200 200]; % [height width]
y = linspace(0,2*pi,outsize(1))';
y = (cos(y)+1)/2;
outpict = repmat(im2uint8(y),[1 outsize(2)]);
imshow(outpict)

Chunru
Chunru on 12 Oct 2022
a = (-5:0.1:5)';
b = exp(-a.^2/2);
x = repmat(b, [1 512]);
imagesc(x); colormap(flip(gray(512)))
  2 Comments
DGM
DGM on 12 Oct 2022
I suppose you're right. It's not like the OP is the one who needs the answer, so other ease curves/profiles could be considered. For perspective:
% the profile from the source image
A = imread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/93802/image.png');
A = imcrop(A,[54 18 88 413]); % crop a little wider to preserve the shape
A = rgb2gray(A);
A = mean(A,2);
profile_orig = mat2gray(A);
profile_orig([1:4 412:414]) = 1; % manually eliminate artifacts included in the wider crop region
sizey = numel(profile_orig);
% generate a gradient vector using a cosine curve
y = linspace(0,2*pi,sizey)';
profile_cos = (cos(y)+1)/2;
% generate a gradient vector using a PWL curve
y = linspace(-1,1,sizey)';
profile_pwl = abs(y);
% generate a gradient vector using a gaussian curve
y = linspace(-5,5,sizey)';
profile_gauss = 1-exp(-y.^2/2);
plot(profile_orig); hold on
plot(profile_cos)
plot(profile_pwl)
plot(profile_gauss)
legend({'original','cosine','pwl','gaussian'},'location','southeast')
Note that the original profile is cropped from a lossy-compressed image and some attempt was made to deal with the artifacts. Some inaccuracy should be expected due to that.
A visual comparison may help show the differences/similarities in the profiles.
% show samples of each side-by-side for comparison
clf
gradientsamples = [profile_orig profile_cos profile_pwl profile_gauss];
gradientsample = imresize(gradientsamples,[sizey 600],'nearest');
imshow(gradientsample)
Chunru
Chunru on 12 Oct 2022
@DGM many of the window function could be used.

Sign in to comment.

Tags

Community Treasure Hunt

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

Start Hunting!