matlab⾥颜⾊直⽅图的画法
1.三个颜⾊的直⽅图画在⼀起。
I=imread('sample.bmp'); % ⽂件名⾃⼰改
siz=size(I);
I1=reshape(I,siz(1)*siz(2),siz(3)); % 每个颜⾊通道变为⼀列
I1=double(I1);
[N,X]=hist(I1, [0:1:255]); % 如果需要⼩矩形宽⼀点,划分区域少点,可以把步长改⼤,⽐如0:5:255
bar(X,N(:,[3 2 1])); % 柱形图,⽤N(:,[3 2 1])是因为默认绘图的时候采⽤的颜⾊顺序为b,g,r,c,m,y,k,跟图⽚的rgb顺序正好相反,所以把图⽚列的顺序倒过来,让图⽚颜⾊通道跟绘制时的颜⾊⼀致
xlim([0 255])
hold on
plot(X,N(:,[3 2 1])); % 上边界轮廓
hold off
2.分开画
i=imread('d:\1.jpg');%读取你要看的图像
R=i(:,:,1);%把RGB各个分量提出
G=i(:,:,2);
B=i(:,:,3);
figure;%画出直⽅图
subplot(1,3,1),imhist(R),title('红⾊');
subplot(1,3,2),imhist(G),title('绿⾊');
subplot(1,3,3),imhist(B),title('蓝⾊');
你也可以直接右击i选open selection查看⾥⾯的像素值。
3.hsv量化
在图像处理技术领域,通常分析彩⾊图像是对RGB模式下各分量进⾏分析。如果要进⾏颜⾊识别,利⽤RGB各分量的组合进⾏分析图像的颜⾊就⽐较困难了,所以需要将彩⾊图像从RGB模式下转换到HSV模式()下,分析图像颜⾊,并设计出颜⾊分布的直⽅图,并重新转换到RGB模式下进⾏显⽰。本算法是在matlab环境下实现的。具体代码如下:
%%================================
clear
clc
close all
Image = imread('Test3.jpg');
[M,N,O] = size(Image);
[h,s,v] = rgb2hsv(Image);
H = h; S = s; V = v;
h = h*360;
%将hsv空间⾮等间隔量化:
% h量化成16级;
% s量化成4级;
% v量化成4级;
for i = 1:M
for j = 1:N
if h(i,j)<=15||h(i,j)>345
H(i,j) = 0;
end
if h(i,j)<=25&&h(i,j)>15
H(i,j) = 1;
if h(i,j)<=55&&h(i,j)>45 H(i,j) = 3;
end
if h(i,j)<=80&&h(i,j)>55 H(i,j) = 4;
end
if h(i,j)<=108&&h(i,j)>80 H(i,j) = 5;
end
if h(i,j)<=140&&h(i,j)>108 H(i,j) = 6;
end
if h(i,j)<=165&&h(i,j)>140 H(i,j) = 7;
end
if h(i,j)<=190&&h(i,j)>165 H(i,j) = 8;
end
if h(i,j)<=220&&h(i,j)>190 H(i,j) = 9;
end
if h(i,j)<=255&&h(i,j)>220 H(i,j) = 10;
end
if h(i,j)<=275&&h(i,j)>255 H(i,j) = 11;
end
if h(i,j)<=290&&h(i,j)>275 H(i,j) = 12;
end
if h(i,j)<=316&&h(i,j)>290 H(i,j) = 13;
end
if h(i,j)<=330&&h(i,j)>316 H(i,j) = 14;
end
if h(i,j)<=345&&h(i,j)>330 H(i,j) = 15;
end
end
end
for i = 1:M
for j = 1:N
if s(i,j)<=0.15&&s(i,j)>0 S(i,j) = 1;
end
if s(i,j)<=0.4&&s(i,j)>0.15 S(i,j) = 2;
end
if s(i,j)<=0.75&&s(i,j)>0.4 S(i,j) = 3;
end
end
for i = 1:M
for j = 1:N
if v(i,j)<=0.15&&v(i,j)>0
V(i,j) = 1;
end
if v(i,j)<=0.4&&v(i,j)>0.15
V(i,j) = 2;
end
if v(i,j)<=0.75&&v(i,j)>0.4
V(i,j) = 3;
end
if v(i,j)<=1&&v(i,j)>0.75
V(i,j) = 4;
end
end
end
% 构建4*16⼆维数组存放H-S数据
Hist = zeros(16,4);
for i = 1:M
for j = 1:N
for k = 1:16
for l = 1:4
if l==S(i,j)&& k==H(i,j)+1
Hist(k,l) = Hist(k,l)+1;
end
end
end
end
end
for k = 1:16
for l =1:4
His((k-1)*4+l) = Hist(k,l);%转化为⼀维数组 end
end
His = His/sum(His)*1000;
% ⼿⼯绘制彩⾊图像直⽅图
% hist_h
m=0;
for j = 1:300
if rem(j,16)==1 && m<16
for k = 0:15
for i = 1:200
hist_h(i,j+k) = m;
end
end
m = m+1;
end
for j = 1:300
if rem(j,4) == 1 && m<64
n = rem(m,4);
for k = 0:3
for i =1:200
hist_s(i,j+k) = n+1;
end
end
m = m+1;
end
end
% hist_v
for j = 1:256
for i = 1:200
hist_v(i,j) = 0.98;
end
end
% 把His赋值给hist_v
for k = 1:64
for j = 1:256
if floor((j-1)/4) == k
for i = 1:200
if i<200-His(k+1)%i>His(k+1)%
hist_v(i,j) = 0;
end
end
end
end
end
%将h、s、v分量图合并转化为RGB模式
matlab直方图I_H = hsv2rgb(hist_h/16,hist_s/4,hist_v);
% 画图显⽰
figure;
subplot(3,2,1),imshow(Image),title('原图');
subplot(3,2,2),imshow(H,[]),title('H分量图');
subplot(3,2,3),imshow(S,[]),title('S分量图');
subplot(3,2,4),imshow(V,[]),title('V分量图');
subplot(3,2,5),imshow(I_rgb,[]),title('⾊彩量化后的RGB图像');
subplot(3,2,6),imshow(I_H,[]),title('H-S直⽅图');
figure,imshow(I_H);
%%=======================================
对H、S和V的⾮均匀量化的划分⽅法有很多种。⽽且颜⾊分布直⽅图中所有分量V的所有值都设置为固定的⼀个参数。对于彩⾊图像的灰⾊部分没有做针对性处理。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论