Experimento de visión artificial 3

La autoprogramación utiliza el algoritmo de Harris para realizar la detección de esquinas en imágenes lena.png y cameraman.tif (u otras imágenes).

La siguiente es la implementación del código MATLAB para la detección de esquinas de lena.png utilizando el algoritmo de Harris:

% 读取图片
im = imread('lena.png');
figure, imshow(im), title('Original Image');

% 转换为灰度图像
grayIm = rgb2gray(im);
figure, imshow(grayIm), title('Gray Image');

% 计算x、y方向上的Sobel梯度
dx = [-1 0 1; -2 0 2; -1 0 1];
dy = dx';
Ix = conv2(double(grayIm), dx, 'same');
Iy = conv2(double(grayIm), dy, 'same');

% 计算矩阵M中每个元素的值
wSize = 3; % 窗口大小(3x3)
k = 0.04; % Harris参数
M11 = conv2(Ix.^2, ones(wSize), 'same');
M12 = conv2(Ix.*Iy, ones(wSize), 'same');
M22 = conv2(Iy.^2, ones(wSize), 'same');
detM = M11.*M22 - M12.^2;
traceM = M11 + M22;
R = detM - k*traceM.^2;

% 非极大值抑制
thres = 1e-6 * max(R(:));
Rmax = ordfilt2(R, wSize^2, ones(wSize)); % 对于每个像素,取其3x3邻域内最大的R值
Rmax = (R == Rmax) & (R > thres); % 与原始R值相同且大于阈值的为角点

% 显示结果
figure, imshow(im), title('Harris Corners');
hold on
[y, x] = find(Rmax);
plot(x, y, 'ro');

Visualización de resultados

inserte la descripción de la imagen aquí
La siguiente es la implementación del código MATLAB para la detección de esquinas de cameraman.tif utilizando el algoritmo de Harris:

% 读取图片
im = imread('cameraman.tif');
figure, imshow(im), title('Original Image');

% 计算x、y方向上的Sobel梯度
dx = [-1 0 1; -2 0 2; -1 0 1];
dy = dx';
Ix = conv2(double(im), dx, 'same');
Iy = conv2(double(im), dy, 'same');

% 计算矩阵M中每个元素的值
wSize = 3; % 窗口大小(3x3)
k = 0.04; % Harris参数
M11 = conv2(Ix.^2, ones(wSize), 'same');
M12 = conv2(Ix.*Iy, ones(wSize), 'same');
M22 = conv2(Iy.^2, ones(wSize), 'same');
detM = M11.*M22 - M12.^2;
traceM = M11 + M22;
R = detM - k*traceM.^2;

% 非极大值抑制
thres = 1e-6 * max(R(:));
Rmax = ordfilt2(R, wSize^2, ones(wSize)); % 对于每个像素,取其3x3邻域内最大的R值
Rmax = (R == Rmax) & (R > thres); % 与原始R值相同且大于阈值的为角点

% 显示结果
figure, imshow(im), title('Harris Corners');
hold on
[y, x] = find(Rmax);
plot(x, y, 'ro');

Resultados experimentales
inserte la descripción de la imagen aquí

La programación utiliza el algoritmo SUSAN para detectar las esquinas de las imágenes lena.png y cameraman.tif (u otras imágenes), comparar los resultados con los obtenidos por el algoritmo harris y analizar las diferencias entre ellos. Implemente aún más el algoritmo Moravec por sí mismo y compare las diferencias de los algoritmos de detección de tres esquinas.

La siguiente es la implementación del código MATLAB para la detección de esquinas de lena.png utilizando el algoritmo SUSAN:

 读取图片
im = imread('lena.png');
figure, imshow(im), title('Original Image');

% 转换为灰度图像
grayIm = rgb2gray(im);
figure, imshow(grayIm), title('Gray Image');

% 求解平均灰度值
wSize = 7; % 窗口大小(7x7)
threshold = 0.04; % 阈值
A = fspecial('average', wSize);
meanI = imfilter(double(grayIm), A, 'replicate');

% 计算像素与邻域像素之间的差异
diffIm = abs(double(grayIm) - meanI);
mask = ones(wSize);
mask(4, 4) = 0; % 排除中心点

% 计算响应值
C = threshold * ones(size(diffIm));
C(diffIm > C) = diffIm(diffIm > C);
response = sum(sum(C .* mask));

% 显示结果
figure, imshow(im), title('SUSAN Corners');
hold on
[y, x] = find(diffIm > threshold);
plot(x, y, 'ro');

La siguiente es la implementación del código MATLAB para la detección de esquinas de cameraman.tif utilizando el algoritmo SUSAN:

% 读取图片
im = imread('cameraman.tif');
figure, imshow(im), title('Original Image');

% 求解平均灰度值
wSize = 256; % 窗口大小(7x7)
threshold = 27; % 阈值
A = fspecial('average', wSize);
meanI = imfilter(double(im), A, 'replicate');

% 计算像素与邻域像素之间的差异
diffIm = abs(double(im) - meanI);
mask = ones(wSize);
mask(4, 4) = 0; % 排除中心点

% 计算响应值
C = threshold * ones(size(diffIm));
C(diffIm > C) = diffIm(diffIm > C);
response = sum(sum(C .* mask));

% 显示结果
figure, imshow(im), title('SUSAN Corners');
hold on
[y, x] = find(diffIm > threshold);
plot(x, y, 'ro');

