Saa*_*nia 5 matlab image-processing edge-detection
我想检测图像中的边缘(具有子像素精度),如下所示:

分辨率约为600 X 1000.
我在这里看到了Mark Ransom的评论,其中提到了垂直边缘的边缘检测算法.我还没有遇到任何问题.在我的情况下是否有用(因为边缘不是严格的直线)?但它始终是一个垂直边缘.我希望它至少精确到像素的1/100.我还想访问这些子像素坐标值.
我尝试过Agustin Trujillo-Pino的"精确亚像素边缘位置".但这并没有给我一个持续的优势.
还有其他算法吗?我将使用MATLAB.
我附加了另一个算法必须处理的类似图像:

任何输入将不胜感激.
谢谢.
编辑:
我想知道我是否可以这样做:在MATLAB中应用Canny/Sobel并获得该图像的边缘(注意它不是连续的线).然后,以某种方式插入此Sobel边缘并获得子像素中的坐标.可能吗?
一种简单的方法是垂直投影图像并使用适当的函数拟合投影轮廓。
这是一个尝试,atan形状如下:
% Load image
Img = double(imread('bQsu5.png'));
% Project
x = 1:size(Img,2);
y = mean(Img,1);
% Fit
f = fit(x', y', 'a+b*atan((x0-x)/w)', 'Startpoint', [150 50 10 150])
% Display
figure
hold on
plot(x, y);
plot(f);
legend('Projected profile', 'atan fit');
Run Code Online (Sandbox Code Playgroud)
结果:

我得到你的第一张图片的 x_0 = 149.6 pix。
但是,我怀疑这些图像能否实现 1/100 像素的子像素精度,原因如下:
正如您在配置文件中看到的,您的白色已饱和(灰度级为 255)。当你切割真实的atan轮廓时,贴合度是有偏差的。如果你可以控制实验,我建议你再做一次,例如缩短曝光时间。
关于过渡的点没有那么多,所以关于过渡在哪里的信息也没有那么多。通常,您的分辨率将是(或您喜欢的任何形状)宽度的平方根atan。在您的情况下,这最多将子像素分辨率限制为像素的 1/5。
最后,你的边缘并不是严格垂直的,而是稍微倾斜的。如果您选择使用这种投影方法,为了提高精度,您应该在投影之前寻找一种纠正这种倾斜的方法。但这不会将您的准确性提高几个数量级。
最好的,