MATLAB-真彩色图像RGB直方图绘制

对直方图概念不了解或对直方图均衡化感兴趣的朋友可以看看我之前写的文章:真彩色图像直方图均衡化

这里着重讲如何绘制一个美丽的RGB直方图~

MATLAB没有直接绘制RGB图像直方图的函数(可以分别对R、G、B分量使用imhist函数绘制,不过效果一般)


目录

思路

实现

源代码


思路

  1. 分别算出RGB各灰度级的像素个数
  2. 绘制直方图
  3. 美化

是不是很简单呢?那接下来我们一步一步实现上述内容

实现

从MATLAB图库里随意挑选一张真彩色图像

MATLAB-真彩色图像RGB直方图绘制_第1张图片

获取其大小,然后计算RGB各灰度级像素个数。哪一灰度级出现一次其相应像素点数+1

MATLAB-真彩色图像RGB直方图绘制_第2张图片

 绘制横坐标为灰度级,纵坐标为像素个数的直方图

MATLAB-真彩色图像RGB直方图绘制_第3张图片

MATLAB-真彩色图像RGB直方图绘制_第4张图片

emmm,直方图是做出来了,不过颜色不太对的上,接下来要做的是改变颜色,使直方图与RGB颜色一一对应

MATLAB-真彩色图像RGB直方图绘制_第5张图片

 这里的颜色可以随意选择自己喜欢的,看着顺眼就可以

MATLAB-真彩色图像RGB直方图绘制_第6张图片

颜色对齐了,不过对比度不足,加上边界轮廓美化一下

MATLAB-真彩色图像RGB直方图绘制_第7张图片

MATLAB-真彩色图像RGB直方图绘制_第8张图片

绘制完成!是不是非常的简单?绘制的直方图也很好看^_^,我们再随意看些其他图片

一只美洲鸵,从直方图能看出它的各个基色的灰度分布比较均衡(这里的B基色使用的是水蓝色噢)

MATLAB-真彩色图像RGB直方图绘制_第9张图片

MATLAB-真彩色图像RGB直方图绘制_第10张图片

一张海景图

MATLAB-真彩色图像RGB直方图绘制_第11张图片

MATLAB-真彩色图像RGB直方图绘制_第12张图片

星空,整体灰度值偏低

MATLAB-真彩色图像RGB直方图绘制_第13张图片

MATLAB-真彩色图像RGB直方图绘制_第14张图片

海边少女,整体灰度值偏高

MATLAB-真彩色图像RGB直方图绘制_第15张图片

MATLAB-真彩色图像RGB直方图绘制_第16张图片

夹带点私货嘿嘿嘿,发张它均衡化后的图片,背景的海和部分云灰度值本就比较低,均衡化后直接变成黑色的了hhh,云朵女孩脸上的光的分布也有点奇怪。不过嘛,整幅图的对比度可是大大增加了,有兴趣的朋友请戳:真彩色图像直方图均衡化

MATLAB-真彩色图像RGB直方图绘制_第17张图片

还有对亮度I均衡化后的美丽的星空

MATLAB-真彩色图像RGB直方图绘制_第18张图片

源代码

clear;close all;clc;
 
%RGB直方图绘制,兼容灰度图像
%图像应为uint8无符号整型,否则可能会无法绘制直方图,出错的话请看一下矩阵的数据类型
%很多朋友会使用im2double函数,使用了的话请用uint8(255*f)恢复成uint8无符号整形
 
f=imread('llama.jpg');
subplot(211);
imshow(f);title('原图');
fcal=double(f); %后面计算像素点时会有灰度值为255的像素点,将uint8型变为double型,防止溢出
[m,n,h]=size(f);
Y=zeros(h,256);
 
%分别统计原图像RGB基色各灰度级的像素个数
for k=1:h
    for i=1:m
        for j=1:n
            Y(k,fcal(i,j,k)+1)=Y(k,fcal(i,j,k)+1)+1; %哪一灰度级出现一次其相应像素点数+1。灰度级范围是0-255,但矩阵是1-256,列数要额外+1
        end
    end
end
 
X=0:1:255; %建立x坐标轴
subplot(212);
histogram=bar(X,Y); %绘制直方图
axis([0 255,-inf inf]) %x坐标轴限制在0-255
xlabel('灰度级');ylabel('像素个数');
 
if h==3 %改变直方图颜色并加轮廓
    title('RGB直方图');
    %分别改变颜色
    set(histogram(1),'FaceColor',[1 0.1882 0.1882]); 
    set(histogram(2),'FaceColor',[0.5 1 0]);
    set(histogram(3),'FaceColor',[0 0.5 1]);
    
    %增加边界轮廓
    hold on
    plot(X,Y(1,:),'Color',[1 0.1882 0.1882]);  %加上边界轮廓
    plot(X,Y(2,:),'Color',[0.5 1 0]);
    plot(X,Y(3,:),'Color',[0 0.5 1]);
    hold off
else
    title('灰度直方图');
end

如果对你有用的话,能否点个赞呢?^_^

你可能感兴趣的:(数字图像处理,matlab,图像处理,矩阵)