Обнаружение признаков (4) Код обнаружения углов Харриса

компьютерное зрение

Завершите эксперимент по обнаружению углов изображения.

Реализация углового алгоритма Харриса

Согласно приведенному выше обсуждению, алгоритм обнаружения углов изображения Харриса можно резюмировать следующим образом, который разделен на следующие пять шагов:

  1. Вычислите градиенты Ix, Iy изображения I(x,y) в обоих направлениях X и Y.

  2. Вычисляет произведение градиентов двух направлений изображения.

  3. Гауссово взвешивание I2x, I2y и Ixy с функцией Гаусса (принимающей σ=1) для генерации элементов A, B и C матрицы M.

  4. Вычисляет отклик Харриса R для каждого пикселя и устанавливает R равным нулю, если R меньше некоторого порогового значения t.

  5. Немаксимальное подавление выполняется в окрестности 3×3 или 5×5, а точкой локального максимума является угловая точка изображения.

Свойства Харрис Корнерс

  1. Влияние параметра α на обнаружение углов Предполагая, что собственные значения λ1≥λ2≥0 матрицы M получены, пусть λ2=kλ1, 0≤k≤1. Из связи между собственными значениями и прямым следом и определителем матрицы M мы можем получить: detM=∏iλi traceM=∑iλi Тогда мы можем получить отклик угловой точки R=λ2λ2=α(λ2+λ2 )2=λ2(k?α( 1+k)2) В предположении R≥0 имеем: 0≤α≤k(1+k)2≤0,25 Для малого значения k R≈λ2(k?α ),α
  2. Оператор определения угла Харриса не чувствителен к изменениям яркости и контрастности, поскольку дифференциальный оператор используется для дифференциации изображения во время обнаружения угла Харриса, не чувствителен к высоте или спуску. Другими словами, аффинное преобразование яркости и контраста не меняет места появления экстремумов отклика Харриса, но за счет выбора порога может влиять на количество обнаружений углов.
  3. Оператор обнаружения углов Харриса имеет инвариантность к вращению Оператор обнаружения углов Харриса использует матрицу моментов второго порядка региональной шкалы серого вблизи угла. Матрица моментов второго порядка может быть представлена ​​в виде эллипса, а большая и малая оси эллипса обратны квадратному корню из собственных значений матрицы моментов второго порядка. Когда эллипс признаков вращается, собственное значение не меняется, поэтому значение отклика R оцененного угла не меняется, что показывает, что оператор обнаружения угла Харриса имеет инвариантность к вращению.
  4. Оператор обнаружения углов Харриса не имеет масштабной инвариантности.Как показано на рисунке ниже, когда правое изображение уменьшается, содержимое изображения, содержащегося в окне, полностью меняется при условии, что размер окна обнаружения остается неизменным. Изображение слева может быть распознано как край или кривая, а изображение справа может быть распознано как угол.
close all;
clear all;
clc;
 
img=imread('testc.jpg');
imshow(img);
img = im2gray(img);
img =double(img);
[m n]=size(img);
 
tmp=zeros(m+2,n+2);
tmp(2:m+1,2:n+1)=img;
Ix=zeros(m+2,n+2);
Iy=zeros(m+2,n+2);
 
E=zeros(m+2,n+2);
 
Ix(:,2:n)=tmp(:,3:n+1)-tmp(:,1:n-1);
Iy(2:m,:)=tmp(3:m+1,:)-tmp(1:m-1,:);
 
Ix2=Ix(2:m+1,2:n+1).^2;
Iy2=Iy(2:m+1,2:n+1).^2;
Ixy=Ix(2:m+1,2:n+1).*Iy(2:m+1,2:n+1);
 
h=fspecial('gaussian',[7 7],2);
Ix2=filter2(h,Ix2);
Iy2=filter2(h,Iy2);
Ixy=filter2(h,Ixy);
 
Rmax=0;
R=zeros(m,n);
for i=1:m
    for j=1:n
        M=[Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)];
        R(i,j)=det(M)-0.06*(trace(M))^2;
        
        if R(i,j)>Rmax
            Rmax=R(i,j);
        end
    end
end
re=zeros(m+2,n+2);
 
tmp(2:m+1,2:n+1)=R;
img_re=zeros(m+2,n+2);
img_re(2:m+1,2:n+1)=img;
for i=2:m+1
    for j=2:n+1
        
        if tmp(i,j)>0.02*Rmax &&...
           tmp(i,j)>tmp(i-1,j-1) && tmp(i,j)>tmp(i-1,j) && tmp(i,j)>tmp(i-1,j+1) &&...
           tmp(i,j)>tmp(i,j-1) && tmp(i,j)>tmp(i,j+1) &&...
           tmp(i,j)>tmp(i+1,j-1) && tmp(i,j)>tmp(i+1,j) && tmp(i,j)>tmp(i+1,j+1)
                img_re(i,j)=255; 
        end   
    end
end
 
img_re=mat2gray(img_re(2:m+1,2:n+1));
figure,imshow(img_re);
function re=get_coords(angle)       %angle是边缘法线角度,返回法线前后两点
    sigma=0.000000001;
    x1=ceil(cos(angle+pi/8)*sqrt(2)-0.5-sigma);
    y1=ceil(-sin(angle-pi/8)*sqrt(2)-0.5-sigma);
    x2=ceil(cos(angle-pi/8)*sqrt(2)-0.5-sigma);
    y2=ceil(-sin(angle-pi/8)*sqrt(2)-0.5-sigma);
    re=[x1 y1 x2 y2];

end

image.png