function [ Hout ] = CalcImageHSVHistogram( Iin )
% *** 函数功能 ***
% 本函数用来计算彩色图像的 HSV 直方图.
%
% *** 输入参数 ***
% 'Iin' - 输入的彩色图像矩阵.
%
% *** 输出参数 ***
% 'Hout' - 计算得到的直方图特征向量, 是一个 72 维的列向量.
%
% *** 调用示例 ***
% 无
%
% *** 编写日期 ***
% [2004-11-11]
%
% *** 作者 ***
% 刘伟
%
% *** 版本号 ***
% V 0.1
%
% *** 编写与测试平台 ***
% Matlab Version 7.7.0.471 ( R2008b )
%
% *** 修改说明 ***
% (1) [2009-11-14] 刘伟对函数进行了改写;
%
% *** 函数注释 ***
% (1) HSV 颜色直方图是一种效果不错的全局颜色特征,在彩色图像检索中得到了广泛地应用;
%
% 本函数的算法来源于如下文献 :
% 曹莉华, 柳伟, 李国辉. 基于多种主色调的图像检索算法研究与实现[J]. 计算机研究与发展, 1999, 36(1):96-100.
Hout = [];
% 判断输入的图像矩阵是否为真彩色图像 ...
if ( ndims( Iin ) ~= 3 )
return;
end;
% 将输入的彩色图像的颜色空间由 RGB 转换为 HSV ...
[ Iout ] = ChangeColorSpace( Iin );
% 量化经 RGB 颜色空间转换后的 HSV 颜色空间 ...
[ Q ] = QuantizeHSVColorSpace( Iout );
% 将量化后的 HSV 颜色空间三维数据转换为二维矩阵数据, 以计算直方图等视觉特征向量 ...
[ M ] = CalcImageHSVMatrix( Q );
% 计算得到彩色图像的 HSV 颜色直方图特征向量 ...
N = 72;
[ Hout ] = CalcHistogram( M, N );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 子函数定义 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ Iout ] = ChangeColorSpace( Iin )
% *** 函数功能 ***
% 本函数用来将彩色图像从 RGB 颜色空间转换到 HSV 颜色空间.
%
% *** 输入参数 ***
% 'Iin' - 转换前的彩色图像矩阵
%
% *** 输出参数 ***
% 'Iout' - 转换后的彩色图像矩阵
%
% *** 调用示例 ***
% 无
%
% *** 编写日期 ***
% [2009-11-15]
%
% *** 作者 ***
% 刘伟
%
% *** 版本号 ***
% V 0.1
%
% *** 编写与测试平台 ***
% Matlab Version 7.7.0.471 ( R2008b )
%
% *** 修改说明 ***
% 无
%
% *** 函数注释 ***
% 无
% 判断输入的图像矩阵是否为真彩色图像 ...
if ( ndims( Iin ) ~= 3 )
return;
end;
% RGB 空间转换为 HSV 空间, 下面的转换算法参考自文献:
% 曹莉华, 柳伟, 李国辉. 基于多种主色调的图像检索算法研究与实现[J].
% 计算机研究与发展, 1999, 36(1):96-100.
% 利用 Matlab 的特点采用矩阵运算以加快速度 ...
% 分离 RGB 颜色空间数据 ...
r = Iin( :, :, 1 );
g = Iin( :, :, 2 );
b = Iin( :, :, 3 );
% 计算 RGB 颜色值中的最大值和最小值, 得到 2 个结果矩阵 'MaxV' 和 'MinV' ...
MaxV = max( max( r, g ), b );
MinV = min( min( r, g ), b );
% 计算 'v' ...
v = MaxV ./ 255;
% 计算辅助变量的值 ...
% 计算 's' 和 'rt, gt, bt', 后者是计算 'h' 的基础 ...
% 按照公式( 见参考文献 ), 's = (MaxV - MinV) / MaxV', 所以对 's' 的计算
% 要特别处理如下 :
% (1) 'MaxV = 0' 则意味着 'r, g, b' 全为 0, 所以 'MaxV = MinV = 0'.
% (2) 'MinV = 255' 则意味着 'r, g, b' 全为 255, 所以 'MaxV = MinV = 255'.
% (3) 对于灰度像素 : 'r = g = b', 这时也有 'MaxV = MinV'.
% 由此可见, 无论哪种情况均是 'MaxV = MinV'.
%
% 另外 'rt, gt, bt' 计算公式如下 :
% rt = (MaxV - r) / (MaxV - MinV)
% gt = (MaxV - g) / (MaxV - MinV)
% bt = (MaxV - b) / (MaxV - MinV)
%
% 这时要特别处理 'MaxV = MinV'.
%
% 可见对于 's' 与 'rt, gt, bt' 均需要处理 'MaxV = MinV' 的情况, 但 's' 还
% 需要处理 'MaxV = MinV = 0' 时的情况 ...
% 先处理情况为 'MaxV = MinV', 这时 'rt == gt == bt == 0', 而且这种情况下无
% 论 MaxV 是否为 0, 's' 均为 0 ...
rt = zeros( size( Iin, 1 ), size( Iin, 2 ) );
gt = rt;
bt = rt;
s = rt;
% 处理 'MaxV ~= MinV' 的情形 ...
% 生成一满足条件的逻辑矩阵 ...
L = ( MaxV ~= MinV );
% 注意下面的计算方法, 充分利用了 Matlab 的矩阵运算特点 ...
% ( 注意下面均为点除运算 )
rt( L ) = ( MaxV( L ) - r( L ) ) ./ ( MaxV( L ) - MinV( L ) );
gt( L ) = ( MaxV( L ) - g( L ) ) ./ ( MaxV( L ) - MinV( L ) );
bt( L ) = ( MaxV( L ) - b( L ) ) ./ ( MaxV( L ) - MinV( L ) );
% 在 'MaxV ~= MinV' 的情形下计算 's', 这种情况下 MaxV 一定不为 0, 因为
% 若 'MaxV = 0', 则必有 'MaxV = MinV = 0', 这样就归结为上一种情况 ...
s( L ) = ( MaxV( L ) - MinV( L ) ) ./ MaxV( L );
% 计算 'h' ...
% 先处理所有的例外情况( 参阅参考文献中的计算公式 )...
h = 5 - rt;
% 依次处理每种条件( 均采用类似上述的逻辑矩阵的处理方法, 以利用 Matlab 的特点 ) ...
L = ( ( r == MaxV ) & ( g == MinV ) );
h( L ) = 5 + bt( L );
L = ( ( r == MaxV ) & ( g ~= MinV ) );
h( L ) = 1 - gt( L );
L = ( ( g == MaxV ) & ( b == MinV ) );
h( L ) = 1 + rt( L );
L = ( ( g == MaxV ) & ( b ~= MinV ) );
h( L ) = 3 - bt( L );
L = ( ( b == MaxV ) & ( r == MinV ) );
h( L ) = 3 + gt( L );
% 计算得到最终的 'h' ...
h = 60 .* h;
Iout( :, :, 1 ) = h;
Iout( :, :, 2 ) = s;
Iout( :, :, 3 ) = v;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 子函数定义 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ Q ] = QuantizeHSVColorSpace( Iin )
% *** 函数功能 ***
% 本函数用来量化经 RGB 颜色空间转换后的 HSV 颜色空间。
%
% *** 输入参数 ***
% 'Iin' - 转换后的 HSV 颜色空间彩色图像矩阵
%
% *** 输出参数 ***
% 'Q' - 量化后的 HSV 颜色空间彩色图像矩阵
%
% *** 调用示例 ***
% 无
%
% *** 编写日期 ***
% [2009-11-16]
%
% *** 作者 ***
% 刘伟
%
% *** 版本号 ***
% V 0.1
%
% *** 编写与测试平台 ***
% Matlab Version 7.7.0.471 ( R2008b )
%
% *** 修改说明 ***
% 无
%
% *** 函数注释 ***
% (1) 用 HSV 空间的颜色直方图来描述图像的整体颜色特征. 一幅图像的颜色一般非常多, 尤其是
% 真彩色图像, 因此直方图矢量的维数会非常多. 如果对 HSV 空间进行适当的量化后再计算直
% 方图, 则计算量要少得多.
%
% 分离 HSV 颜色空间的不同通道数据 ...
h = Iin( :, :, 1 ); % '色调 - hue' ...
s = Iin( :, :, 2 ); % '饱和度 - saturation' ...
v = Iin( :, :, 3 ); % '亮度 - value' ...
% '色调 - hue' ...
h( ( h <= 20 ) | ( h >= 316 ) ) = 0;
h( ( h >= 21 ) & ( h <= 40 ) ) = 1;
h( ( h >= 41 ) & ( h <= 75 ) ) = 2;
h( ( h >= 76 ) & ( h <= 155 ) ) = 3;
h( ( h >= 156 ) & ( h <= 190 ) ) = 4;
h( ( h >= 191 ) & ( h <= 270 ) ) = 5;
h( ( h >= 271 ) & ( h <= 295 ) ) = 6;
h( ( h >= 296 ) & ( h <= 315 ) ) = 7;
% '饱和度 - saturation' ...
s( ( s >= 0 ) & ( s <= 0.2 ) ) = 0;
s( ( s > 0.2 ) & ( s <= 0.7 ) ) = 1;
s( ( s > 0.7 ) & ( s <= 1.0 ) ) = 2;
% '亮度 - value' ...
v( ( v >= 0 ) & ( v <= 0.2 ) ) = 0;
v( ( v > 0.2 ) & ( v <= 0.7 ) ) = 1;
v( ( v > 0.7 ) & ( v <= 1.0 ) ) = 2;
% 返回量化好的值 ...
Q( :, :, 1 ) = h;
Q( :, :, 2 ) = s;
Q( :, :, 3 ) = v;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 子函数定义 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ M ] = CalcImageHSVMatrix( Q )
% *** 函数功能 ***
% 本函数将量化后的 HSV 颜色空间三维彩色图像数据转换为二维矩阵数据, 以计算直方图等视觉
% 特征向量。
%
% *** 输入参数 ***
% 'Q' - 量化后的 HSV 三维颜色空间彩色图像矩阵
%
% *** 输出参数 ***
% 'M' - 计算后的二维矩阵数据
%
% *** 调用示例 ***
% 无
%
% *** 编写日期 ***
% [2009-11-16]
%
% *** 作者 ***
% 刘伟
%
% *** 版本号 ***
% V 0.1
%
% *** 编写与测试平台 ***
% Matlab Version 7.7.0.471 ( R2008b )
%
% *** 修改说明 ***
% 无
%
% *** 函数注释 ***
% 无
%
% 分离量化后的 HSV 颜色空间的不同通道数据 ...
h = Q( :, :, 1 ); % '色调 - hue' ...
s = Q( :, :, 2 ); % '饱和度 - saturation' ...
v = Q( :, :, 3 ); % '亮度 - value' ...
% 预定义的计算系数 ...
qs = 3;
qv = 3;
% 将三维数据转换为二维数据 ...
M = h .* ( qs * qv ) + s .* qv + v;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 子函数定义 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ H ] = CalcHistogram( M, N )
% *** 函数功能 ***
% 本函数用来计算一个量化矩阵的直方图向量。所谓的量化矩阵表示经过某种计算得到
% 的具有整数值的矩阵,它表示了一些值的分布情况。典型的例子是图像经过某种处理
% 后得到