OpenCV MATLAB:如何绘制具有特定强度轮廓的线?

时间:2012-05-25 04:13:12

标签: matlab image-processing opencv opencvdotnet

以下是图像中线的任意手绘强度曲线: enter image description here

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

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

您什么时候会遇到这种情况?

假设您从相机拍摄照片(假设完全白色),将物体放在桌子上,并将相机放在垂直方向上方。与在边缘处反射的光相比,从相机垂直向下到达图像中心的光的强度将更强。您可以测量图像中任何一行的像素值,您将找到如上所示的强度曲线。由于我暂时没有相机,我想模仿这种情况。怎么做到这一点?

1 个答案:

答案 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]);

给了我以下结果: arc