MATLAB-真彩色图像RGB直方图绘制
Posted Kaerou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB-真彩色图像RGB直方图绘制相关的知识,希望对你有一定的参考价值。
对直方图概念不了解或对直方图均衡化感兴趣的朋友可以看看我之前写的文章:真彩色图像直方图均衡化
这里着重讲如何绘制一个美丽的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: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-真彩色图像RGB直方图绘制的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB-真彩色图像直方图均衡化及分别在RGB与HSI坐标系进行处理