首先,进行非均匀量化,H,S,V三通道分别量化为16,4,4级,返回一个向量。量化依据如下表:
function vec = getHsvHist(Image)
[M,N,O] = size(Image);
if O~= 3error('3 components are needed for histogram');
end
[h,s,v] = rgb2hsv(Image);
H = h; S = s; V = v;
h = h*360;%将hsv空间非等间隔量化:
% h量化成16级;
% s量化成4级;
% v量化成4级;
for i = 1:Mfor j = 1:Nif h(i,j)<=15||h(i,j)>345H(i,j) = 0;endif h(i,j)<=25&&h(i,j)>15H(i,j) = 1;endif h(i,j)<=45&&h(i,j)>25H(i,j) = 2;endif h(i,j)<=55&&h(i,j)>45H(i,j) = 3;endif h(i,j)<=80&&h(i,j)>55H(i,j) = 4;endif h(i,j)<=108&&h(i,j)>80H(i,j) = 5;endif h(i,j)<=140&&h(i,j)>108H(i,j) = 6;endif h(i,j)<=165&&h(i,j)>140H(i,j) = 7;endif h(i,j)<=190&&h(i,j)>165H(i,j) = 8;endif h(i,j)<=220&&h(i,j)>190H(i,j) = 9;endif h(i,j)<=255&&h(i,j)>220H(i,j) = 10;endif h(i,j)<=275&&h(i,j)>255H(i,j) = 11;endif h(i,j)<=290&&h(i,j)>275H(i,j) = 12;endif h(i,j)<=316&&h(i,j)>290H(i,j) = 13;endif h(i,j)<=330&&h(i,j)>316H(i,j) = 14;endif h(i,j)<=345&&h(i,j)>330H(i,j) = 15;endend
end
for i = 1:Mfor j = 1:Nif s(i,j)<=0.15&&s(i,j)>0S(i,j) = 0;endif s(i,j)<=0.4&&s(i,j)>0.15S(i,j) = 1;endif s(i,j)<=0.75&&s(i,j)>0.4S(i,j) = 2;endif s(i,j)<=1&&s(i,j)>0.75S(i,j) = 3;endend
end
for i = 1:Mfor j = 1:Nif v(i,j)<=0.15&&v(i,j)>0V(i,j) = 0;endif v(i,j)<=0.4&&v(i,j)>0.15V(i,j) = 1;endif v(i,j)<=0.75&&v(i,j)>0.4V(i,j) = 2;endif v(i,j)<=1&&v(i,j)>0.75V(i,j) = 3;endend
end%将三个颜色分量合成为一维特征向量:L = H*Qs*Qv+S*Qv+v;Qs,Qv分别是S和V的量化级数, L取值范围[0,255]
%取Qs = 4; Qv = 4
L=zeros(M,N);
for i = 1:Mfor j = 1:NL(i,j) = H(i,j)*16+S(i,j)*4+V(i,j);end
end
%计算L的直方图
Hist=zeros(1,256);
for i = 0:255Hist(i+1) = size(find(L==i),1);
end
vec=Hist';
接着,进行均匀量化,H,S,V三通道分别量化为16,4,4级,返回一个向量。
function vec= hsvHist(Image)
[M,N,O] = size(Image);
if O~= 3error('3 components are needed for histogram');
end
H_BITS = 4; S_BITS =2; V_BITS = 2;
hsv = uint8(255*rgb2hsv(Image));
%均匀量化
% bitshift(24,-3) 表示24除以2的3次方
H=bitshift(hsv(:,:,1),-(8-H_BITS));
S=bitshift(hsv(:,:,2),-(8-S_BITS));
V=bitshift(hsv(:,:,3),-(8-V_BITS));%%
%先进行合成,然后再统计
L=zeros(M,N);
for i=1:Mfor j=1:NL(i,j)=16*H(i,j)+4*S(i,j)+V(i,j);end
end
%计算L的直方图
Hist=zeros(1,256);
for i = 0:255Hist(i+1) = size(find(L==i),1);
end
vec=Hist';
end
利用matlab实现对于图像的hsv颜色特征提取
以lena图像进行比较:
clc;clear;close all;
rgb=imread('d:/pic/lena.jpg');
h1=getHsvHist(rgb);
h2=hsvHist(rgb);
figure,
subplot(211),bar(h1),title('hsv非均匀量化直方图');
subplot(212),bar(h2),title('hsv均匀量化直方图');