How to plot RGB histogram of an image into a single 3D slice plot?

14 次查看(过去 30 天)
Hello. Im working on color image encryption and need to plot the histogram for each color channels. I can plot the individual color channel histogram in three 2D plot with this code.
close all;
image = imread('peppers.png');
R = image(:,:,1);
G = image(:,:,2);
B = image(:,:,3);
[Width,Length] = size(image);
subplot(2,2,1); imshow(image);
title('Plain Image')
subplot(2,2,2);
imhist(R);
myHist1 = findobj(gca, 'Type', 'Stem');
myHist1.Color = [1 0 0];
title('Red Channel Plain Histogram')
subplot(2,2,3);
imhist(G);
myHist2 = findobj(gca, 'Type', 'Stem');
myHist2.Color = [0 1 0];
title('Green Channel Plain Histogram')
subplot(2,2,4);
imhist(B);
myHist3 = findobj(gca, 'Type', 'Stem');
myHist3.Color = [0 0 1];
xlim([0 256]);
title('Blue Channel Plain Histogram')
But, i tried to plot them together in a 3D plot like this below (picture from an article i found), but i cant. I tried to find any forum that talks about this, but i can only found slice plots of meshgrid, not from histogram.
If anyone could help, I would appreciate it so much.
Thank you!

采纳的回答

Voss
Voss 2024-7-16
image = imread('peppers.png');
R = image(:,:,1);
G = image(:,:,2);
B = image(:,:,3);
subplot(2,2,1);
imshow(image);
title('Plain Image')
subplot(2,2,2);
imhist(R);
myHist1 = findobj(gca, 'Type', 'Stem');
myHist1.Color = [1 0 0];
xlim([0 255]);
title('Red Channel Plain Histogram')
subplot(2,2,3);
imhist(G);
myHist2 = findobj(gca, 'Type', 'Stem');
myHist2.Color = [0 1 0];
xlim([0 255]);
title('Green Channel Plain Histogram')
subplot(2,2,4);
imhist(B);
myHist3 = findobj(gca, 'Type', 'Stem');
myHist3.Color = [0 0 1];
xlim([0 255]);
title('Blue Channel Plain Histogram')
figure('Position',[10 10 500 500])
ax = gca();
myHist1_new = copyobj(myHist1,ax);
myHist1_new.ZData = myHist1_new.YData;
myHist1_new.YData = 1+zeros(size(myHist1_new.XData));
myHist2_new = copyobj(myHist2,ax);
myHist2_new.ZData = myHist2_new.YData;
myHist2_new.YData = 2+zeros(size(myHist2_new.XData));
myHist3_new = copyobj(myHist3,ax);
myHist3_new.ZData = myHist3_new.YData;
myHist3_new.YData = 3+zeros(size(myHist3_new.XData));
box on
grid on
xlim([0 255])
% ax.XDir = 'reverse'; % to match the xdir in the reference image
ylim([0 4])
yticks([1 2 3])
yticklabels(["R","G","B"]+" Channel")
view([30 35])

更多回答(1 个)

Ashutosh Thakur
Ashutosh Thakur 2024-7-16
Hello Mohammad,
You can explore the hist3 function available in MATLAB to create 3-D histogram plots. However, note that this function is specifically designed for bivariate data. You can refer to following link for the usage and the examples of the hist3 function: https://www.mathworks.com/help/stats/hist3.html.
You can also refer to the sample code for the usage of hist3 function:
x = randn(1000, 1); % 1000 random values from a normal distribution
y = randn(1000, 1); % 1000 random values from a normal distribution
% Combine the data into a single matrix
data = [x, y];
% Create a 3-D histogram plot
figure;
hist3(data, 'CdataMode', 'auto', 'FaceColor', 'interp');
% Set plot properties
title('3-D Histogram Plot');
xlabel('X-axis values');
ylabel('Y-axis values');
zlabel('Frequency');
colorbar; % Add a color bar to show the frequency scale
% Set view angle for better visualization
view(3);
grid on;
I hope this helps!

类别

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

产品


版本

R2014b

Community Treasure Hunt

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

Start Hunting!

Translated by