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

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

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


目录

思路

实现

源代码


思路

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

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

实现

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

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_灰度值

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

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_matlab_02

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

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_灰度值_03

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_矩阵_04

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

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_matlab_05

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

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_图像处理_06

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

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_矩阵_07

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_矩阵_08

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

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

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_灰度值_09

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_直方图_10

一张海景图

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_灰度值_11

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_矩阵_12

星空,整体灰度值偏低

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_灰度值_13

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_matlab_14

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

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_图像处理_15

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_matlab_16

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

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_矩阵_17

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

matlab怎么设置imagesc的颜色 matlab怎么改变颜色_矩阵_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