2010-02-05 11:09:00 daoqinglin 阅读数 6498
  • Matplotlib 数据分析可视化

    数据分析三剑客,NumPy、Pandas、Matplotlib,本课程是对Matplotlib的讲解,Matplotlib可以是分析的数据可视化,可以更直观的查看数据分析的结果,本课程独辟蹊径,不光教大家如何绘图,例如:饼图、柱状图、条形图、直方图等,而且深入剖析的Matplotlib的绘图原理,例如:如何操作图片,如何加载本地数据等。

    15303 人正在学习 去看看 郭宏志

      在图像处理技术领域,通常分析彩色图像是对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;
        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) = 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
        if s(i,j)<=1&&s(i,j)>0.75
            S(i,j) = 4;
        end
    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
end
% hist_s
m=0;
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模式

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);

%%=======================================

 处理效果请参看相册http://hi.csdn.net/space.php?uid=510783&do=album&id=24904

对H、S和V的非均匀量化的划分方法有很多种。而且颜色分布直方图中所有分量V的所有值都设置为固定的一个参数。对于彩色图像的灰色部分没有做针对性处理。

2019-04-07 16:02:33 SoaringLee_fighting 阅读数 1096
  • Matplotlib 数据分析可视化

    数据分析三剑客,NumPy、Pandas、Matplotlib,本课程是对Matplotlib的讲解,Matplotlib可以是分析的数据可视化,可以更直观的查看数据分析的结果,本课程独辟蹊径,不光教大家如何绘图,例如:饼图、柱状图、条形图、直方图等,而且深入剖析的Matplotlib的绘图原理,例如:如何操作图片,如何加载本地数据等。

    15303 人正在学习 去看看 郭宏志

Date: 2019-4-7


前言

    在图像处理技术领域,通常分析彩色图像是对RGB模式下各分量进行分析。如果要进行颜色识别,利用RGB各分量的组合进行分析图像的颜色就比较困难了,所以需要将彩色图像从RGB模式下转换到HSV模式下,分析图像颜色,并设计出颜色分布的直方图,并重新转换到RGB模式下进行显示。本文提供了颜色主分量和颜色分量比例提取的matlab实现方法。

1、参考

https://blog.csdn.net/daoqinglin/article/details/5290687
https://blog.csdn.net/chenbang110/article/details/7724824
http://www.cssdrive.com/imagepalette/index.php

2、颜色主分量和颜色分量比例提取

Matlab实现代码(部分):

%色彩分析 颜色占比
Image = Img;
[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;
         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) = 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
    if s(i,j)<=1&&s(i,j)>0.75
        S(i,j) = 4;
    end
 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
end
% hist_s
m=0;
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模式
I_H = hsv2rgb(hist_h/16,hist_s/4,hist_v);

% 画图显示?
axes(handles.axes2);
imshow(I_H,[]),title('颜色分量占比');

运行结果展示:
在这里插入图片描述
在这里插入图片描述


THE END!

在这里插入图片描述

2016-07-28 22:38:11 dcrmg 阅读数 2681
  • Matplotlib 数据分析可视化

    数据分析三剑客,NumPy、Pandas、Matplotlib,本课程是对Matplotlib的讲解,Matplotlib可以是分析的数据可视化,可以更直观的查看数据分析的结果,本课程独辟蹊径,不光教大家如何绘图,例如:饼图、柱状图、条形图、直方图等,而且深入剖析的Matplotlib的绘图原理,例如:如何操作图片,如何加载本地数据等。

    15303 人正在学习 去看看 郭宏志

肤色的检测可以利用肤色的HSV模型,通过计算图像的HSV模型中肤色的H和S分量中的一个或两个的直方图,再用该直方图反向投影至原图像,定位出肤色。

HSV颜色模型:



