选择性搜索算法 详细讲解附带代码实例

1,原理

选择性搜索的工作主要是利用图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构。

选择性搜索算法[11]是一种经典的基于区域的 图像分割算法,首先利用非监督方法将图像分割为 若干个超像素以得到一些原始区域,再计算相邻子 区域的相似度,通过对图像内具有纹理、颜色等相 似特性的图像子区域进行合并,获取数量较少而召 回率较高的目标区域,缩小搜索范围,从而获得若 干个可能的目标区间。本文选择性搜索算法应用 步骤如下:

(1)对 预 处 理 后 的 图 像 ,利 用 基 于 图 表 示 的 图 像分割算法[12]获取具有相似特性的初始分割区域

R=r1,r2,...,rn 。 {}

(2)计 算 两 两 相 邻 区 域 在 颜 色 、纹 理 、大 小 及 吻 合 度 之 间 的 相 似 度 s (r i ,r j ) , 相 似 度 集 合 为 S = {s (r i ,r j ) , ... } 。

(3 )将 相 似 度 集 合 S 中 相 似 度 最 大 的 值 max (S)所对应的两个区域ri 和rj 合并为一个区域rt , 从相似度集合S中移除相似度s(ri,rj),计算rt 与相邻区域的相似度,并将区域r 添加至区域集合R t中。
(4)重复步骤(3)直至S = ,此时,区域集合R 中的子集就是图像最终的分割区域,获取的区域 集合R 中每个区域所对应的外界矩形,即为可能 的目标区间。

因此利用初始分割区域相邻区域间的颜色、纹理、大小以及吻合度的相似性对初始分割区域进行合并。

 

2,代码实例

C++版本

#include "opencv2/ximgproc/segmentation.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <ctime>

using namespace cv;
using namespace cv::ximgproc::segmentation;
using namespace std;

#define selectMethod 2 
//1 切换到快速但低调用的选择性搜索方法
//2 切换到高调用但速度慢的选择性搜索方法

int main(int argc, char** argv) {

    //使用多线程加速
    setUseOptimized(true);
    setNumThreads(4);

    // read image
   // Mat im = imread(argv[1]);
    Mat im = imread("/Users/macbookpro/CLionProjects/pedestrian_detection/data/test5.png");
    // resize image
    int newHeight = 200;
    int newWidth = im.cols*newHeight/im.rows;
    resize(im, im, Size(newWidth, newHeight));


    //使用默认参数创建选择性搜索分段对象
    Ptr<SelectiveSearchSegmentation> ss = createSelectiveSearchSegmentation();

    //设置我们将运行分段的输入图像
    ss->setBaseImage(im);
    
    //切换到快速但低调用的选择性搜索方法
    if(selectMethod == 1)
    {
        ss->switchToSelectiveSearchFast();
    }
        //切换到高调用但速度慢的选择性搜索方法
    else if (selectMethod == 2)
    {
        ss->switchToSelectiveSearchQuality();
    }
    
    //在输入图像上运行选择性搜索分割
    std::vector<Rect> rects;
    ss->process(rects);
    cout << "Total Number of Region Proposals: " << rects.size() << endl;
    
    //要显示的地区提案数量
    int numShowRects = 100;

    //增加/减少要显示的理由提案的总数
    int increment = 50;

    while(1) {

        //创建原始图像的副本
        Mat imOut = im.clone();
        
        //迭代所有区域提案
        for(int i = 0; i < rects.size(); i++) {
            if (i < numShowRects) {
                rectangle(imOut, rects[i], Scalar(0, 255, 0));
            }
            else {
                break;
            }
        }
        
        //显示输出
        imshow("Output", imOut);
        waitKey();
        //记录按键
        int k = waitKey();
        //1时增加 -1时减少  0推出
        //int  k = -1;
        cin>>k;
        
        if (k == 1) {
            //增加矩形的总数以增量显示
            numShowRects += increment;
        }
        else if (k == -1  && numShowRects > increment) {
            //减少通过增量显示的矩形总数
            numShowRects -= increment;
        }
        else if (k == 0) {
            break;
        }
    }
    return 0;
}

matlab版本:

