在matlab中对hsv进行均匀量化和非均匀量化

首先,进行非均匀量化,H,S,V三通道分别量化为16,4,4级,返回一个向量。量化依据如下表:

复制代码
function vec = getHsvHist(Image)
[M,N,O] = size(Image);
if O~= 3
    error('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: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;
        end
        if h(i,j)<=45&&h(i,j)>25
            H(i,j) = 2;
        end
        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) = 0;
        end
        if s(i,j)<=0.4&&s(i,j)>0.15
            S(i,j) = 1;
        end
        if s(i,j)<=0.75&&s(i,j)>0.4
            S(i,j) = 2;
        end
        if s(i,j)<=1&&s(i,j)>0.75
            S(i,j) = 3;
        end
    end
end
for i = 1:M
    for j = 1:N
        if v(i,j)<=0.15&&v(i,j)>0
            V(i,j) = 0;
        end
        if v(i,j)<=0.4&&v(i,j)>0.15
            V(i,j) = 1;
        end
        if v(i,j)<=0.75&&v(i,j)>0.4
            V(i,j) = 2;
        end
        if v(i,j)<=1&&v(i,j)>0.75
            V(i,j) = 3;
        end
    end
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:M
    for j = 1:N
        L(i,j) = H(i,j)*16+S(i,j)*4+V(i,j);
    end
end
%计算L的直方图
Hist=zeros(1,256);
for i = 0:255
    Hist(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~= 3
    error('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:M
    for j=1:N
        L(i,j)=16*H(i,j)+4*S(i,j)+V(i,j);
    end
end
%计算L的直方图
Hist=zeros(1,256);
for i = 0:255
    Hist(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均匀量化直方图');
相关推荐
ACP广源盛139246256732 小时前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
xrgs_shz3 小时前
直方图法、最大类间方差法、迭代法和自适应阈值法的图像分割的基本原理和MATLAB实现
人工智能·计算机视觉·matlab
hoiii1873 小时前
CSTR反应器模型的Simulink-PID仿真(MATLAB实现)
开发语言·matlab
嵌入式小企鹅3 小时前
蓝牙学习系列(八):BLE L2CAP 协议详解
网络·学习·蓝牙·ble·协议栈·l2cap
广州灵眸科技有限公司4 小时前
为RK3588注入澎湃算力:RK1820 AI加速卡完整适配与评测指南
linux·网络·人工智能·物联网·算法
byoass4 小时前
csdn_upload_005
网络·安全·云计算
IT WorryFree4 小时前
飞塔防火墙与第三方设备进行IPSEC故障诊断期间,用户可能会观察到以下错误:
linux·服务器·网络
Evand J6 小时前
【MATLAB例程】基于低精度IMU、GNSS的UAV初始航向(三维角度)校准的仿真,包含卡尔曼滤波、惯导解算与校正
开发语言·matlab·gnss·imu·卡尔曼滤波
不是书本的小明7 小时前
K8S应用优化方向
网络·容器·kubernetes
简简单单做算法7 小时前
基于CNN卷积神经网络的数据预测matlab仿真,对比BP,RBF,LSTM
matlab·cnn·卷积神经网络·lstm·数据预测