RGB模型是图像处理中常用的颜色模型,多用于颜色显示和图像处理,三维坐标中H(Hue)代表色调,S(Saturation)代表饱和度,V代表(Value)明度,理解起来很容易,是一种针对用户观感的一种颜色模型,侧重于色彩表示,什么颜色、深浅如何、明暗如何,跟人眼的直观感受很契合。

对于肤色的直方图,只计算H和S分量的直方图,所以肤色的明暗度对检测结果影响很小,提高了对不同灰度的鲁棒性。


检测的基本步骤:

1.截取一部分肤色区域,作为检测目标的样本;
2.对样本做直方图计算,并归一化直方图;
3.利用归一化后的直方图,通过calcBackProject函数在原图像中检索,与样本具有表现一致的直方图区域将会被作为肤色检测出来;


关键函数:calcHist、normalize 、calcBackProject

calcHist函数之前已经做过介绍,函数原型及参数说明可以ca见:直方图该怎么画


void normalize( InputArray src, OutputArray dst, double alpha=1, double beta=0,
                             int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray());


normalize函数作用是归一化计算出来的直方图。

第一个参数:InputArray类型的Src,输入的直方图数组;

第二个参数:OutputArray类型的dst,输出的归一化后的数组;

第三个参数:double型的alpha,归一化数组的最小值;

第四个参数:double型的beta,归一化数组的最大值;                                                                                            

第五个参数:int(枚举)型的norm_type,归一化方法;

第六个参数:int型的deype,值为-1, 指示归一化后的输出数组与输入数组类型相同

第七个参数:Mat(): 可选的掩码


calcBackProject函数原型:

calcBackProject(&image,       //目标图像  
                1,            // 图像个数  
                channels,     // 通道数量  
                histogram,    // 进行反投影的直方图  
                result,       // 结果图像  
                ranges,       // 每个维度的阈值  
                255.0         // 放缩因子  
                );  


代码实现:

#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"

using namespace cv;

Mat image,imageHSV,imageHist,imageNorm,imagecalcBack;
Mat imagegirl,imagegirlHSV;

int histSize=1;
float histR[]={0,255};
const float *histRange=histR;

int channels[]={0,1};

void TrackBarFun(int ,void(*));

int main(int argc,char *argv[])
{
	image=imread(argv[1]);
	imagegirl=imread(argv[2]);
	cvtColor(imagegirl,imagegirlHSV,CV_RGB2HSV);
	if(!image.data)
	{
		return -1;
	}
	cvtColor(image,imageHSV,CV_RGB2HSV);
	namedWindow("HSV");
	createTrackbar("bins控制","HSV",&histSize,100,TrackBarFun);	
	TrackBarFun(0,0);
	waitKey();
}
void TrackBarFun(int ,void(*))
{
	if(histSize==0)
	{
		histSize=1;
	}
	calcHist(&imageHSV,2,channels,Mat(),imageHist,1,&histSize,&histRange,true,false);
	normalize(imageHist,imageNorm,0,255,NORM_MINMAX,-1,Mat());
	calcBackProject(&imagegirlHSV,2,channels,imageNorm,imagecalcBack,&histRange,1,true);	
	imshow("Source",imagegirl);
	imshow("HSV",imagegirlHSV);
	imshow("CalcBack",imagecalcBack);
}

效果如下,拖动滑动条,在bins数目为7的时候,效果比较好:


 




2010-08-14 15:25:00 tlovet1314 阅读数 1574
  • Matplotlib 数据分析可视化

    数据分析三剑客,NumPy、Pandas、Matplotlib,本课程是对Matplotlib的讲解,Matplotlib可以是分析的数据可视化,可以更直观的查看数据分析的结果,本课程独辟蹊径,不光教大家如何绘图,例如:饼图、柱状图、条形图、直方图等,而且深入剖析的Matplotlib的绘图原理,例如:如何操作图片,如何加载本地数据等。

    15303 人正在学习 去看看 郭宏志

5.1 反色

1.定义: 反色(invert)就是形成底片效果。

2.用途: 当黑色区域占比较大区域时,可以利用反色,节省打印的墨。

3.做法:反色的实际含义是将RGB值反转。

1)真彩图。真彩图不带调色板,每个象素用3个字节,表示RGB三个分量。所以处理很简单,把反转后的RGB值写入新图即可。

2)带调色板的彩色图。只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转。

3)灰度图,是一种特殊的伪彩色图,所以反转的处理和上面讲的一样。

注:二值图不一定是黑白图,其实在调色板中是黑色和蓝色两种,但通常情况下是黑白图。

 

5.2 彩色图转灰度图

1.定义:YUV的颜色表示方法,在这种表示方法中,Y分量的物理含义就是亮度,它含了灰度图的所有信息,只用Y分量就完全能够表示出一幅灰度图来。

我们利用上式,根据RGB的值求出Y值后,将RGB值都赋值成Y,就能表示出灰度图来,这就是彩色图转灰度图的原理。

 

2.做法:

1)真彩图。根据RGB的值求出Y值后,将RGB值都赋值成Y,写入新图即可。由于改成灰度图后,是必须带一个256色的调色板,并把图像中的内容改变为对调色板的索引值。

2)彩色图。我们只需要将调色板中的彩色变成灰度,形成新调色板,而位图数据不用动,就可以了。

 

 

5.3 真彩图转256色图

1.定义:真彩图能表示2^24种颜色,就是要从中挑选出256种颜色。

 

2.做法:

1)准备长度为4096的数组——用于存储4096种颜色的信息;

2)统计这4096种颜色在图中的使用频率。对图中的每一个象素,取RGB的最高四位,拼成一个12位的整数,该整数值对应的数组元素加1

3)排除数组值为0的元素;

4)根据数组值从大到小排序;

5)取前256种颜色的数组信息,作为调色板上的256种颜色;

6)将图像内容数据改写为调色板的索引值。对图中每个像素取R,G,B的高4位,拼成一个12位整数,到调色板中查找,如果存在,则填入对应的索引值;如果不存在,则利用最小平方误差在调色板中查找替换颜色的索引值。

注:最小平方误差,即:(red1 – red2^2+green1 – green2^2+blue1 – blue2^2中最小的一个。可以先对第256种以后的颜色计算替换颜色索引值,再更改图像内容数据。

 

5.4 对比度扩展

1. 低对比度:即灰度都挤在一起,没有拉开。假设有一幅图,由于成象时光照不足,使得整幅图偏暗(例如,灰度范围从063);或者成象时光照过强,使得整幅图偏亮(例如,灰度范围从200255)

2. 灰度扩展:把你所感性趣的灰度范围拉开,使得该范围内的象素,亮的越亮,暗的越暗。

 

3. 做法:根据以下公式计算出新的灰度值:

  

gold表示原图的灰度值,gnew表示gold经过对比度扩展后得到了新的灰度值。g1oldg2old表示原图中要进行对比度扩展的范围,g1newg2new表示对应的新值。

我们假设a=c,这样,我们只要给出bg1oldg2old,就可以求出

a=(255-b(g2old-g1old))/(255-(g2old-g1old))

要注意的是,给出的三个参数必须满:(1) b*(g2old-g1old)<=255(2) (g2old-g1old)<=255

 

5.5 削波

1. 定义:是对比度扩展的特例,即a=c=0

2. 做法:只要给出g1oldg2old两个值,运用方程:b(g2old-g1old)=255计算出b值,并带入上节的公式中求得新图的灰度值即可。

 

5.6 阈值化

1. 定义:是削波的特例,即g1old=g2old

2. 做法:阈值就象个门槛,比它大就是白,比它小就是黑。

3. 作用:是一种常用的将图像转换成黑白二值图的方法。

 

5.7 灰度窗口变换

1 .定义:灰度窗口变换是将某一区间的灰度级和其它部分(背景)分开。

2. 种类:

1)清除背景:把不在灰度窗口范围内的象素都赋值为0,在灰度窗口范围内的象素都赋值为255,这也能实现灰度图的二值化;

