如何使用空间滤波器检测 22.5° 的边缘?
检测以特定角度定向的边缘
信息处理
图像处理
计算机视觉
2022-02-24 04:15:20
1个回答
您可以使用可控过滤器。要检测特定方向的边缘,您需要计算垂直于边缘的方向的导数。为此,您首先计算 x 导数和 y 导数。然后是定向导数
使用简单的Sobel 过滤器执行此操作 会生成以下图像。左上角是测试图像的等高线图。右上角是可控滤波器结果的等高线图。底部两个显示应用于测试图像的原始水平和垂直过滤器的等高线图。
scilab
下面的代码。
Ix = [1 2 1; 0 0 0; -1 -2 -1];//Sobel horizontal edge kernel;
Iy = [1 0 -1; 2 0 -2; 1 0 -1];//Sobel vertical edge kernel;
theta = 22.5/180*%pi;
I_theta = Ix*cos(theta) + Iy*sin(theta);
test_image = zeros(100,100);
test_image(1:100,1:100) = (([1:100]-50.5)'*ones(1,100)).^2 + (ones(100,1)*([1:100]-50.5)).^2 < 100;
output_image = conv2(test_image, I_theta,"same");
xset("fpf"," ")
levels = [0:0.5:1];
axes = [0 100 0 100];
clf;
subplot(221);
contour(1:100,1:100,abs(test_image),levels)
a = gca();
a.isoview = "on";
a.title.font_size = 5;
mtlb_axis(axes);
title('Test image');
subplot(222);
contour(1:100,1:100,abs(output_image),levels)
a = gca();
a.isoview = "on";
a.title.font_size = 5;
mtlb_axis(axes);
xtitle('${\rm Steered\ in\ direction\ }\theta$');
subplot(223);
contour(1:100,1:100,abs(conv2(test_image,Ix,"same")),levels)
a = gca();
a.isoview = "on";
a.title.font_size = 5;
mtlb_axis(axes);
title('Horizontal filter')
subplot(224);
contour(1:100,1:100,abs(conv2(test_image,Iy,"same")),levels)
a = gca();
a.isoview = "on";
a.title.font_size = 5;
mtlb_axis(axes);
title('Vertical filter')
其它你可能感兴趣的问题