根据形状定位对象

时间:2014-12-16 21:25:58

标签: matlab computer-vision shape object-detection

我想使用Matlab在图像中找到某个对象。

此对象始终具有完全相同的形状,只有颜色不同:

Object I want to locate within an image

我尝试使用基于点要素的对象检测算法,但由于此对象图像中没有足够的功能,因此这些算法不起作用。

有没有办法在我的图像中找到这个对象,因为每个图像中有一个这个对象的实例,例如它的独特形状? 此对象的比例可以更改,也可能不会完全显示为绿色(部分为灰色)。

我想要找到螺旋的图像示例是:

Image to locate the spiral in

1 个答案:

答案 0 :(得分:1)

使用模板尝试Phase Correlation图像。 以下是算法:

  1. 将模板和图像转换为灰度
  2. 在删除平均值并将其填充到图像大小
  3. 后计算模板的2DFT
  4. 删除平均值
  5. 后计算图像的2DFT
  6. 将图像的2DFT与模板的2DFT的共轭相乘
  7. 划分图像和模板的2DFT幅度(留下相位)
  8. 采用反向2DFT并在实部中找到峰值
  9. 下面的代码实现了算法:

    %% Load video frames and template
    imageFile = 'image.png';
    templateFile = 'template.png';
    imageColor = imread(imageFile);
    image = im2double( rgb2gray( imageColor ) );
    template = im2double( rgb2gray( imread(templateFile) ));
    
    [hI, wI] = size(image);
    [hT, wT] = size(template);
    
    %% Perform frequency domain correlation
    templateDFT = fft2((template - mean2(template))/std2(template), hI, wI);
    templateDFTMag = abs(templateDFT);
    
    templateFilter = conj(templateDFT) ./ templateDFTMag;
    
    imageDFT = fft2((image - mean2(image))/std2(image) );
    imageDFTMag = abs(imageDFT);
    corrDFT = imageDFT .* templateFilter ./ imageDFTMag;
    corr = real(ifft2(corrDFT));
    
    %% Detect peak and plot
    [maxCorr, maxIdx] = max(corr(:));
    [maxRow, maxCol] = ind2sub([hI wI], maxIdx);
    
    figure; imshow(imageColor); hold on; 
    rectangle('Position', [maxCol-wT/2, maxRow-hT/2, wT, hT], 'EdgeColor', 'y');
    

    以下是我得到的:

    enter image description here

    注意事项:

    • 此方案对于大规模变化或旋转不是非常稳健。但是,可以容忍小规模的变化。