MATLAB 亚像素边缘检测:窗口大小设置与应用
本段代码使用 Canny 算法进行亚像素边缘检测,并通过变量 'window_size' 设置窗口大小,用于计算图像梯度和精确定位边缘。代码中 'window_size' 被设置为 5。
% 读取图像
img = imread('2 (6).jpg');
% 将图像转为灰度图
gray_img = rgb2gray(img);
% 使用Canny算法进行边缘检测
canny_img = edge(gray_img, 'canny');
% 设置窗口大小
window_size = 5;
% 计算图像梯度
[dx, dy] = gradient(double(gray_img));
gradient_magnitude = sqrt(dx.^2 + dy.^2);
% 初始化亚像素边缘坐标
subpixel_edges = zeros(size(gray_img));
% 对每个边缘像素进行精确定位
for i = 1:size(canny_img, 1)
for j = 1:size(canny_img, 2)
if canny_img(i, j) == 1
% 获取窗口内的梯度幅值
window_gradient = gradient_magnitude(max(i-window_size, 1):min(i+window_size, end), max(j-window_size, 1):min(j+window_size, end));
% 计算窗口内梯度幅值的加权均值
weights = fspecial('gaussian', size(window_gradient), 2);
weighted_gradient = window_gradient .* weights;
weighted_sum = sum(weighted_gradient(:));
weighted_mean = weighted_sum / sum(weights(:));
% 通过高斯曲线拟合计算亚像素边缘位置
subpixel_edges(i, j) = subpixel_edge_position(window_gradient, weighted_mean);
end
end
end
% 显示亚像素边缘检测结果
subplot(121);
imshow(canny_img);
subplot(122);
imshow(subpixel_edges);
function subpixel_position = subpixel_edge_position(window_gradient, weighted_mean)
% 计算窗口内梯度幅值的位置
[~, max_index] = max(window_gradient(:));
[row, col] = ind2sub(size(window_gradient), max_index);
% 计算亚像素边缘位置
if row == 1 || row == size(window_gradient, 1)
subpixel_position = row;
else
% 计算亚像素边缘位置的偏移量
offset = (window_gradient(row+1, col) - window_gradient(row-1, col)) / (2 * (window_gradient(row+1, col) - 2 * window_gradient(row, col) + window_gradient(row-1, col)));
subpixel_position = row + offset;
end
% 将亚像素边缘位置映射到原图像坐标
subpixel_position = subpixel_position - (size(window_gradient, 1) - 1) / 2 + weighted_mean;
end
窗口大小的设置会影响边缘检测的精度和速度。较大的窗口可以提高精度,但会降低速度,而较小的窗口速度更快,但精度可能略低。根据实际应用的需求,需要选择合适的窗口大小。
原文地址: https://www.cveoy.top/t/topic/fvXl 著作权归作者所有。请勿转载和采集!