Matlab 亚像素边缘检测出现黑块:如何解决?
在使用 Matlab 进行亚像素边缘检测时,可能会遇到亚像素插值点超出图像范围,导致最终显示结果中出现黑块的问题。
为了解决这个问题,需要在亚像素插值部分对插值点进行边界判断,以确保插值点始终位于图像范围内。
以下是修改后的 subpixelext 函数代码:
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;
% 边界判断
if dx_floor >= 1 && dx_floor+1 <= cols && dy_floor >= 1 && dy_floor+1 <= rows
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);
else
subpixel_edge(y, x) = edge_img(y, x);
end
end
end
end
end
在以上代码中,我们添加了边界判断条件 if dx_floor >= 1 && dx_floor+1 <= cols && dy_floor >= 1 && dy_floor+1 <= rows。当插值点位于图像范围内时,进行双线性插值;否则,直接将原始像素值赋给目标像素。
通过以上修改,可以有效避免亚像素插值点超出图像范围,从而消除最终显示结果中的黑块问题。
原文地址: https://www.cveoy.top/t/topic/fzNn 著作权归作者所有。请勿转载和采集!