以下是图像中线的任意手绘强度曲线:
任务是绘制行。轮廓可以近似为圆弧或椭圆弧。 我正在做相机校准。由于我没有实际的工业相机,我试图模拟校准所需的校正。
问题可以改写,因为我想要的像素值将遵循类似于上面的图。我想使用程序(最好使用opencv)而不是手动输入这些值,因为我在行中有数千个像素。
算法/伪代码就足够了。另请注意,我没有任何实际的强度配置文件,否则我会读取这些值。
您什么时候会遇到这种情况??
假设您从相机拍摄照片(假设完全白色),将物体放在桌子上,并将相机放在垂直方向上方。与在边缘处反射的光相比,从相机垂直向下到达图像中心的光的强度将更强。您可以测量图像中任何一行的像素值,您将找到如上所示的强度曲线。由于我暂时没有相机,我想模仿这种情况。怎么做到这一点?
答案 0 :(得分: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]);
给了我以下结果: