精华内容
下载资源
问答
  • MatConvNet自己的图片分两提取图片特征

    千次阅读 热门讨论 2016-09-02 16:40:30
    MatConvNet自己的图片分两也可以讲是使用MatConvNet:工具箱可以直接去Github上下载,http://www.studyai.cn/deep_learn/matconvnet/functions/index.html点击打开链接这个网站讲解了MatConvNet的每个函数 很...

    MatConvNet对自己的图片分两类也可以讲是使用MatConvNet:工具箱可以直接去Github上下载,http://www.studyai.cn/deep_learn/matconvnet/functions/index.html点击打开链接这个网站讲解了MatConvNet的每个函数  很详细!

    然而我自己仿照example写分2类的程序 运行还是不断报错。。。最后放弃了自己瞎搞 又去Github上下载了别人使用MatConvNet做车牌识别的例子,是另一个工具箱:MatConvNet-mr-master

    打开这个工具箱是这样:

    文件夹ann_plate2是我自己加的

    先自己测试下这个工具箱:运行cnn_plate_init再运行cnn_plate,对了cnn_plate改成自己路径 还有cnn_plate_setup_data的这几行记得不要注释掉:

    就这样!

    最终生成的模型就在...\matconvnet-1.0-beta20\data\primerplate9.2-baseline文件夹里面!证明了是可以运行成功的!但太慢了,我就改了cnn_plate_init的迭代次数和batchsize的个数:结果快了很多,这个工具箱如果github上没有 可以在这里下载:

     http://download.csdn.net/detail/wd1603926823/9620127点击打开链接    记得要先下载matconvnet-1.0-beta20工具箱才能用这个工具箱!

    /看不见分界线//

    测试完工具箱想正确的 可以使用后,接下来我就按照这个工具箱改成我的分2类:

    我的图片放在:

    我要分2类 所以2个文件夹

    1,首先我改了这里:

    放图片的路径和最终保存模型的文件夹名字  改了这2处

    2,然后我改了这里(不改也行):

    迭代次数改成了10次:


    3,还改了这里:

    使用GPU 还有是2分类 不是multiclass

    接下来就可以了:结果:

    因为我只有1040张总样本  所以效果不好也正常  我只求不报错!去data文件夹下可以看到刚刚训练好的模型数据:


    然后我利用最后一次的模型提取另一个文件夹下的图片特征。。。

    run(fullfile('D:\MATLAB_code\matconvnet-1.0-beta20\matlab\vl_setupnn.m')) ;
    net = load('D:\MATLAB_code\matconvnet-1.0-beta20\data\Bchannel9.5-baseline\net-epoch-100.mat');
    feat = [];
    rgbImgList = {};
    facepath='D:\MATLAB_code\matconvnet-1.0-beta20\data\toExtractFeature\';
    newpath=facepath;
    for j=0:1039
           k=j+1;
           facepath=newpath;
           facepath=strcat(facepath,num2str(j));
           facepath=strcat(facepath,'.bmp');
           oriImg=imread(facepath);
           oriImg=imresize(oriImg,[20 20]);
           tmpNam =strcat(num2str(j),'.bmp');
          if size(oriImg, 3) == 1
              rgbImg= oriImg;
              im_ = single(rgbImg) ; % note: 255 range
              im_ = imresize(im_, net.net.meta.inputSize(1:2)) ;
              im_ = im_ - net.net.meta.normalization.averageImage ;
              res = vl_simplenn(net.net, im_) ;
              featVec = res(7).x;
              featVec = featVec(:);
              feat = [feat; featVec'];
              fprintf('extract %d image\n\n',j);
              rgbImgList{k,1} = tmpNam;
              clear rgbImg;
          else
              fprintf('the model need 3 channels but you put in 1 channel images\n');
          end
    end
    labels=zeros(1,1040);
    labels(624:end)=1;
    feat = normalize1(feat);
    save('NoVGGBchannel9.5.mat','feat', 'rgbImgList','labels');

    其实我还是想用已知的著名的模型如VGG在新数据上重新训练得到属于自己的模型  按照https://github.com/vlfeat/matconvnet/issues/218 点击打开链接 这样对VGG微调  得到新VGG模型 结果我的训练有问题 虽然没报错 就是运行这3个程序:

    function net =cnn_plate_init()
    % rng('default');
    % rng(0) ;
    % 
    % f=1/100 ;
    % net.layers = {};
    % net.layers{end+1} = struct('type', 'conv', ...
    %                            'weights', {{f*randn(3,3,1,20, 'single'), zeros(1, 20, 'single')}}, ...
    %                            'stride', 1, ...
    %                            'pad', 0) ;
    % net.layers{end+1} = struct('type', 'pool', ...
    %                            'method', 'max', ...
    %                            'pool', [2 2], ...
    %                            'stride', 2, ...
    %                            'pad', 0) ;
    % net.layers{end+1} = struct('type', 'relu') ;
    % net.layers{end+1} = struct('type', 'conv', ...
    %                            'weights', {{f*randn(3,3,20,100, 'single'),zeros(1,100,'single')}}, ...
    %                            'stride', 1, ...
    %                            'pad', 0) ;
    % net.layers{end+1} = struct('type', 'pool', ...
    %                            'method', 'max', ...
    %                            'pool', [2 2], ...
    %                            'stride', 2, ...
    %                            'pad', 0) ;
    % net.layers{end+1} = struct('type', 'relu') ;
    % net.layers{end+1} = struct('type', 'conv', ...
    %    'weights', {{f*randn(3,3,100,2, 'single'),zeros(1,2,'single')}}, ...
    %    'stride', 1, ...
    %    'pad', 0) ;
    % net.layers{end+1} = struct('type', 'softmaxloss') ;
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%use pre-trained model re-train  https://github.com/vlfeat/matconvnet/issues/218
     netprimer = load('D:\MATLAB_code\matconvnet-1.0-beta20\CNN-for-Image-Retrieval-master\imagenet-vgg-f.mat');
     net.layers=netprimer.layers(1:end-2);
     net.layers{end+1} = struct('type', 'conv', ...
         'weights', {{0.05*randn(3,3,4096,2, 'single'),zeros(1,2,'single')}}, ...
         'stride', [1,1], ...
         'pad', [0,0,0,0]) ;
     net.layers{end+1} = struct('type', 'softmaxloss') ;
     net.meta.inputSize = [224 224 3] ;
    %%%%%%%%%%%%%%%%%%%%%%%%%%
    % Meta parameters
    %net.meta.inputSize = [20 20 1] ;
    net.meta.trainOpts.learningRate = logspace(-3, -5, 100);
    net.meta.trainOpts.numEpochs = 50;
    net.meta.trainOpts.batchSize =10 ;
    % Fill in defaul values
    net = vl_simplenn_tidy(net) ;
    
    end
    然后运行这个:

    function [net, info] = cnn_plate()
    run(fullfile('D:\MATLAB_code\matconvnet-1.0-beta20\matlab\vl_setupnn.m')) ;
    %datadir='E:\MachineLearning\caffe\caffe-windows-master\platerecognition\data\platerecognition\chars2';
    %datadir='D:\MATLAB_code\matconvnet-1.0-beta20\data\Bchannel8.23';
    datadir='F:\mypic\人工分类8.17\myReclassify0.2';
    %datadir='D:\MATLAB_code\my_MatConvNet-mr-master\MatConvNet-mr-master\ann_plate2';
    opts.expDir = fullfile(vl_rootnn, 'data', 'VGGBchannel9.5-baseline') ;
    opts.imdbPath = fullfile(opts.expDir, 'imdb.mat');
    if exist(opts.imdbPath,'file')
        imdb=load(opts.imdbPath);
    else
        imdb=cnn_plate_setup_data(datadir);
        mkdir(opts.expDir) ;
        save(opts.imdbPath, '-struct', 'imdb') ;
    end
    net=cnn_plate_init();
    net.meta.normalization.averageImage =imdb.images.data_mean ;
    opts.train.gpus=1;
    [net, info] = cnn_train(net, imdb, getBatch(opts), ...
      'expDir', opts.expDir, ...
      net.meta.trainOpts, ...
      opts.train, ...
      'val', find(imdb.images.set == 3)) ;
    
    
    function fn = getBatch(opts)
    % --------------------------------------------------------------------
        fn = @(x,y) getSimpleNNBatch(x,y) ;
    end
    function [images, labels]  = getSimpleNNBatch(imdb, batch)
        images = imdb.images.data(:,:,:,batch) ;
        labels = imdb.images.labels(1,batch) ;
        if opts.train.gpus > 0
            images = gpuArray(images) ;
        end
    end
    end
    
    其中:
    function imdb =cnn_plate_setup_data(datadir)
    inputSize =[224,224,3];
    %inputSize =[20,20,1];
    subdir=dir(datadir);
    imdb.images.data=[];
    imdb.images.labels=[];
    imdb.images.set = [] ;
    imdb.meta.sets = {'train', 'val', 'test'} ;
    image_counter=0;
    trainratio=0.8;
    for i=3:length(subdir)
            imgfiles=dir(fullfile(datadir,subdir(i).name));
            imgpercategory_count=length(imgfiles)-2;
            disp([i-2 imgpercategory_count]);
            image_counter=image_counter+imgpercategory_count;
            for j=3:length(imgfiles)
                img=imread(fullfile(datadir,subdir(i).name,imgfiles(j).name));
                img=imresize(img, inputSize(1:2));
                img=single(img);
                 [~,~,d]=size(img);
                 if d==3
                     img=rgb2gray(img);
                     continue;
                 end
                imdb.images.data(:,:,:,end+1)=single(img);
                imdb.images.labels(end+1)= i-2;
                if j-2<imgpercategory_count*trainratio
                    imdb.images.set(end+1)=1;
                else
                    imdb.images.set(end+1)=3;
                end
            end
    end
    dataMean=mean(imdb.images.data,4);
    imdb.images.data = single(bsxfun(@minus,imdb.images.data, dataMean)) ;
    imdb.images.data_mean = dataMean;
    end
    结果一个白板 应该是在cnntrain时一次都不满足train条件:



    可是具体问题出在哪里?真的好想直接调用VGG模型然后在自己的新图片数据上微调得到属于自己的VGG 然后用来分类测试或提取特征!可是问题出在哪里??

    推荐个网址http://www.studyai.cn/点击打开链接    http://blog.sina.com.cn/s/blog_837f83580102vwv4.html

    //看不见分界线///

    根据http://blog.csdn.net/willard_yuan/article/details/44861487点击打开链接根据这个人的用已知模型提取图片特征,彩图或灰度图都可以:

    % 用已知模型去提取图片特征
    run(fullfile('D:\MATLAB_code\matconvnet-1.0-beta20\matconvnet-1.0-beta20\matlab\vl_setupnn.m')); %换成你的vl_setupnn.m具体路径
    %想提取特征的图片所在路径
    path_imgDB = 'D:\MATLAB_code\matconvnet-1.0-beta20\matconvnet-1.0-beta20\CNN-for-Image-Retrieval-master\database';
    addpath(path_imgDB);
    addpath tools;
    %换成你下载的imagenet-vgg-f.mat具体路径
    net = load('imagenet-vgg-f.mat') ; 
    % Step 2 LOADING IMAGE AND EXTRACTING FEATURE
    imgFiles = dir(path_imgDB);
    imgNamList = {imgFiles(~[imgFiles.isdir]).name};
    clear imgFiles;
    imgNamList = imgNamList';
    numImg = length(imgNamList);
    feat = [];
    k = 0;
    rgbImgList = {};
    %因为模型要求输入是3通道的 所以先检测如果是灰度图 就变成3通道的 再提取  如果是彩图 就直接提取特征
    for i = 1:numImg
       oriImg = imread(imgNamList{i, 1}); 
       %oriImg=imresize(oriImg,[224 224]);  %如果你想直接用VGG模型 而你的图片不是224X224时就直接这样好了
       tmpNam = imgNamList{i, 1};
       if size(oriImg, 3) == 3
           k = k+1;
           im_ = single(oriImg) ; % note: 255 range
           im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
           im_ = im_ - net.meta.normalization.averageImage ;
           res = vl_simplenn(net, im_) ;
           featVec = res(19).x;
           featVec = featVec(:);
           feat = [feat; featVec'];
           fprintf('extract %d image\n\n', i);
           rgbImgList{k,1} = tmpNam;
       else
           rgbImg(:,:,1) = oriImg;
           rgbImg(:,:,2) = oriImg;
           rgbImg(:,:,3) = oriImg;
           k = k+1;
           im_ = single(rgbImg) ; % note: 255 range
           im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
           im_ = im_ - net.meta.normalization.averageImage ;
           res = vl_simplenn(net, im_) ;
           featVec = res(19).x;
           featVec = featVec(:);
           feat = [feat; featVec'];
           fprintf('extract %d image\n\n', i);
           rgbImgList{k,1} = tmpNam;
           clear rgbImg;
       end
    end
    %归一化
    feat = normalize1(feat);
    save('Feat4096Norml.mat','feat', 'rgbImgList', '-v7.3');
    其中那个mat可以由语句:urlwrite(...'http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.mat',...'imagenet-vgg-f.mat'); 进行下载!或者直接去http://www.vlfeat.org/matconvnet/models/点击打开链接   这里快速下载!结果可以看到是一个特征矩阵feat:每一张图片的特征是一个4096维的行向量:

    我用这个程序提取我的文件夹下图片特征  我的图片以0.bmp、1.bmp、2.bmp...这样命名  用上面的程序发现提取的特征是乱序的 因为它rgbImgList里是按0.bmp、1.bmp、1001.bmp...999.bmp这样来读取的  而我的文件夹前623张都属于第一类   后面都属于第2类 这样读取不方便我找到原来的标签  所以我改成了按顺序读取并提取特征然后按顺序保存  如下:

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %按文件夹图片顺序提取对应图片特征并保存  用vgg模型
    run(fullfile('D:\MATLAB_code\matconvnet-1.0-beta20\matlab\vl_setupnn.m')) ;
    net = load('D:\MATLAB_code\matconvnet-1.0-beta20\CNN-for-Image-Retrieval-master\imagenet-vgg-f.mat');
    feat = [];
    rgbImgList = {};
    facepath='D:\MATLAB_code\matconvnet-1.0-beta20\data\toExtractFeature\';
    newpath=facepath;
    for j=0:1039
           k=j+1;
           facepath=newpath;
           facepath=strcat(facepath,num2str(j));
           facepath=strcat(facepath,'.bmp');
           oriImg=imread(facepath);
           oriImg=imresize(oriImg,[224 224]);
           tmpNam =strcat(num2str(j),'.bmp');
          if size(oriImg, 3) == 3
              im_ = single(oriImg) ; % note: 255 range
              im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
              im_ = im_ - net.meta.normalization.averageImage ;
              res = vl_simplenn(net, im_) ;
              featVec = res(19).x;
              featVec = featVec(:);
              feat = [feat; featVec'];
              fprintf('extract %d image\n\n', j);
              rgbImgList{k,1} = tmpNam;
          else
              rgbImg(:,:,1) = oriImg;
              rgbImg(:,:,2) = oriImg;
              rgbImg(:,:,3) = oriImg;
              im_ = single(rgbImg) ; % note: 255 range
              im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
              im_ = im_ - net.meta.normalization.averageImage ;
              res = vl_simplenn(net, im_) ;
              featVec = res(19).x;
              featVec = featVec(:);
              feat = [feat; featVec'];
              fprintf('extract %d image\n\n',j);
              rgbImgList{k,1} = tmpNam;
              clear rgbImg;
           end
    end
    labels=zeros(1,1040);
    labels(624:end)=1;
    feat = normalize1(feat);
    save('FeatureBchannel9.5.mat','feat', 'rgbImgList','labels');
    结果:

    这就是按顺序来了!

    /

    有时候当训练出模型后,提取特征时,当运行到第二句:


    打开看这个net:

    class是一个向量 而不是一个数标量,如果继续提取特征会报错,这里就手动把net.net.layers{1,8}.class=2  因为我是2类  所以这样改   几类就改成几   或者把type改成softmax 一样的效果  接下来就不报错了   我觉得这样改怪怪的  但我同事说他看到一个demo就是把type改成softmax  我试了两种方法都可以。。。。。其实我之前自己训练的class自动就是2  而不是一个向量  不需要改 直接提取特征  我觉得那样才是好的。如果需要改动,那我总感觉是人为改变的。。。。。。。但如果报错还是这样改吧!


    展开全文
  • 关于图像特征提取

    万次阅读 多人点赞 2010-01-17 19:30:00
    网上发现一篇不错的文章,是关于图像特征提取的,给自己做的项目有点类似,发出来供大家参考。 特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像...

     网上发现一篇不错的文章,是关于图像特征提取的,给自己做的项目有点类似,发出来供大家参考。

           特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。

    特征的定义

            至今为止特征没有万能和精确的定义。特征的精确定义往往由问题或者应用类型决定。特征是一个数字图像中“有趣”的部分,它是许多计算机图像分析算法的起点。因此一个算法是否成功往往由它使用和定义的特征决定。因此特征提取最重要的一个特性是“可重复性”:同一场景的不同图像所提取的特征应该是相同的。

            特征提取是图象处理中的一个初级运算,也就是说它是对一个图像进行的第一个运算处理。它检查每个像素来确定该像素是否代表一个特征。假如它是一个更大的算法的一部分,那么这个算法一般只检查图像的特征区域。作为特征提取的一个前提运算,输入图像一般通过高斯模糊核在尺度空间中被平滑。此后通过局部导数运算来计算图像的一个或多个特征。

           有时,假如特征提取需要许多的计算时间,而可以使用的时间有限制,一个高层次算法可以用来控制特征提取阶层,这样仅图像的部分被用来寻找特征。

            由于许多计算机图像算法使用特征提取作为其初级计算步骤,因此有大量特征提取算法被发展,其提取的特征各种各样,它们的计算复杂性和可重复性也非常不同。


    边缘
            边缘是组成两个图像区域之间边界(或边缘)的像素。一般一个边缘的形状可以是任意的,还可能包括交叉点。在实践中边缘一般被定义为图像中拥有大的梯度的点组成的子集。一些常用的算法还会把梯度高的点联系起来来构成一个更完善的边缘的描写。这些算法也可能对边缘提出一些限制。

    局部地看边缘是一维结构。



            角是图像中点似的特征,在局部它有两维结构。早期的算法首先进行边缘检测,然后分析边缘的走向来寻找边缘突然转向(角)。后来发展的算法不再需要边缘检测这个步骤,而是可以直接在图像梯度中寻找高度曲率。后来发现这样有时可以在图像中本来没有角的地方发现具有同角一样的特征的区域。


    区域
           与角不同的是区域描写一个图像中的一个区域性的结构,但是区域也可能仅由一个像素组成,因此许多区域检测也可以用来监测角。一个区域监测器检测图像中一个对于角监测器来说太平滑的区域。区域检测可以被想象为把一张图像缩小,然后在缩小的图像上进行角检测。



            长条形的物体被称为脊。在实践中脊可以被看作是代表对称轴的一维曲线,此外局部针对于每个脊像素有一个脊宽度。从灰梯度图像中提取脊要比提取边缘、角和区域困难。在空中摄影中往往使用脊检测来分辨道路,在医学图像中它被用来分辨血管。


    特征抽取
            特征被检测后它可以从图像中被抽取出来。这个过程可能需要许多图像处理的计算机。其结果被称为特征描述或者特征向量。


    常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。

    一 颜色特征

    (一)特点:颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征,此时所有属于图像或图像区域的像素都有各自的贡献。由于颜色对图像或图像区域的方向、大小等变化不敏感,所以颜色特征不能很好地捕捉图像中对象的局部特征。另外,仅使用颜色特征查询时,如果数据库很大,常会将许多不需要的图像也检索出来。颜色直方图是最常用的表达颜色特征的方法,其优点是不受图像旋转和平移变化的影响,进一步借助归一化还可不受图像尺度变化的影响,基缺点是没有表达出颜色空间分布的信息。

    (二)常用的特征提取与匹配方法

    (1) 颜色直方图

            其优点在于:它能简单描述一幅图像中颜色的全局分布,即不同色彩在整幅图像中所占的比例,特别适用于描述那些难以自动分割的图像和不需要考虑物体空间位置的图像。其缺点在于:它无法描述图像中颜色的局部分布及每种色彩所处的空间位置,即无法描述图像中的某一具体的对象或物体。

             最常用的颜色空间:RGB颜色空间、HSV颜色空间。

             颜色直方图特征匹配方法:直方图相交法、距离法、中心距法、参考颜色表法、累加颜色直方图法。

    (2) 颜色集

            颜色直方图法是一种全局颜色特征提取与匹配方法,无法区分局部颜色信息。颜色集是对颜色直方图的一种近似首先将图像从 RGB颜色空间转化成视觉均衡的颜色空间(如 HSV 空间),并将颜色空间量化成若干个柄。然后,用色彩自动分割技术将图像分为若干区域,每个区域用量化颜色空间的某个颜色分量来索引,从而将图像表达为一个二进制的颜色索引集。在图像匹配中,比较不同图像颜色集之间的距离和色彩区域的空间关系

    (3) 颜色矩

            这种方法的数学基础在于:图像中任何的颜色分布均可以用它的矩来表示。此外,由于颜色分布信息主要集中在低阶矩中,因此,仅采用颜色的一阶矩(mean)、二阶矩(variance)和三阶矩(skewness)就足以表达图像的颜色分布。

    (4) 颜色聚合向量

            其核心思想是:将属于直方图每一个柄的像素分成两部分,如果该柄内的某些像素所占据的连续区域的面积大于给定的阈值,则该区域内的像素作为聚合像素,否则作为非聚合像素。

    (5) 颜色相关图

    二 纹理特征

    (一)特点:纹理特征也是一种全局特征,它也描述了图像或图像区域所对应景物的表面性质。但由于纹理只是一种物体表面的特性,并不能完全反映出物体的本质属性,所以仅仅利用纹理特征是无法获得高层次图像内容的。与颜色特征不同,纹理特征不是基于像素点的特征,它需要在包含多个像素点的区域中进行统计计算。在模式匹配中,这种区域性的特征具有较大的优越性,不会由于局部的偏差而无法匹配成功。作为一种统计特征,纹理特征常具有旋转不变性,并且对于噪声有较强的抵抗能力。但是,纹理特征也有其缺点,一个很明显的缺点是当图像的分辨率变化的时候,所计算出来的纹理可能会有较大偏差。另外,由于有可能受到光照、反射情况的影响,从2-D图像中反映出来的纹理不一定是3-D物体表面真实的纹理。

            例如,水中的倒影,光滑的金属面互相反射造成的影响等都会导致纹理的变化。由于这些不是物体本身的特性,因而将纹理信息应用于检索时,有时这些虚假的纹理会对检索造成“误导”。

            在检索具有粗细、疏密等方面较大差别的纹理图像时,利用纹理特征是一种有效的方法。但当纹理之间的粗细、疏密等易于分辨的信息之间相差不大的时候,通常的纹理特征很难准确地反映出人的视觉感觉不同的纹理之间的差别。

    (二)常用的特征提取与匹配方法 

      纹理特征描述方法分类

    (1)统计方法统计方法的典型代表是一种称为灰度共生矩阵的纹理特征分析方法Gotlieb 和 Kreyszig 等人在研究共生矩阵中各种统计特征基础上,通过实验,得出灰度共生矩阵的四个关键特征:能量、惯量、熵和相关性。统计方法中另一种典型方法,则是从图像的自相关函数(即图像的能量谱函数)提取纹理特征,即通过对图像的能量谱函数的计算,提取纹理的粗细度及方向性等特征参数

    (2)几何法

            所谓几何法,是建立在纹理基元(基本的纹理元素)理论基础上的一种纹理特征分析方法。纹理基元理论认为,复杂的纹理可以由若干简单的纹理基元以一定的有规律的形式重复排列构成。在几何法中,比较有影响的算法有两种:Voronio 棋盘格特征法和结构法。

    (3)模型法

            模型法以图像的构造模型为基础,采用模型的参数作为纹理特征。典型的方法是随机场模型法,如马尔可夫(Markov)随机场(MRF)模型法和 Gibbs 随机场模型法

    (4)信号处理法

            纹理特征的提取与匹配主要有:灰度共生矩阵、Tamura 纹理特征、自回归纹理模型、小波变换等。

            灰度共生矩阵特征提取与匹配主要依赖于能量、惯量、熵和相关性四个参数。Tamura 纹理特征基于人类对纹理的视觉感知心理学研究,提出6种属性,即:粗糙度、对比度、方向度、线像度、规整度和粗略度。自回归纹理模型(simultaneous auto-regressive, SAR)是马尔可夫随机场(MRF)模型的一种应用实例。

    三 形状特征

    (一)特点:各种基于形状特征的检索方法都可以比较有效地利用图像中感兴趣的目标来进行检索,但它们也有一些共同的问题,包括:①目前基于形状的检索方法还缺乏比较完善的数学模型;②如果目标有变形时检索结果往往不太可靠;③许多形状特征仅描述了目标局部的性质,要全面描述目标常对计算时间和存储量有较高的要求;④许多形状特征所反映的目标形状信息与人的直观感觉不完全一致,或者说,特征空间的相似性与人视觉系统感受到的相似性有差别。另外,从 2-D 图像中表现的 3-D 物体实际上只是物体在空间某一平面的投影,从 2-D 图像中反映出来的形状常不是 3-D 物体真实的形状,由于视点的变化,可能会产生各种失真。

    (二)常用的特征提取与匹配方法

    Ⅰ几种典型的形状特征描述方法

            通常情况下,形状特征有两类表示方法,一类是轮廓特征,另一类是区域特征。图像的轮廓特征主要针对物体的外边界,而图像的区域特征则关系到整个形状区域。

    几种典型的形状特征描述方法:

    (1)边界特征法该方法通过对边界特征的描述来获取图像的形状参数。其中Hough 变换检测平行直线方法和边界方向直方图方法是经典方法。Hough 变换是利用图像全局特性而将边缘像素连接起来组成区域封闭边界的一种方法,其基本思想是点—线的对偶性;边界方向直方图法首先微分图像求得图像边缘,然后,做出关于边缘大小和方向的直方图,通常的方法是构造图像灰度梯度方向矩阵。

    (2)傅里叶形状描述符法

            傅里叶形状描述符(Fourier shape deors)基本思想是用物体边界的傅里叶变换作为形状描述,利用区域边界的封闭性和周期性,将二维问题转化为一维问题。

            由边界点导出三种形状表达,分别是曲率函数、质心距离、复坐标函数。

    (3)几何参数法

            形状的表达和匹配采用更为简单的区域特征描述方法,例如采用有关形状定量测度(如矩、面积、周长等)的形状参数法(shape factor)。在 QBIC 系统中,便是利用圆度、偏心率、主轴方向和代数不变矩等几何参数,进行基于形状特征的图像检索。

            需要说明的是,形状参数的提取,必须以图像处理及图像分割为前提,参数的准确性必然受到分割效果的影响,对分割效果很差的图像,形状参数甚至无法提取。

    (4)形状不变矩法

    利用目标所占区域的矩作为形状描述参数。

    (5)其它方法

            近年来,在形状的表示和匹配方面的工作还包括有限元法(Finite Element Method 或 FEM)、旋转函数(Turning )和小波描述符(Wavelet Deor)等方法。

    Ⅱ 基于小波和相对矩的形状特征提取与匹配

            该方法先用小波变换模极大值得到多尺度边缘图像,然后计算每一尺度的 7个不变矩,再转化为 10 个相对矩,将所有尺度上的相对矩作为图像特征向量,从而统一了区域和封闭、不封闭结构。

    四 空间关系特征

    (一)特点:所谓空间关系,是指图像中分割出来的多个目标之间的相互的空间位置或相对方向关系,这些关系也可分为连接/邻接关系、交叠/重叠关系和包含/包容关系等。通常空间位置信息可以分为两类:相对空间位置信息和绝对空间位置信息。前一种关系强调的是目标之间的相对情况,如上下左右关系等,后一种关系强调的是目标之间的距离大小以及方位。显而易见,由绝对空间位置可推出相对空间位置,但表达相对空间位置信息常比较简单。

            空间关系特征的使用可加强对图像内容的描述区分能力,但空间关系特征常对图像或目标的旋转、反转、尺度变化等比较敏感。另外,实际应用中,仅仅利用空间信息往往是不够的,不能有效准确地表达场景信息。为了检索,除使用空间关系特征外,还需要其它特征来配合。

    (二)常用的特征提取与匹配方法

            提取图像空间关系特征可以有两种方法:一种方法是首先对图像进行自动分割,划分出图像中所包含的对象或颜色区域,然后根据这些区域提取图像特征,并建立索引;另一种方法则简单地将图像均匀地划分为若干规则子块,然后对每个图像子块提取特征,并建立索引。
    姿态估计问题就是:确定某一三维目标物体的方位指向问题。姿态估计在机器人视觉、动作跟踪和单照相机定标等很多领域都有应用。

            在不同领域用于姿态估计的传感器是不一样的,在这里主要讲基于视觉的姿态估计。

            基于视觉的姿态估计根据使用的摄像机数目又可分为单目视觉姿态估计和多目视觉姿态估计。根据算法的不同又可分为基于模型的姿态估计和基于学习的姿态估计。

    一基于模型的姿态估计方法

            基于模型的方法通常利用物体的几何关系或者物体的特征点来估计。其基本思想是利用某种几何模型或结构来表示物体的结构和形状,并通过提取某些物体特征,在模型和图像之间建立起对应关系,然后通过几何或者其它方法实现物体空间姿态的估计。这里所使用的模型既可能是简单的几何形体,如平面、圆柱,也可能是某种几何结构,也可能是通过激光扫描或其它方法获得的三维模型。

            基于模型的姿态估计方法是通过比对真实图像和合成图像,进行相似度计算更新物体姿态。目前基于模型的方法为了避免在全局状态空间中进行优化搜索,一般都将优化问题先降解成多个局部特征的匹配问题,非常依赖于局部特征的准确检测。当噪声较大无法提取准确的局部特征的时候,该方法的鲁棒性受到很大影响。

    二基于学习的姿态估计方法

            基于学习的方法借助于机器学习(machine learning)方法,从事先获取的不同姿态下的训练样本中学习二维观测与三维姿态之间的对应关系,并将学习得到的决策规则或回归函数应用于样本,所得结果作为对样本的姿态估计。基于学习的方法一般采用全局观测特征,不需检测或识别物体的局部特征,具有较好的鲁棒性。其缺点是由于无法获取在高维空间中进行连续估计所需要的密集采样,因此无法保证姿态估计的精度与连续性。

            基于学习的姿态估计方法源于姿态识别方法的思想。姿态识别需要预先定义多个姿态类别,每个类别包含了一定的姿态范围;然后为每个姿态类别标注若干训练样本,通过模式分类的方法训练姿态分类器以实现姿态识别。

            这一类方法并不需要对物体进行建模,一般通过图像的全局特征进行匹配分析,可以有效的避免局部特征方法在复杂姿态和遮挡关系情况下出现的特征匹配歧义性问题。然而姿态识别方法只能将姿态划分到事先定义的几个姿态类别中,并不能对姿态进行连续的精确的估计。

            基于学习的方法一般采用全局观测特征,可以保证算法具有较好的鲁棒性。然而这一类方法的姿态估计精度很大程度依赖于训练的充分程度。要想比较精确地得到二维观测与三维姿态之间的对应关系,就必须获取足够密集的样本来学习决策规则和回归函数。而一般来说所需要样本的数量是随状态空间的维度指数级增加的,对于高维状态空间,事实上不可能获取进行精确估计所需要的密集采样。因此,无法得到密集采样而难以保证估计的精度与连续性,是基于学习的姿态估计方法无法克服的根本困难。

            和姿态识别等典型的模式分类问题不同的是,姿态估计输出的是一个高维的姿态向量,而不是某个类别的类标。因此这一类方法需要学习的是一个从高维观测向量到高维姿态向量的映射,目前这在机器学习领域中还是一个非常困难的问题。

            特征是描述模式的最佳方式,且我们通常认为特征的各个维度能够从不同的角度描述模式,在理想情况下,维度之间是互补完备的。

            特征提取的主要目的是降维。特征抽取的主要思想是将原始样本投影到一个低维特征空间,得到最能反应样本本质或进行样本区分的低维样本特征。

            一般图像特征可以分为四类:直观性特征、灰度统计特征、变换系数特征与代数特征。

            直观性特征主要指几何特征,几何特征比较稳定,受人脸的姿态变化与光照条件等因素的影响小,但不易抽取,而且测量精度不高,与图像处理技术密切相关。

            代数特征是基于统计学习方法抽取的特征。代数特征具有较高的识别精度,代数特征抽取方法又可以分为两类:一种是线性投影特征抽取方法;另外一种是非线性特征抽取方法。

            习惯上,将基于主分量分析和Fisher线性鉴别分析所获得的特征抽取方法,统称为线性投影分析。

           基于线性投影分析的特征抽取方法,其基本思想是根据一定的性能目标来寻找一线性变换,把原始信号数据压缩到一个低维子空间,使数据在子空间中的分布更加紧凑,为数据的更好描述提供手段,同时计算的复杂度得到大大降低。在线性投影分析中,以主分量分析(PCA,或称K-L变换)和Fisher线性鉴别分析(LDA)最具代表性,围绕这两种方法所形成的特征抽取算法,已成为模式识别领域中最为经典和广泛使用的方法。

            线性投影分析法的主要缺点为:需要对大量的已有样本进行学习,且对定位、光照与物体非线性形变敏感,因而采集条件对识别性能影响较大。

            非线性特征抽取方法也是研究的热点之一。“核技巧”最早应用在SVM中,KPCA和KFA是“核技巧”的推广应用。

            核投影方法的基本思想是将原样本空间中的样本通过某种形式的非线性映射,变换到一个高维甚至无穷维的空间,并借助于核技巧在新的空间中应用线性的分析方法求解。由于新空间中的线性方向也对应原样本空间的非线性方向,所以基于核的投影分析得出的投影方向也对应原样本空间的非线性方向。

            核投影方法也有一些弱点:几何意义不明确,无法知道样本在非显式映射后变成了什么分布模式;核函数中参数的选取没有相应选择标准,大多数只能采取经验参数选取;不适合训练样本很多的情况,原因是经过核映射后,样本的维数等于训练样本的个数,如果训练样本数目很大,核映射后的向量维数将会很高,并将遇到计算量上的难题。

             就应用领域来说,KPCA远没有PCA应用的广泛。如果作为一般性的降维KPCA确实比PCA效果好,特别是特征空间不是一般的欧式空间的时候更为明显。PCA可以通过大量的自然图片学习一个子空间,但是KPCA做不到。

            变换系数特征指先对图像进行Fourier变换、小波变换等,得到的系数后作为特征进行识别。

    展开全文
  • SIFT特征提取分析

    万次阅读 多人点赞 2012-06-06 22:06:09
    SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征进行图像特征点匹配,...

    SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配,获得了良好效果,详细解析如下:

    算法描述

    SIFT特征不只具有尺度不变性,即使改变旋转角度,图像亮度或拍摄视角,仍然能够得到好的检测效果。整个算法分为以下几个部分:

    1. 构建尺度空间

    这是一个初始化操作,尺度空间理论目的是模拟图像数据的多尺度特征

    高斯卷积核是实现尺度变换的唯一线性核,于是一副二维图像的尺度空间定义为:


    其中 G(x,y,σ) 是尺度可变高斯函数 

    (x,y)是空间坐标,是尺度坐标。σ大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的σ值对应粗糙尺度(低分辨率),反之,对应精细尺度(高分辨率)。为了有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG scale-space)。利用不同尺度的高斯差分核与图像卷积生成。

    下图所示不同σ下图像尺度空间:



    关于尺度空间的理解说明:2kσ中的2是必须的,尺度空间是连续的。在  Lowe的论文中 ,将第0层的初始尺度定为1.6(最模糊),图片的初始尺度定为0.5(最清晰). 在检测极值点前对原始图像的高斯平滑以致图像丢失高频信息,所以 Lowe 建议在建立尺度空间前首先对原始图像长宽扩展一倍,以保留原始图像信息,增加特征点数量。尺度越大图像越模糊。 


    图像金字塔的建立:对于一幅图像I,建立其在不同尺度(scale)的图像,也成为子八度(octave),这是为了scale-invariant,也就是在任何尺度都能够有对应的特征点,第一个子八度的scale为原图大小,后面每个octave为上一个octave降采样的结果,即原图的1/4(长宽分别减半),构成下一个子八度(高一层金字塔)。



    尺度空间的所有取值,i为octave的塔数(第几个塔),s为每塔层数

    由图片size决定建几个塔,每塔几层图像(S一般为3-5)0塔的第0层是原始图像(或你double后的图像),往上每一层是对其下一层进行Laplacian变换(高斯卷积,其中σ值渐大,例如可以是σ, k*σ, k*k*σ),直观上看来越往上图片越模糊。塔间的图片是降采样关系,例如1塔的第0层可以由0塔的第3down sample得到,然后进行与0塔类似的高斯卷积操作。


    2. LoG近似DoG找到关键点<检测DOG尺度空间极值点>

    为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点,如图所示。


    同一组中的相邻尺度(由于k的取值关系,肯定是上下层)之间进行寻找


    s=3的情况

     在极值比较的过程中,每一组图像的首末两层是无法进行极值比较的,为了满足尺度变化的连续性(下面有详解)
    我们在每一组图像的顶层继续用高斯模糊生成了 3 幅图像,高斯金字塔有每组S+3层图像。DOG金字塔每组有S+2层图像.

    ==========================================
    这里有的童鞋不理解什么叫“为了满足尺度变化的连续性”,现在做仔细阐述:
    假设s=3,也就是每个塔里有3层,则k=21/s=21/3,那么按照上图可得Gauss Space和DoG space 分别有3个(s个)和2个(s-1个)分量,在DoG space中,1st-octave两项分别是σ,kσ; 2nd-octave两项分别是2σ,2kσ;由于无法比较极值,我们必须在高斯空间继续添加高斯模糊项,使得形成σ,kσ,k2σ,k3σ,k4σ这样就可以选择DoG space中的中间三项kσ,k2σ,k3σ(只有左右都有才能有极值),那么下一octave中(由上一层降采样获得)所得三项即为2kσ,2k2σ,2k3σ,其首项2kσ=24/3。刚好与上一octave末项k3σ=23/3尺度变化连续起来,所以每次要在Gaussian space添加3项,每组(塔)共S+3层图像,相应的DoG金字塔有S+2层图像。
    ==========================================

    使用Laplacian of Gaussian能够很好地找到找到图像中的兴趣点,但是需要大量的计算量,所以使用Difference of Gaussian图像的极大极小值近似寻找特征点.DOG算子计算简单,是尺度归一化的LoG算子的近似,有关DOG寻找特征点的介绍及方法详见http://blog.csdn.net/abcjennifer/article/details/7639488极值点检测用的Non-Maximal Suppression


    3. 除去不好的特征点

    这一步本质上要去掉DoG局部曲率非常不对称的像素。


    通过拟和三维二次函数以精确确定关键点的位置和尺度(达到亚像素精度),同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力,在这里使用近似Harris Corner检测器。

    ①空间尺度函数泰勒展开式如下:对上式求导,并令其为0,得到精确的位置, 得

    ②在已经检测到的特征点中,要去掉低对比度的特征点和不稳定的边缘响应点。去除低对比度的点:把公式(2)代入公式(1),即在DoG Space的极值点处D(x)取值,只取前两项可得:


    若   ,该特征点就保留下来,否则丢弃。

    ③边缘响应的去除
    一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。主曲率通过一个2×2 的Hessian矩阵H求出:

    导数由采样点相邻差估计得到。

    D的主曲率和H的特征值成正比,令α为较大特征值,β为较小的特征值,则

    令α=γβ,则

     (r + 1)2/r的值在两个特征值相等的时候最小,随着r的增大而增大,因此,为了检测主曲率是否在某域值r下,只需检测

    if (α+β)/ αβ> (r+1)2/r, throw it out.   在Lowe的文章中,取r=10。



    4. 给特征点赋值一个128维方向参数

    上一步中确定了每幅图中的特征点,为每个特征点计算一个方向,依照这个方向做进一步的计算, 利用关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数,使算子具备旋转不变性。


    为(x,y)处梯度的模值和方向公式。其中L所用的尺度为每个关键点各自所在的尺度。至此,图像的关键点已经检测完毕,每个关键点有三个信息:位置,所处尺度、方向,由此可以确定一个SIFT特征区域。


    梯度直方图的范围是0~360度,其中每10度一个柱,总共36个柱。随着距
          中心点越远的领域其对直方图的贡献也响应减小.Lowe论文中还提到要使用高斯函数对直方图进行平滑,减少突变的影响。

    在实际计算时,我们在以关键点为中心的邻域窗口内采样,并用直方图统计邻域像素的梯度方向。梯度直方图的范围是0~360度,其中每45度一个柱,总共8个柱, 或者每10度一个柱,总共36个柱。Lowe论文中还提到要使用高斯函数对直方图进行平滑,减少突变的影响。直方图的峰值则代表了该关键点处邻域梯度的主方向,即作为该关键点的方向


    直方图中的峰值就是主方向,其他的达到最大值80%的方向可作为辅助方向

    由梯度方向直方图确定主梯度方向

    该步中将建立所有scale中特征点的描述子(128维)

    Identify peak and assign orientation and sum of magnitude to key point.
      The user may choose a threshold to exclude key points based on their assigned sum of magnitudes.


    关键点描述子的生成步骤


     通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。


    5. 关键点描述子的生成

    首先将坐标轴旋转为关键点的方向,以确保旋转不变性。以关键点为中心取8×8的窗口。

    Figure.16*16的图中其中1/4的特征点梯度方向及scale,右图为其加权到8个主方向后的效果。

    图左部分的中央为当前关键点的位置,每个小格代表关键点邻域所在尺度空间的一个像素,利用公式求得每个像素的梯度幅值与梯度方向,箭头方向代表该像素的梯度方向,箭头长度代表梯度模值,然后用高斯窗口对其进行加权运算。


    图中蓝色的圈代表高斯加权的范围(越靠近关键点的像素梯度方向信息贡献越大)。然后在每4×4的小块上计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值,即可形成一个种子点,如图右部分示。此图中一个关键点由2×2共4个种子点组成,每个种子点有8个方向向量信息。这种邻域方向性信息联合的思想增强了算法抗噪声的能力,同时对于含有定位误差的特征匹配也提供了较好的容错性。


    计算keypoint周围的16*16的window中每一个像素的梯度,而且使用高斯下降函数降低远离中心的权重。

    在每个4*4的1/16象限中,通过加权梯度值加到直方图8个方向区间中的一个,计算出一个梯度方向直方图。

    这样就可以对每个feature形成一个4*4*8=128维的描述子,每一维都可以表示4*4个格子中一个的scale/orientation. 将这个向量归一化之后,就进一步去除了光照的影响。

    5. 根据SIFT进行Match

    生成了A、B两幅图的描述子,(分别是k1*128维和k2*128维),就将两图中各个scale(所有scale)的描述子进行匹配,匹配上128维即可表示两个特征点match上了。


    实际计算过程中,为了增强匹配的稳健性,Lowe建议对每个关键点使用4×4共16个种子点来描述,这样对于一个关键点就可以产生128个数据,即最终形成128维的SIFT特征向量。此时SIFT特征向量已经去除了尺度变化、旋转等几何变形因素的影响,再继续将特征向量的长度归一化,则可以进一步去除光照变化的影响。 当两幅图像的SIFT特征向量生成后,下一步我们采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,Lowe提出了比较最近邻距离与次近邻距离的方法,距离比率ratio小于某个阈值的认为是正确匹配。因为对于错误匹配,由于特征空间的高维性,相似的距离可能有大量其他的错误匹配,从而它的ratio值比较高。Lowe推荐ratio的阈值为0.8。但作者对大量任意存在尺度、旋转和亮度变化的两幅图片进行匹配,结果表明ratio取值在0. 4~0. 6之间最佳,小于0. 4的很少有匹配点,大于0. 6的则存在大量错误匹配点。(如果这个地方你要改进,最好给出一个匹配率和ration之间的关系图,这样才有说服力)作者建议ratio的取值原则如下:

    ratio=0. 4 对于准确度要求高的匹配;
    ratio=0. 6 对于匹配点数目要求比较多的匹配; 
    ratio=0. 5 一般情况下。
    也可按如下原则:当最近邻距离<200时ratio=0. 6,反之ratio=0. 4。ratio的取值策略能排分错误匹配点。



    当两幅图像的SIFT特征向量生成后,下一步我们采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。

     

    实验结果:







    Python+opencv实现:


    import cv2
    import numpy as np
    #import pdb
    #pdb.set_trace()#turn on the pdb prompt
    
    #read image
    img = cv2.imread('D:\privacy\picture\little girl.jpg',cv2.IMREAD_COLOR)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imshow('origin',img);
    
    #SIFT
    detector = cv2.SIFT()
    keypoints = detector.detect(gray,None)
    img = cv2.drawKeypoints(gray,keypoints)
    #img = cv2.drawKeypoints(gray,keypoints,flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    cv2.imshow('test',img);
    cv2.waitKey(0)
    cv2.destroyAllWindows()



    C实现:


    // FeatureDetector.cpp : Defines the entry point for the console application.
    //  
    //  Created by Rachel on 14-1-12.  
    //  Copyright (c) 2013年 ZJU. All rights reserved.  
    //  
    
    #include "stdafx.h"
    #include "highgui.h"
    #include "cv.h"
    #include "vector"
    #include "opencv\cxcore.hpp"
    #include "iostream"
    #include "opencv.hpp"
    #include "nonfree.hpp"
    #include "showhelper.h"
    
    using namespace cv;
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	//Load Image 
    	Mat c_src1 =  imread( "..\\Images\\3.jpg");
    	Mat c_src2 = imread("..\\Images\\4.jpg");
    	Mat src1 = imread( "..\\Images\\3.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    	Mat src2 = imread( "..\\Images\\4.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    	if( !src1.data || !src2.data )
    	{ std::cout<< " --(!) Error reading images " << std::endl; return -1; }
    
    	//sift feature detect
    	SiftFeatureDetector detector;
    	std::vector<KeyPoint> kp1, kp2;
    
    	detector.detect( src1, kp1 );
    	detector.detect( src2, kp2 );
    	SiftDescriptorExtractor extractor;
    	Mat des1,des2;//descriptor
    	extractor.compute(src1,kp1,des1);
    	extractor.compute(src2,kp2,des2);	
    	Mat res1,res2; 
    	int drawmode = DrawMatchesFlags::DRAW_RICH_KEYPOINTS;
    	drawKeypoints(c_src1,kp1,res1,Scalar::all(-1),drawmode);//在内存中画出特征点
    	drawKeypoints(c_src2,kp2,res2,Scalar::all(-1),drawmode);
    	cout<<"size of description of Img1: "<<kp1.size()<<endl;
    	cout<<"size of description of Img2: "<<kp2.size()<<endl;
    
    	//write the size of features on picture
    	CvFont font;    
    	double hScale=1;   
    	double vScale=1;    
    	int lineWidth=2;// 相当于写字的线条    
    	cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth);//初始化字体,准备写到图片上的   
    	// cvPoint 为起笔的x,y坐标   
    	IplImage* transimg1 = cvCloneImage(&(IplImage) res1);
    	IplImage* transimg2 = cvCloneImage(&(IplImage) res2);
    		
    	char str1[20],str2[20];
    	sprintf(str1,"%d",kp1.size());
    	sprintf(str2,"%d",kp2.size());
    
    
    	const char* str = str1;
    	cvPutText(transimg1,str1,cvPoint(280,230),&font,CV_RGB(255,0,0));//在图片中输出字符 
    
    	str = str2;
    	cvPutText(transimg2,str2,cvPoint(280,230),&font,CV_RGB(255,0,0));//在图片中输出字符 
    
    	//imshow("Description 1",res1);
    	cvShowImage("descriptor1",transimg1);
    	cvShowImage("descriptor2",transimg2);
    
    	BFMatcher matcher(NORM_L2);
    	vector<DMatch> matches;
    	matcher.match(des1,des2,matches);
    	Mat img_match;
    	drawMatches(src1,kp1,src2,kp2,matches,img_match);//,Scalar::all(-1),Scalar::all(-1),vector<char>(),drawmode);
    	cout<<"number of matched points: "<<matches.size()<<endl;
    	imshow("matches",img_match);
    	cvWaitKey();
    	cvDestroyAllWindows();
    
    	return 0;
    }
    





    ===============================
    基本概念及一些补充
    什么是局部特征?
      •局部特征从总体上说是图像或在视觉领域中一些有别于其周围的地方
      •局部特征通常是描述一块区域,使其能具有高可区分度
      •局部特征的好坏直接会决定着后面分类、识别是否会得到一个好的结果
     局部特征需具备的特性
      •重复性
      •可区分性
      •准确性
      •数量以及效率
      •不变性
     局部特征提取算法-sift
      •SIFT算法由D.G.Lowe 1999年提出,2004年完善总结。后来Y.Ke将其描述子部分用PCA代替直方图的方式,对其进行改进。
       •SIFT算法是一种提取局部特征的算法,在尺度空间寻找极值点,提取位置,尺度,旋转不变量
      •SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
      •独特性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配。
      •多量性,即使少数的几个物体也可以产生大量SIFT特征向量。
      •可扩展性,可以很方便的与其他形式的特征向量进行联合。
    尺度空间理论
      •尺度空间理论目的是模拟图像数据的多尺度特征
      •其基本思想是在视觉信息图像信息处理模型中引入一个被视为尺度的参数, 通过连续变化尺度参数获得不同尺度下的视觉处理信息, 然后综合这些信息以深入地挖掘图像的本质特征。
    描述子生成的细节
      •以极值点为中心点,并且以此点所处于的高斯尺度sigma值作为半径因子。对于远离中心点的梯度值降低对其所处区域的直方图的贡献,防止一些突变的影响。
      •每个极值点对其进行三线性插值,这样可以把此极值点的贡献均衡的分到直方图中相邻的柱子上
    归一化处理
      •在求出4*4*8的128维特征向量后,此时SIFT特征向量已经去除了尺度变化、旋转等几何变形因素的影响。而图像的对比度变化相当于每个像素点乘上一个因子,光照变化是每个像素点加上一个值,但这些对图像归一化的梯度没有影响。因此将特征向量的长度归一化,则可以进一步去除光照变化的影响。
      •对于一些非线性的光照变化,SIFT并不具备不变性,但由于这类变化影响的主要是梯度的幅值变化,对梯度的方向影响较小,因此作者通过限制梯度幅值的值来减少这类变化造成的影响。
    PCA-SIFT算法
      •PCA-SIFT与标准SIFT有相同的亚像素位置,尺度和主方向。但在第4步计算描述子的设计,采用的主成分分析的技术。
      •下面介绍一下其特征描述子计算的部分:
        •用特征点周围的41×41的像斑计算它的主元,并用PCA-SIFT将原来的2×39×39维的向量降成20维,以达到更精确的表示方式。
        •它的主要步骤为,对每一个关键点:在关键点周围提取一个41×41的像斑于给定的尺度,旋转到它的主方向 ;计算39×39水平和垂直的梯度,形成一个大小为3042的矢量;用预先计算好的投影矩阵n×3042与此矢量相乘;这样生成一个大小为n的PCA-SIFT描述子。
    ===============================

    辅助资料:





    ===============================


    Reference:

    Lowe SIFT 原文:http://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf

    SIFT 的C实现:https://github.com/robwhess/opensift/blob/master/src

    MATLAB 应用Sift算子的模式识别方法:http://blog.csdn.net/abcjennifer/article/details/7372880

    http://blog.csdn.net/abcjennifer/article/details/7365882

    http://en.wikipedia.org/wiki/Scale-invariant_feature_transform#David_Lowe.27s_method

    http://blog.sciencenet.cn/blog-613779-475881.html

    http://www.cnblogs.com/linyunzju/archive/2011/06/14/2080950.html

    http://www.cnblogs.com/linyunzju/archive/2011/06/14/2080951.html

    http://blog.csdn.net/ijuliet/article/details/4640624

    http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html  (部分图片有误,以本文中的图片为准)





    关于computer vision的更多讨论与交流,敬请关注本博客和新浪微博Rachel____Zhang






    展开全文
  • 图像特征提取总结

    万次阅读 多人点赞 2018-10-06 17:36:09
     特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者...

    转载地址:https://blog.csdn.net/lskyne/article/details/8654856

      特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。 

    特征的定义 

            至今为止特征没有万能和精确的定义。特征的精确定义往往由问题或者应用类型决定。特征是一个数字图像中“有趣”的部分,它是许多计算机图像分析算法的起点。因此一个算法是否成功往往由它使用和定义的特征决定。因此特征提取最重要的一个特性是“可重复性”:同一场景的不同图像所提取的特征应该是相同的。 

            特征提取是图象处理中的一个初级运算,也就是说它是对一个图像进行的第一个运算处理。它检查每个像素来确定该像素是否代表一个特征。假如它是一个更大的算法的一部分,那么这个算法一般只检查图像的特征区域。作为特征提取的一个前提运算,输入图像一般通过高斯模糊核在尺度空间中被平滑。此后通过局部导数运算来计算图像的一个或多个特征。 

           有时,假如特征提取需要许多的计算时间,而可以使用的时间有限制,一个高层次算法可以用来控制特征提取阶层,这样仅图像的部分被用来寻找特征。 

            由于许多计算机图像算法使用特征提取作为其初级计算步骤,因此有大量特征提取算法被发展,其提取的特征各种各样,它们的计算复杂性和可重复性也非常不同。 


    边缘 
            边缘是组成两个图像区域之间边界(或边缘)的像素。一般一个边缘的形状可以是任意的,还可能包括交叉点。在实践中边缘一般被定义为图像中拥有大的梯度的点组成的子集。一些常用的算法还会把梯度高的点联系起来来构成一个更完善的边缘的描写。这些算法也可能对边缘提出一些限制。 

    局部地看边缘是一维结构。 


    角 
            角是图像中点似的特征,在局部它有两维结构。早期的算法首先进行边缘检测,然后分析边缘的走向来寻找边缘突然转向(角)。后来发展的算法不再需要边缘检测这个步骤,而是可以直接在图像梯度中寻找高度曲率。后来发现这样有时可以在图像中本来没有角的地方发现具有同角一样的特征的区域。 


    区域 
           与角不同的是区域描写一个图像中的一个区域性的结构,但是区域也可能仅由一个像素组成,因此许多区域检测也可以用来监测角。一个区域监测器检测图像中一个对于角监测器来说太平滑的区域。区域检测可以被想象为把一张图像缩小,然后在缩小的图像上进行角检测。 


    脊 
            长条形的物体被称为脊。在实践中脊可以被看作是代表对称轴的一维曲线,此外局部针对于每个脊像素有一个脊宽度。从灰梯度图像中提取脊要比提取边缘、角和区域困难。在空中摄影中往往使用脊检测来分辨道路,在医学图像中它被用来分辨血管。 


    特征抽取 
            特征被检测后它可以从图像中被抽取出来。这个过程可能需要许多图像处理的计算机。其结果被称为特征描述或者特征向量。 


    常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。 

    一 颜色特征 

    (一)特点:颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征,此时所有属于图像或图像区域的像素都有各自的贡献。由于颜色对图像或图像区域的方向、大小等变化不敏感,所以颜色特征不能很好地捕捉图像中对象的局部特征。另外,仅使用颜色特征查询时,如果数据库很大,常会将许多不需要的图像也检索出来。颜色直方图是最常用的表达颜色特征的方法,其优点是不受图像旋转和平移变化的影响,进一步借助归一化还可不受图像尺度变化的影响,基缺点是没有表达出颜色空间分布的信息。 

    (二)常用的特征提取与匹配方法 

    (1) 颜色直方图 

            其优点在于:它能简单描述一幅图像中颜色的全局分布,即不同色彩在整幅图像中所占的比例,特别适用于描述那些难以自动分割的图像和不需要考虑物体空间位置的图像。其缺点在于:它无法描述图像中颜色的局部分布及每种色彩所处的空间位置,即无法描述图像中的某一具体的对象或物体。 

             最常用的颜色空间:RGB颜色空间、HSV颜色空间。 

             颜色直方图特征匹配方法:直方图相交法、距离法、中心距法、参考颜色表法、累加颜色直方图法。 

    (2) 颜色集 

            颜色直方图法是一种全局颜色特征提取与匹配方法,无法区分局部颜色信息。颜色集是对颜色直方图的一种近似首先将图像从 RGB颜色空间转化成视觉均衡的颜色空间(如 HSV 空间),并将颜色空间量化成若干个柄。然后,用色彩自动分割技术将图像分为若干区域,每个区域用量化颜色空间的某个颜色分量来索引,从而将图像表达为一个二进制的颜色索引集。在图像匹配中,比较不同图像颜色集之间的距离和色彩区域的空间关系 

    (3) 颜色矩 

            这种方法的数学基础在于:图像中任何的颜色分布均可以用它的矩来表示。此外,由于颜色分布信息主要集中在低阶矩中,因此,仅采用颜色的一阶矩(mean)、二阶矩(variance)和三阶矩(skewness)就足以表达图像的颜色分布。 

    (4) 颜色聚合向量 

            其核心思想是:将属于直方图每一个柄的像素分成两部分,如果该柄内的某些像素所占据的连续区域的面积大于给定的阈值,则该区域内的像素作为聚合像素,否则作为非聚合像素。 

    (5) 颜色相关图 

    二 纹理特征 

    (一)特点:纹理特征也是一种全局特征,它也描述了图像或图像区域所对应景物的表面性质。但由于纹理只是一种物体表面的特性,并不能完全反映出物体的本质属性,所以仅仅利用纹理特征是无法获得高层次图像内容的。与颜色特征不同,纹理特征不是基于像素点的特征,它需要在包含多个像素点的区域中进行统计计算。在模式匹配中,这种区域性的特征具有较大的优越性,不会由于局部的偏差而无法匹配成功。作为一种统计特征,纹理特征常具有旋转不变性,并且对于噪声有较强的抵抗能力。但是,纹理特征也有其缺点,一个很明显的缺点是当图像的分辨率变化的时候,所计算出来的纹理可能会有较大偏差。另外,由于有可能受到光照、反射情况的影响,从2-D图像中反映出来的纹理不一定是3-D物体表面真实的纹理。 

            例如,水中的倒影,光滑的金属面互相反射造成的影响等都会导致纹理的变化。由于这些不是物体本身的特性,因而将纹理信息应用于检索时,有时这些虚假的纹理会对检索造成“误导”。 

            在检索具有粗细、疏密等方面较大差别的纹理图像时,利用纹理特征是一种有效的方法。但当纹理之间的粗细、疏密等易于分辨的信息之间相差不大的时候,通常的纹理特征很难准确地反映出人的视觉感觉不同的纹理之间的差别。 

    (二)常用的特征提取与匹配方法 

      纹理特征描述方法分类 

    (1)统计方法统计方法的典型代表是一种称为灰度共生矩阵的纹理特征分析方法Gotlieb 和 Kreyszig 等人在研究共生矩阵中各种统计特征基础上,通过实验,得出灰度共生矩阵的四个关键特征:能量、惯量、熵和相关性。统计方法中另一种典型方法,则是从图像的自相关函数(即图像的能量谱函数)提取纹理特征,即通过对图像的能量谱函数的计算,提取纹理的粗细度及方向性等特征参数 

    (2)几何法 

            所谓几何法,是建立在纹理基元(基本的纹理元素)理论基础上的一种纹理特征分析方法。纹理基元理论认为,复杂的纹理可以由若干简单的纹理基元以一定的有规律的形式重复排列构成。在几何法中,比较有影响的算法有两种:Voronio 棋盘格特征法和结构法。 

    (3)模型法 

            模型法以图像的构造模型为基础,采用模型的参数作为纹理特征。典型的方法是随机场模型法,如马尔可夫(Markov)随机场(MRF)模型法和 Gibbs 随机场模型法 

    (4)信号处理法 

            纹理特征的提取与匹配主要有:灰度共生矩阵、Tamura 纹理特征、自回归纹理模型、小波变换等。 

            灰度共生矩阵特征提取与匹配主要依赖于能量、惯量、熵和相关性四个参数。Tamura 纹理特征基于人类对纹理的视觉感知心理学研究,提出6种属性,即:粗糙度、对比度、方向度、线像度、规整度和粗略度。自回归纹理模型(simultaneous auto-regressive, SAR)是马尔可夫随机场(MRF)模型的一种应用实例。 

    三 形状特征 

    (一)特点:各种基于形状特征的检索方法都可以比较有效地利用图像中感兴趣的目标来进行检索,但它们也有一些共同的问题,包括:①目前基于形状的检索方法还缺乏比较完善的数学模型;②如果目标有变形时检索结果往往不太可靠;③许多形状特征仅描述了目标局部的性质,要全面描述目标常对计算时间和存储量有较高的要求;④许多形状特征所反映的目标形状信息与人的直观感觉不完全一致,或者说,特征空间的相似性与人视觉系统感受到的相似性有差别。另外,从 2-D 图像中表现的 3-D 物体实际上只是物体在空间某一平面的投影,从 2-D 图像中反映出来的形状常不是 3-D 物体真实的形状,由于视点的变化,可能会产生各种失真。 

    (二)常用的特征提取与匹配方法 

    Ⅰ几种典型的形状特征描述方法 

            通常情况下,形状特征有两类表示方法,一类是轮廓特征,另一类是区域特征。图像的轮廓特征主要针对物体的外边界,而图像的区域特征则关系到整个形状区域。 

    几种典型的形状特征描述方法: 

    (1)边界特征法该方法通过对边界特征的描述来获取图像的形状参数。其中Hough 变换检测平行直线方法和边界方向直方图方法是经典方法。Hough 变换是利用图像全局特性而将边缘像素连接起来组成区域封闭边界的一种方法,其基本思想是点—线的对偶性;边界方向直方图法首先微分图像求得图像边缘,然后,做出关于边缘大小和方向的直方图,通常的方法是构造图像灰度梯度方向矩阵。 

    (2)傅里叶形状描述符法 

            傅里叶形状描述符(Fourier shape deors)基本思想是用物体边界的傅里叶变换作为形状描述,利用区域边界的封闭性和周期性,将二维问题转化为一维问题。 

            由边界点导出三种形状表达,分别是曲率函数、质心距离、复坐标函数。 

    (3)几何参数法 

            形状的表达和匹配采用更为简单的区域特征描述方法,例如采用有关形状定量测度(如矩、面积、周长等)的形状参数法(shape factor)。在 QBIC 系统中,便是利用圆度、偏心率、主轴方向和代数不变矩等几何参数,进行基于形状特征的图像检索。 

            需要说明的是,形状参数的提取,必须以图像处理及图像分割为前提,参数的准确性必然受到分割效果的影响,对分割效果很差的图像,形状参数甚至无法提取。 

    (4)形状不变矩法 

    利用目标所占区域的矩作为形状描述参数。 

    (5)其它方法 

            近年来,在形状的表示和匹配方面的工作还包括有限元法(Finite Element Method 或 FEM)、旋转函数(Turning )和小波描述符(Wavelet Deor)等方法。 

    Ⅱ 基于小波和相对矩的形状特征提取与匹配 

            该方法先用小波变换模极大值得到多尺度边缘图像,然后计算每一尺度的 7个不变矩,再转化为 10 个相对矩,将所有尺度上的相对矩作为图像特征向量,从而统一了区域和封闭、不封闭结构。 

    四 空间关系特征 

    (一)特点:所谓空间关系,是指图像中分割出来的多个目标之间的相互的空间位置或相对方向关系,这些关系也可分为连接/邻接关系、交叠/重叠关系和包含/包容关系等。通常空间位置信息可以分为两类:相对空间位置信息和绝对空间位置信息。前一种关系强调的是目标之间的相对情况,如上下左右关系等,后一种关系强调的是目标之间的距离大小以及方位。显而易见,由绝对空间位置可推出相对空间位置,但表达相对空间位置信息常比较简单。 

            空间关系特征的使用可加强对图像内容的描述区分能力,但空间关系特征常对图像或目标的旋转、反转、尺度变化等比较敏感。另外,实际应用中,仅仅利用空间信息往往是不够的,不能有效准确地表达场景信息。为了检索,除使用空间关系特征外,还需要其它特征来配合。 

    (二)常用的特征提取与匹配方法 

            提取图像空间关系特征可以有两种方法:一种方法是首先对图像进行自动分割,划分出图像中所包含的对象或颜色区域,然后根据这些区域提取图像特征,并建立索引;另一种方法则简单地将图像均匀地划分为若干规则子块,然后对每个图像子块提取特征,并建立索引。 
    姿态估计问题就是:确定某一三维目标物体的方位指向问题。姿态估计在机器人视觉、动作跟踪和单照相机定标等很多领域都有应用。 

            在不同领域用于姿态估计的传感器是不一样的,在这里主要讲基于视觉的姿态估计。 

            基于视觉的姿态估计根据使用的摄像机数目又可分为单目视觉姿态估计和多目视觉姿态估计。根据算法的不同又可分为基于模型的姿态估计和基于学习的姿态估计。 

    一基于模型的姿态估计方法 

            基于模型的方法通常利用物体的几何关系或者物体的特征点来估计。其基本思想是利用某种几何模型或结构来表示物体的结构和形状,并通过提取某些物体特征,在模型和图像之间建立起对应关系,然后通过几何或者其它方法实现物体空间姿态的估计。这里所使用的模型既可能是简单的几何形体,如平面、圆柱,也可能是某种几何结构,也可能是通过激光扫描或其它方法获得的三维模型。 

            基于模型的姿态估计方法是通过比对真实图像和合成图像,进行相似度计算更新物体姿态。目前基于模型的方法为了避免在全局状态空间中进行优化搜索,一般都将优化问题先降解成多个局部特征的匹配问题,非常依赖于局部特征的准确检测。当噪声较大无法提取准确的局部特征的时候,该方法的鲁棒性受到很大影响。 

    二基于学习的姿态估计方法 

            基于学习的方法借助于机器学习(machine learning)方法,从事先获取的不同姿态下的训练样本中学习二维观测与三维姿态之间的对应关系,并将学习得到的决策规则或回归函数应用于样本,所得结果作为对样本的姿态估计。基于学习的方法一般采用全局观测特征,不需检测或识别物体的局部特征,具有较好的鲁棒性。其缺点是由于无法获取在高维空间中进行连续估计所需要的密集采样,因此无法保证姿态估计的精度与连续性。 

            基于学习的姿态估计方法源于姿态识别方法的思想。姿态识别需要预先定义多个姿态类别,每个类别包含了一定的姿态范围;然后为每个姿态类别标注若干训练样本,通过模式分类的方法训练姿态分类器以实现姿态识别。 

            这一类方法并不需要对物体进行建模,一般通过图像的全局特征进行匹配分析,可以有效的避免局部特征方法在复杂姿态和遮挡关系情况下出现的特征匹配歧义性问题。然而姿态识别方法只能将姿态划分到事先定义的几个姿态类别中,并不能对姿态进行连续的精确的估计。 

            基于学习的方法一般采用全局观测特征,可以保证算法具有较好的鲁棒性。然而这一类方法的姿态估计精度很大程度依赖于训练的充分程度。要想比较精确地得到二维观测与三维姿态之间的对应关系,就必须获取足够密集的样本来学习决策规则和回归函数。而一般来说所需要样本的数量是随状态空间的维度指数级增加的,对于高维状态空间,事实上不可能获取进行精确估计所需要的密集采样。因此,无法得到密集采样而难以保证估计的精度与连续性,是基于学习的姿态估计方法无法克服的根本困难。 

            和姿态识别等典型的模式分类问题不同的是,姿态估计输出的是一个高维的姿态向量,而不是某个类别的类标。因此这一类方法需要学习的是一个从高维观测向量到高维姿态向量的映射,目前这在机器学习领域中还是一个非常困难的问题。 

            特征是描述模式的最佳方式,且我们通常认为特征的各个维度能够从不同的角度描述模式,在理想情况下,维度之间是互补完备的。 

            特征提取的主要目的是降维。特征抽取的主要思想是将原始样本投影到一个低维特征空间,得到最能反应样本本质或进行样本区分的低维样本特征。 

            一般图像特征可以分为四类:直观性特征、灰度统计特征、变换系数特征与代数特征。 

            直观性特征主要指几何特征,几何特征比较稳定,受人脸的姿态变化与光照条件等因素的影响小,但不易抽取,而且测量精度不高,与图像处理技术密切相关。 

            代数特征是基于统计学习方法抽取的特征。代数特征具有较高的识别精度,代数特征抽取方法又可以分为两类:一种是线性投影特征抽取方法;另外一种是非线性特征抽取方法。 

            习惯上,将基于主分量分析和Fisher线性鉴别分析所获得的特征抽取方法,统称为线性投影分析。 

           基于线性投影分析的特征抽取方法,其基本思想是根据一定的性能目标来寻找一线性变换,把原始信号数据压缩到一个低维子空间,使数据在子空间中的分布更加紧凑,为数据的更好描述提供手段,同时计算的复杂度得到大大降低。在线性投影分析中,以主分量分析(PCA,或称K-L变换)和Fisher线性鉴别分析(LDA)最具代表性,围绕这两种方法所形成的特征抽取算法,已成为模式识别领域中最为经典和广泛使用的方法。 

            线性投影分析法的主要缺点为:需要对大量的已有样本进行学习,且对定位、光照与物体非线性形变敏感,因而采集条件对识别性能影响较大。 

            非线性特征抽取方法也是研究的热点之一。“核技巧”最早应用在SVM中,KPCA和KFA是“核技巧”的推广应用。 

            核投影方法的基本思想是将原样本空间中的样本通过某种形式的非线性映射,变换到一个高维甚至无穷维的空间,并借助于核技巧在新的空间中应用线性的分析方法求解。由于新空间中的线性方向也对应原样本空间的非线性方向,所以基于核的投影分析得出的投影方向也对应原样本空间的非线性方向。 

            核投影方法也有一些弱点:几何意义不明确,无法知道样本在非显式映射后变成了什么分布模式;核函数中参数的选取没有相应选择标准,大多数只能采取经验参数选取;不适合训练样本很多的情况,原因是经过核映射后,样本的维数等于训练样本的个数,如果训练样本数目很大,核映射后的向量维数将会很高,并将遇到计算量上的难题。 

             就应用领域来说,KPCA远没有PCA应用的广泛。如果作为一般性的降维KPCA确实比PCA效果好,特别是特征空间不是一般的欧式空间的时候更为明显。PCA可以通过大量的自然图片学习一个子空间,但是KPCA做不到。 

            变换系数特征指先对图像进行Fourier变换、小波变换等,得到的系数后作为特征进行识别。

    展开全文
  • 图像特征是指可以图像的特点或内容进行表征的一系列属性的集合,主要包括图像自然特征(如亮度、色彩、纹理等)和图像人为特征(如图像频谱、图像直方图等)。 图像特征提取根据其相对尺度可分为全局特征提取和...
  • 特征提取

    千次阅读 2015-12-07 20:22:36
    网上发现一篇不错的文章,是关于图像特征提取的,给自己做的项目有点类似,发出来供大家参考。  特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个...
  • 图像特征提取

    千次阅读 2015-10-14 17:00:27
    特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者...
  • OCR 文字特征提取

    千次阅读 2017-03-08 17:58:55
    作为OCR系统的第一步,特征提取是希望找出图像中候选的文字区域特征,以便我们在第二步进行文字定位和第三步进行识别. 在这部分内容中,我们集中精力模仿肉眼图像与汉字的处理过程,在图像的处理和汉字的定位方面...
  • 图像特征提取三大法宝:HOG特征,LBP特征,Haar特征 一、HOG特征 1、HOG特征: 即局部归一化的梯度方向直方图,是一种图像局部重叠区域的密集型描述符, 它通过计算局部区域的梯度方向直方图来构成特征。方向...
  • 各种基于形状特征的检索方法都可以比较有效地利用图像中感兴趣的目标来进行检索,但它们也有一些共同的问题,包括:①目前基于形状的检索方法还缺乏比较完善的数学模型;②如果目标有变形时检索结果往往不太可靠;③...
  • SURF特征提取分析

    万次阅读 多人点赞 2013-11-28 00:26:44
    计算机视觉中,引入尺度不变的特征,主要的思想是每个检测到的特征点都伴随着对应的尺寸因子。...第二、标准的SURF算子比SIFT算子快好倍,并且在多幅图片下具有更好的鲁棒性。SURF最大的特征在于采用了har
  • caffe提取特征用svm进行分类

    千次阅读 2016-09-15 22:31:19
    caffe c++批量抽取特征的方法在[1],但是该方法使用中有个疑问: 1. 如何转换levelDB 格式为libsvm格式。 2. ./build/tools/extract_features mini-batch 是代表什么意思,和imagenet_val.prototxt中的batch...
  • 机器学习 - 特征提取

    千次阅读 2019-03-25 14:31:46
    应用DictVectorizer实现类别特征进行数值化、离散化 应用CountVectorizer实现文本特征进行数值化 应用TfidfVectorizer实现文本特征进行数值化 说出两种文本特征提取的方式区别 1 特征提取 ...
  • 图像特征提取_大致的特征类型

    千次阅读 2016-03-17 08:52:27
    主要描述了图像特征提取特征分类,根据分类查找文献项目进行实现
  • 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合 SVM分类器已经被...
  • 图像处理之Matlab特征提取和表达

    万次阅读 多人点赞 2017-08-07 17:36:14
    介绍图像处理之特征提取和表达,使用bwboundaries函数获取边界,使用regionprops函数统计特征
  • 浅析卷积神经网络为何能够进行特征提取

    万次阅读 多人点赞 2018-11-09 16:56:01
    在此之前,我们先了解两个数学概念,特征值和特征向量。 这里先放3个传送门: https://blog.csdn.net/hjq376247328/article/details/80640544 https://blog.csdn.net/woainishifu/article/details/76418176 ...
  • halcon特征提取小结

    千次阅读 2019-03-07 19:05:41
    2.对特征区域图片做灰度转换,完成rgb——&gt;gray转换,利用rgb1_to_gray 之的算子 3.特征区域噪点处理,使用模糊、滤波算法对图像噪声、杂点处理 4.利用阈值提取特征边缘 5.利用连通区域以及面积信息,...
  • 特征提取特征选择

    千次阅读 2017-10-18 03:07:23
    特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者...
  • 三维模型特征提取

    千次阅读 2019-08-05 21:15:21
    到目前为止,国内外对特征提取的研究已日趋成熟并出现了很多特征提取方法,比如主成分分析(PCA)、线性判别分析(LDA)、局部保留映射(LPP)等,但是它们仍存在某些缺陷。PCA是一种无监督的特征提取算法,它通过...
  • 尺度不变特征变换(SIFT)特征提取分析

    万次阅读 多人点赞 2013-11-25 20:06:38
    在博文【特征提取】Harris角点检测中介绍的Harris算子图像尺度变化非常敏感,因此不适合用于不同尺度的图像匹配。所以,本节主要根据论文[1]和[2]理解,介绍SIFT相关知识。关于SIFT算法,2004年David Lowe发表在...
  • 图像特征提取(颜色特征)

    万次阅读 多人点赞 2016-10-28 11:03:55
    特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者...
  • 关于图像的特征提取

    千次阅读 2017-02-19 11:15:27
    关于图像的特征提取
  • 图像特征提取
  • before:本篇博文先主要叙述ORB特征提取算法,包括其分解, FAST特征点的生成,BRIEF描述子的生成。然后FPGA实现特征提取进行简介。铺垫好这些基础后,在下一篇博文中,仔细介绍如何 采用FPGA来实现高速的...
  • opencv特征提取

    千次阅读 2016-10-27 11:37:06
    特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者...
  • 图像特征提取几种方法介绍

    万次阅读 2017-02-20 19:51:51
    图像特征提取几种方法介绍 参考: http://blog.csdn.net/abcjennifer/article/details/7639681 1、SIFT SIFT:尺度不变特征变换(Scale-invariant features transform)。SIFT是一种检测局部特征的...
  • 数据挖掘 文本分类(七)特征提取

    千次阅读 2014-12-24 11:26:03
    上一篇我们做完了词频统计,下面就该提取文本特征了。其实词的频率就是文本最重要的特征了,但是我们如果只靠词的频率去判断文本的分类的话,显然正确率是很低的。  当然,文本的特征提取有很多办法了,我上这门...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 88,903
精华内容 35,561
关键字:

对几类图片进行特征提取