鱼眼图像矫正之——柱面模型投影公式推导

在研究鱼眼矫正时,发现了这篇好博文,按照其思路我也针对自己的课题做了公式推导,大致效果一样,因此我就直接引用他的博文内容好了。
引自: 柱面投影解析
还有一篇较好的博客,主要针对柱面投影后的图像做拼接: 柱面投影+模板匹配+渐入渐出融合

【Octave】柱面投影简析

========================我是分割线==========================

在做全景拼接的时候,为了保持图片中的空间约束与视觉的一致性,需要做一定的预处理,可以是球面投影,柱面投影等。

如果仅仅是做水平方向的拼接,则做柱状投影就好了

一. 原理

  把平面图像投影到圆柱的曲面上。

  如下图,四边形GHEF表示待处理原图,投影之后,变成曲面JDILCK(黄色点标注)

  鱼眼图像矫正之——柱面模型投影公式推导_第1张图片

  俯视图如下,DCE为待处理图像平面,FCG为投影所得曲面。

  鱼眼图像矫正之——柱面模型投影公式推导_第2张图片  鱼眼图像矫正之——柱面模型投影公式推导_第3张图片

  鱼眼图像矫正之——柱面模型投影公式推导_第4张图片    鱼眼图像矫正之——柱面模型投影公式推导_第5张图片

   设,原图像宽W,高H,角度FOG为相机视场角度α(一般为45°,即PI/4),圆形半径(焦距)f 有tan 1/2α = W / (2 * f), 则有f = W / (2 * tan(α/2))

      依次推算出,目标图像的宽(曲线FCG长)W‘ = f * α, 目标图像高H’不变, H‘ = H

     第一种推算:以图像像素原始坐标计算(即,左上角为原点)

   鱼眼图像矫正之——柱面模型投影公式推导_第6张图片

     公式如下:

   鱼眼图像矫正之——柱面模型投影公式推导_第7张图片

   第二种推算:设置图像原点为(W/2, H/2),用以简化计算步骤

  鱼眼图像矫正之——柱面模型投影公式推导_第8张图片

二. Octave实现

I = imread('images/doge.bmp');
[height, width, depth] = size(I);
A = I;
centerX = width / 2;
centerY = height / 2;
% alpha = pi / 4;
f = width / (2 * tan(pi/4/2));
for i = 1 : width,
	for j = 1 : height,
		theta = asin((i - centerX) / f);
		pointX = int32(f * tan((i - centerX) / f) + centerX);
		pointY = int32((j - centerY) / cos(theta) + centerY);
		for k = 1 : depth,
			if pointX >= 1 && pointX <= width && pointY >= 1 && pointY <= height,
				A(j, i, k) = I(pointY, pointX, k);
			else
				A(j, i, k) = 0;
			end;
		end;
	end;
end;
subplot(1, 2, 1);
imshow(I);
subplot(1, 2, 2);
imshow(A);

Octave & Matlab代码

三. 效果

鱼眼图像矫正之——柱面模型投影公式推导_第9张图片

大致的公式没啥问题,本人按照思路复现了代码结果。

你可能感兴趣的:(计算机视觉)