inserte la descripción de la imagen aquí

La siguiente es la implementación del código MATLAB para la detección de esquinas de lena.png utilizando el algoritmo Moravec:

% 读取图片
im = imread('lena.png');
figure, imshow(im), title('Original Image');

% 转换为灰度图像
grayIm = rgb2gray(im);
figure, imshow(grayIm), title('Gray Image');

% 计算窗口大小和平移量
wSize = 7; % 窗口大小(7x7)
shifts = [-1 -1; -1 0; -1 1; 0 -1; 0 1; 1 -1; 1 0; 1 1]; % 平移量

% 计算响应值
threshold = 10000; % 阈值
response = zeros(size(grayIm));
for i = wSize+1 : size(grayIm, 1)-wSize
    for j = wSize+1 : size(grayIm, 2)-wSize
        S = zeros(8, 1);
        for k = 1 : size(shifts, 1)
            diffIm = double(grayIm(i:i+wSize-1, j:j+wSize-1)) - ...
                     double(grayIm(i+shifts(k,1):i+wSize-1+shifts(k,1), j+shifts(k,2):j+wSize-1+shifts(k,2)));
            S(k) = sum(diffIm(:).^2);
        end
        response(i,j) = min(S);
    end
end

% 非极大值抑制
thres = 1e-6 * max(response(:));
Rmax = ordfilt2(response, wSize^2, ones(wSize)); % 对于每个像素,取其3x3邻域内最大的响应值
Rmax = (response == Rmax) & (response > thres); % 与原始响应值相同且大于阈值的为角点

% 显示结果
figure, imshow(im), title('Moravec Corners');
hold on
[y, x] = find(Rmax);
plot(x, y, 'ro');

Entre ellos, wSize representa el tamaño de la ventana, los desplazamientos representan la cantidad de traducción y el umbral representa el umbral del valor de respuesta.

inserte la descripción de la imagen aquí

% 读取图片
im = imread('cameraman.tif');
figure, imshow(im), title('Original Image');

% 转换为灰度图像
grayIm = im2double(im);
figure, imshow(grayIm), title('Gray Image');

% 计算窗口大小和平移量
wSize = 7; % 窗口大小(7x7)
shifts = [-1 -1; -1 0; -1 1; 0 -1; 0 1; 1 -1; 1 0; 1 1]; % 平移量

% 计算响应值
threshold = 10000; % 阈值
response = zeros(size(grayIm));
for i = wSize+1 : size(grayIm, 1)-wSize
    for j = wSize+1 : size(grayIm, 2)-wSize
        S = zeros(8, 1);
        for k = 1 : size(shifts, 1)
            diffIm = grayIm(i:i+wSize-1, j:j+wSize-1) - ...
                     grayIm(i+shifts(k,1):i+wSize-1+shifts(k,1), j+shifts(k,2):j+wSize-1+shifts(k,2));
            S(k) = sum(diffIm(:).^2);
        end
        response(i,j) = min(S);
    end
end

% 非极大值抑制
thres = 1e-6 * max(response(:));
Rmax = ordfilt2(response, wSize^2, ones(wSize)); % 对于每个像素,取其3x3邻域内最大的响应值
Rmax = (response == Rmax) & (response > thres); % 与原始响应值相同且大于阈值的为角点

% 显示结果
figure, imshow(im), title('Moravec Corners');
hold on
[y, x] = find(Rmax);
plot(x, y, 'ro');

inserte la descripción de la imagen aquí

A continuación, comparamos los resultados y las diferencias de los algoritmos de detección de tres esquinas.

En primer lugar, tanto el algoritmo de Harris como el algoritmo de SUSAN son métodos de detección basados ​​en características locales, que funcionan bien cuando se trata de imágenes ricas en ruido y textura, pero pueden verse afectados cuando se trata de imágenes a gran escala y de baja textura. La diferencia es que el algoritmo de Harris calcula el valor de cada elemento en la matriz M, mientras que el algoritmo de SUSAN calcula la diferencia entre un píxel y los píxeles vecinos. Por lo tanto, el algoritmo de Harris puede capturar mejor las características de las esquinas, mientras que el algoritmo de SUSAN es más adecuado para la extracción de características en áreas circulares.

En segundo lugar, el algoritmo de Moravec calcula la diferencia entre el píxel en la ventana y el píxel después de la traducción, y luego selecciona el valor de diferencia más pequeño como valor de respuesta. Dado que este algoritmo no tiene en cuenta la correlación entre píxeles, funciona bien con el ruido y las imágenes uniformes, pero en imágenes con una textura fuerte o más ruido, es fácil producir una gran cantidad de resultados de esquinas equivocadas y no es efectivo. para las transformaciones de rotación y Escala no son robustas.

En resumen, diferentes algoritmos de detección de esquinas son adecuados para diferentes tipos de imágenes y escenarios de aplicación. Si necesita resultados de detección de esquinas más precisos y sólidos, puede considerar usar el algoritmo de Harris; si necesita procesar imágenes de baja textura o extracción de características en áreas circulares, puede usar el algoritmo SUSAN; si necesita implementar rápidamente la detección de esquinas y ruido y si la imagen suave tiene una mejor adaptabilidad, se puede seleccionar el algoritmo de Moravec.

Supongo que te gusta

Origin blog.csdn.net/weixin_51209821/article/details/130885689
Recomendado
Clasificación