在使用 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。当插值点位于图像范围内时,进行双线性插值;否则,直接将原始像素值赋给目标像素。

通过以上修改,可以有效避免亚像素插值点超出图像范围,从而消除最终显示结果中的黑块问题。

Matlab 亚像素边缘检测出现黑块:如何解决?

原文地址: https://www.cveoy.top/t/topic/fzNn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录