2)保留背景:把不在灰度窗口范围内的象素保留原灰度值,在灰度窗口范围内的象素都赋值为255

3. 应用领域:电影特技处理(例如:“蓝幕”技术)。

 

5.8 灰度直方图统计

1.定义:用来统计图像灰度分布情况。,图中的横坐标表示灰度值,纵坐标表示该灰度值出现的次数(频率)

 

5.9 灰度直方图均衡化

1. 直方图修正,就是通过一个灰度映射函数Gnew=F(Gold),将原灰度直方图改造成你所希望的直方图。

2. 直方图均衡化是一种最常用的直方图修正。它是把给定图象的直方图分布改造成均匀直方图分布。直观地讲,直方图均衡化导致图象的对比度增加。//??感觉像降低对比度。

3. 做法:

1用一个数组s记录Pi分布的概率,即灰度i出现的次数与总的点数之比;

2i1开始,令s[i]=s[i]+s[i-1]

3)用一个数组L记录新的调色板索引值,即令L[i]=s[i]×(10-1)

4)计算新调色板的灰度值。

for (i = 0; i < EquaScale; i++) {

       Gray=(int)(i*255.0/(EquaScale-1));   //??超级不理解为什么是这样算的。

… …

5)通过数组L结果,调整图像实际数据内的调色板索引值。

 

  终于找到自己感兴趣图像处理出入了,嘻嘻,就是做电影特效处理!真的很帅也,有时间去找点这方面的资料看看,加油~

2014-01-11 18:12:18 iAm333 阅读数 15543
  • Matplotlib 数据分析可视化

    数据分析三剑客,NumPy、Pandas、Matplotlib,本课程是对Matplotlib的讲解,Matplotlib可以是分析的数据可视化,可以更直观的查看数据分析的结果,本课程独辟蹊径,不光教大家如何绘图,例如:饼图、柱状图、条形图、直方图等,而且深入剖析的Matplotlib的绘图原理,例如:如何操作图片,如何加载本地数据等。

    15303 人正在学习 去看看 郭宏志

本文来自于对网上文章的归纳整理,再加入了一些自己的理解。

图像梯度

介绍一下图像梯度的含义:


上图中,标量场是黑白的,黑色表示大的数值,而相应的梯度用红色箭头表示。

可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导:
图像梯度: G(x,y) = dx i + dy j;
dx(i,j) = I(i+1,j) - I(i,j);
dy(i,j) = I(i,j+1) - I(i,j);
其中,I是图像像素的值(如:RGB值),(i,j)为像素的坐标。

Hog介绍

现在继续介绍Hog。首先简要介绍Hog的主要思想、实现方法以及优点。
方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器(有关SVM的知识可以参考http://blog.csdn.net/v_july_v/article/details/7624837来理解)已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。

(1)主要思想:
       在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。
(2)具体的实现方法是:
       首先将图像分成小的连通区域,我们把它叫细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来就可以构成特征描述器。
(3)提高性能:
       把这些局部直方图在图像的更大的范围内(我们把它叫区间或block)进行对比度归一化(contrast-normalized),所采用的方法是:先计算各直方图在这个区间(block)中的密度,然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更好的效果。
(4)优点:
       与其他的特征描述方法相比,HOG有很多优点。首先,由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征是特别适合于做图像中的人体检测的。

Hog算法的实现过程:
大概过程:
HOG特征提取方法就是将一个image(你要检测的目标或者扫描窗口):
1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);
2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;
注:许多特征检测的第一步都是要进行图像的预处理,如归一化颜色值和gamma值,但如Dalal和Triggs指出的那样,HOG描述子可以省略这个步骤,因为它其中的描述子归一化处理能达到同样的效果。图像预处理对最终效果的贡献微薄。所以第一步就是计算梯度值。最通常用的方法就是简单的应用一个一维的离散的梯度模版分别应用在水平和垂直方向上去。可以使用如下的卷积核进行卷积:
[-1, 0, 1]{ and }[-1, 0, 1]^T
Dalal和Triggs也测试了其他更加复杂的卷积核,例如3x3的Sobel卷积核(Sobel算子)和斜角卷积核,但是这些卷积核在行人检测的实验中表现的都很差。他们还用高斯模糊进行预处理,但是在实际运用中没有模糊反而会更好。
3)计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。

