matlab中此段代码运行后显示原始边缘图像和亚像素检测边缘轮廓轮廓一样是怎么回事如何解决? 读取图像img = imreadlenajpg;gray_img = im2grayimg; 阈值化图像threshold = graythreshgray_img;binary_img = imbinarizegray_img threshold; 提取边缘edge_img = edgebinary_i
在给定的代码中,原始边缘图像和亚像素检测边缘轮廓的显示结果一样,这是因为在亚像素检测函数中没有对边缘点进行亚像素插值处理。
要解决这个问题,可以在亚像素检测函数中对边缘点进行亚像素插值处理。可以使用双线性插值或其他插值方法来估计边缘点的亚像素位置。
以下是对亚像素检测函数进行修改的示例代码:
% 亚像素检测函数
function [subpixel_edge] = subpixelext(edge_img, moments)
[rows, cols] = size(edge_img);
subpixel_edge = zeros(rows, cols);
for x = 2:(cols-1)
for y = 2:(rows-1)
if edge_img(y, x) == 1
dx = (moments(2, 1)*x + moments(2, 2)*y) / moments(1, 1);
dy = (moments(1, 2)*x + moments(2, 2)*y) / moments(1, 1);
% 亚像素插值
dx_floor = floor(dx);
dy_floor = floor(dy);
dx_frac = dx - dx_floor;
dy_frac = dy - dy_floor;
% 双线性插值
subpixel_edge(y, x) = (1-dx_frac)*(1-dy_frac)*edge_img(dy_floor, dx_floor) + ...
dx_frac*(1-dy_frac)*edge_img(dy_floor, dx_floor+1) + ...
(1-dx_frac)*dy_frac*edge_img(dy_floor+1, dx_floor) + ...
dx_frac*dy_frac*edge_img(dy_floor+1, dx_floor+1);
end
end
end
end
通过对边缘点进行亚像素插值处理,可以获得更准确的亚像素边缘轮廓。
原文地址: http://www.cveoy.top/t/topic/hOlt 著作权归作者所有。请勿转载和采集!