function all_boxes = selective_search_rcnn(image_filenames, output_filename)
% Based on the demo.m file included in the Selective Search
% IJCV code, and on selective_search_boxes.m from R-CNN. 
% Load dependencies and compile if needed.  
addpath('Dependencies');
if(~exist('anigauss', 'var'))
    mex Dependencies\anigaussm\anigauss_mex.c Dependencies\anigaussm\anigauss.c -output anigauss
end
if(~exist('mexCountWordsIndex', 'var'))
mex Dependencies\mexCountWordsIndex.cpp
end

if(~exist('mexFelzenSegmentIndex', 'var'))
mex Dependencies\FelzenSegment\mexFelzenSegmentIndex.cpp -output mexFelzenSegmentIndex;
end

im_width = 500;

colorTypes = {'Hsv', 'Lab', 'RGI', 'H', 'Intensity'};

% Here you specify which similarity functions to use in merging
simFunctionHandles = {@SSSimColourTextureSizeFillOrig, ... 
                     @SSSimTextureSizeFill, ...
                     @SSSimBoxFillOrig, ... 
                     @SSSimSize};
% Thresholds for the Felzenszwalb and Huttenlocher segmentation algorithm. 
% Note that by default, we set minSize = k, and sigma = 0.8.
% controls size of segments of initial segmentation.
ks = [50 100 150 300];
sigma = 0.8;

% After segmentation, filter out boxes which have a width/height smaller 
% than minBoxWidth (default = 20 pixels).
minBoxWidth = 20;

% Comment the following three lines for the 'quality' version
colorTypes = colorTypes(1:2); % 'Fast' uses HSV and Lab
simFunctionHandles = simFunctionHandles(1:2); % Two different merging strategies 
ks = ks(1:2);

% Process all images.
all_boxes = {};
% image_db = 'G:\Final_thesis\data\single\Resizing\';
%image_db = 'F:\caltech\';

for i = 1 : length(image_filenames)
    fprintf('%d out of %d\n', i, length(image_filenames));
%im = imread([image_db,image_filenames{i}]);
   im = imread(image_filenames{i});
    % Resize image to canonical dimensions since proposals aren't scale invariant.
    scale = size(im, 2) / im_width;
    im = imresize(im, [NaN im_width]);
    
   idx = 1; 
  for j = 1:length(ks)
   k = ks(j); % Segmentation threshold k 
   minSize = k; % We set minSize = k 
   for n = 1:length(colorTypes)
        colorType = colorTypes{n};
        [boxesT{idx} blobIndIm blobBoxes hierarchy priorityT{idx}] = ...
      Image2HierarchicalGrouping(im, sigma, k, minSize, colorType, simFunctionHandles); 
   idx = idx + 1;
  end
end
    boxes = cat(1, boxesT{:}); % Concatenate boxes from all hierarchies 
    priority = cat(1, priorityT{:}); % Concatenate priorities

% Do pseudo random sorting as in paper
    priority = priority .* rand(size(priority));
    [priority sortIds] = sort(priority, 'ascend'); 
    boxes = boxes(sortIds,:);
    
    boxes = FilterBoxesWidth(boxes, minBoxWidth); 
    boxes = BoxRemoveDuplicates(boxes);


% Adjust boxes to cancel effect of canonical scaling.
    boxes = (boxes - 1) * scale + 1;
    

    boxes = FilterBoxesWidth(boxes, minBoxWidth);
    boxes = BoxRemoveDuplicates(boxes); 
    all_boxes{i} = boxes;
end

%all_boxes(:, 1)
%new

if nargin > 1
    all_boxes
    save(output_filename, 'all_boxes', '-v7');
end

% close all;clear, clc;
% image_db = 'F:\INRIAPerson\Test\';%image_db ='/Users/macbookpro/Documents/MATLAB/Select/img/'
% image_filenames = textread([image_db 'ImageListnew.txt'], '%s', 'delimiter', '\n'); 
% for i = 1:length(image_filenames)
%     image_filenames{i} = [image_db, image_filenames{i}];
% end
% selective_search_rcnn(image_filenames, 'test.mat');


 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页