matlab - OpenCV MATLAB : How to draw a line having a particular Intensity profile?

标签 matlab image-processing opencv opencvdotnet

下面是 的任意手绘强度分布图线在图像中:
enter image description here

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

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

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

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

最佳答案

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

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

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

关于matlab - OpenCV MATLAB : How to draw a line having a particular Intensity profile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10748374/

相关文章:

python - FFT 获得两幅图像之间的相似度

image - 使用开源图形库去除灰尘和划痕

opencv - 非平面钻机的相机标定

c++ - 如何将 vector<Mat> 转换为 vector<float>?

matlab - 基于分布函数生成随机数

matlab - 找到 x^b+a = a 的最大 x

image - Java或C进行图像处理

opencv - 饱和度、值重新映射以补偿光照

matlab - 在 Matlab 中的同一张图上用一个 y 轴绘制多个图,另一个图用不同的 y 轴绘制

matlab - Matlab 上的图像去模糊