0

下面是图像中线条的任意手绘强度分布: 在此处输入图像描述

任务是画线。轮廓可以近似为圆弧或椭圆弧。这是我为相机校准所做的。由于我没有实际的工业相机,我试图模拟校准所需的校正。

这个问题可以改写,因为我想要像素值,它会遵循类似于上面的图。我想使用程序(最好使用 opencv)来执行此操作,而不是手动输入这些值,因为我一行中有数千个像素。
一个算法/伪代码就足够了。另请注意,我没有任何实际的强度配置文件,否则我会阅读这些值。

什么时候会遇到这样的情况

假设您从相机拍摄照片(假设全白),您的对象被放置在桌子上,相机在垂直方向正上方。与在边缘反射的光相比,从相机垂直向下射到图片中心的光的强度会更强。您测量图像中任何一条线的像素值,您会发现如上图所示的强度曲线。由于我暂时没有相机,我想模仿这种情况。如何做到这一点?

4

1 回答 1

1

这不完全是图像处理,而是图像生成......但无论如何。

既然你想要一个弧,我们仍然需要在那个弧上三个点,让我们取第一个、中间和最后一个点(我认为的关键特征):

N = 100; % number of pixels
x1 = 1;
x2 = floor(N/2);
x3 = N;

y1 = 242;
y2 = 255;
y3 = 242;

现在画一个包含这些点的圆弧。这个问题已经在这里讨论过matlab: http: //www.mathworks.nl/matlabcentral/newsreader/view_thread/297070

x21 = x2-x1; y21 = y2-y1;
x31 = x3-x1; y31 = y3-y1;
h21 = x21^2+y21^2; h31 = x31^2+y31^2;
d = 2*(x21*y31-x31*y21);
a = x1+(h21*y31-h31*y21)/d; % circle center x
b = y1-(h21*x31-h31*x21)/d; % circle center y
r = sqrt(h21*h31*((x3-x2)^2+(y3-y2)^2))/abs(d); % circle radius

如果您假设中间值总是较大(因此它是您必须绘制的圆的上部),您可以使用以下方法绘制:

x = x1:x3;
y = b+sqrt(r^2-(x-a).^ 2);
plot(x,y);

您可以调整可见窗口

xlim([1 N]);
ylim([200 260]);

这给了我以下结果: 弧

于 2012-05-25T11:29:01.323 回答