对直方图概念不了解或对直方图均衡化感兴趣的朋友可以看看我之前写的文章:真彩色图像直方图均衡化
这里着重讲如何绘制一个美丽的RGB直方图~
MATLAB没有直接绘制RGB图像直方图的函数(可以分别对R、G、B分量使用imhist函数绘制,不过效果一般)
目录
思路
实现
源代码
分别算出RGB各灰度级的像素个数绘制直方图美化思路
是不是很简单呢?那接下来我们一步一步实现上述内容
实现
从MATLAB图库里随意挑选一张真彩色图像
获取其大小,然后计算RGB各灰度级像素个数。哪一灰度级出现一次其相应像素点数+1
绘制横坐标为灰度级,纵坐标为像素个数的直方图
emmm,直方图是做出来了,不过颜色不太对的上,接下来要做的是改变颜色,使直方图与RGB颜色一一对应
这里的颜色可以随意选择自己喜欢的,看着顺眼就可以
颜色对齐了,不过对比度不足,加上边界轮廓美化一下
绘制完成!是不是非常的简单?绘制的直方图也很好看^_^,我们再随意看些其他图片
一只美洲鸵,从直方图能看出它的各个基色的灰度分布比较均衡(这里的B基色使用的是水蓝色噢)
一张海景图
星空,整体灰度值偏低
海边少女,整体灰度值偏高
夹带点私货嘿嘿嘿,发张它均衡化后的图片,背景的海和部分云灰度值本就比较低,均衡化后直接变成黑色的了hhh,云朵女孩脸上的光的分布也有点奇怪。不过嘛,整幅图的对比度可是大大增加了,有兴趣的朋友请戳:真彩色图像直方图均衡化
还有对亮度I均衡化后的美丽的星空
源代码
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:hfor i=1:mfor j=1:nY(k,fcal(i,j,k)+1)=Y(k,fcal(i,j,k)+1)+1; %哪一灰度级出现一次其相应像素点数+1。灰度级范围是0-255,但矩阵是1-256,列数要额外+1endendendX=0:1:255; %建立x坐标轴subplot(212);histogram=bar(X,Y); %绘制直方图axis([0 255,-inf inf]) %x坐标轴限制在0-255xlabel('灰度级');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 onplot(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 offelsetitle('灰度直方图');end
如果对你有用的话,能否点个赞呢?^_^