首先用[-1,0,1]梯度算子对原图像做卷积运算,得到x方向(水平方向,以向右为正方向)的梯度分量gradscalx,然后用[1,0,-1]T梯度算子对原图像做卷积运算,得到y方向(竖直方向,以向上为正方向)的梯度分量gradscaly。然后再用以上公式计算该像素点的梯度大小和方向。
4)将图像划分成小cells(例如6*6像素/cell);
5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;
例如每个cell为6*6个像素。假设我们采用9个区间(bin)的直方图来统计这6*6个像素的梯度信息。也就是将cell的梯度方向360度分成9个方向块,如图所示:例如:如果这个像素的梯度方向是20-40度,直方图第2个bin的计数就加一,这样,对cell内每个像素用梯度方向在直方图中进行加权投影(映射到固定的角度范围),就可以得到这个cell的梯度方向直方图了,就是该cell对应的9维特征向量(因为有9个bin)。

像素梯度方向用到了,那么梯度大小呢?梯度大小就是作为投影的权值的。例如说:这个像素的梯度方向是20-40度,然后它的梯度大小是2(假设如此),那么直方图第2个bin的计数就不是加一了,而是加二(假设如此)。
细胞单元可以是矩形的(rectangular),也可以是星形的(radial)。
6)将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。这些区间是互有重叠的,这就意味着:每一个单元格的特征会以不同的结果多次出现在最后的特征向量中。我们将归一化之后的块描述符(向量)就称之为HOG描述符。
区间有两个主要的几何形状——矩形区间(R-HOG)和环形区间(C-HOG)。R-HOG区间大体上是一些方形的格子,它可以有三个参数来表征:每个区间中细胞单元的数目、每个细胞单元中像素点的数目、每个细胞的直方图通道数目。
例如:行人检测的最佳参数设置是:每个区间3×3个cell、每个cell6×6个像素、一共9个直方图通道。则一块的特征数为:3*3*9。
在这里具体解释一下block、cell的含义。opencv涉及了这么几个概念:窗口大小、块大小、cell大小、梯度方向数。
窗口大小如下:

一个图像可以被分成一个或多个窗口,窗口默认大小为64*128。
块大小如下:

一个窗口可以被分为一个或多个块,一个块默认大小是16*16。
cell大小如下:

cell默认大小是8*8.
7)将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。
一个图像的HOG特征维数是多少呢?
Dalal提出的Hog特征提取的过程:把样本图像分割为若干个像素的单元(cell),把梯度方向平均划分为9个区间(bin),在每个单元里面对所有像素的梯度方向在各个方向区间进行直方图统计,得到一个9维的特征向量,每相邻的4个单元构成一个块(block),把一个块内的特征向量联起来得到36维的特征向量,用块对样本图像进行扫描,扫描步长为一个单元。最后将所有块的特征串联起来,就得到了人体的特征。例如,对于64*128的图像而言,每16*16的像素组成一个cell,每2*2个cell组成一个块,因为每个cell有9个特征,所以每个块内有4*9=36个特征,以8个像素为步长,那么,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。也就是说,64*128的图片,总共有36*7*15=3780个特征。
关于opencv的hog的源码分析,http://blog.csdn.net/armily/article/details/8291310写的很不错~

图像的灰度化

阅读数 87

颜色特征提取方法

阅读数 40992

彩色平衡

阅读数 179

没有更多推荐了,返回首页