发布时间:2025-12-09 21:45:54 浏览次数:4
本文主要介绍柱面投影变换,将这种变换用于图像处理,可以产生图像扭曲的效果,如下图所示,产生了将平面图像投影到了柱面上的视觉效果。博客最后给出了柱面投影的python实现,供读者参考。
如下图所示,矩形GHEF为待处理的原图,投影到柱面上之后则变成了曲面JDILCK。我们假设相机模型为针孔模型,且所处位置为N点,下面分析原图GHEF与投影曲面JDILCK各像素之间的对应关系。
俯视图如下图所示,我们以原图像的中心(W/2, H/2)为原点,假设相机的焦距为f(f的值我们可以随意选择,不需要相机的真实焦距)。
下面我们进行几何分析,点 –W/2 映射到 –W‘/2 ,点W/2 映射到W’/2 ,因此直线【–W/2,W/2】为原图X方向,曲线【–W‘/2 ,O ,W’/2】为投影曲面的X方向。
假设原平面上有一点x, 映射到曲面上为x‘(在投影曲面X方向上的坐标为x‘, 即弧长为x’),设角xNO为θ,θ = arctan
(x/f),弧长x’ = f×θ。因此X方向上柱面投影的映射关系为 x‘ = f × arctan(x/f)。
接下来看侧视图,以确定Y方向上原图与投影图像素的对应关系。侧视图中的红色虚线与俯视图中的红色虚线相对
应。由俯视图可得线段xN = f / cos(θ),由侧视图中的相似三角形关系可得y‘ / f = y /(f/cos(θ))。
综上所述,可得原图与投影曲面各像素的对应关系如下
根据上面三个式子,我们便可以对图片进行柱面投影变换了。python实现代码如下所示。 from skimage.io import imread, imshow ,imsavefrom skimage.transform import resizeimport mathimport numpy as npimg = imread('img.jpg')img = (resize(img , [1000,800])*255).astype(np.uint8)###圆柱投影def cylindrical_projection(img , f) :rows = img.shape[0]cols = img.shape[1]#f = cols / (2 * math.tan(np.pi / 8))blank = np.zeros_like(img)center_x = int(cols / 2)center_y = int(rows / 2)for y in range(rows):for x in range(cols):theta = math.atan((x- center_x )/ f)point_x = int(f * math.tan( (x-center_x) / f) + center_x)point_y = int( (y-center_y) / math.cos(theta) + center_y)if point_x >= cols or point_x < 0 or point_y >= rows or point_y < 0:passelse:blank[y , x, :] = img[point_y , point_x ,:]return blankwaved_img = cylindrical_projection(img,500)imshow(waved_img)2、此外,我们可以将相机的位置N点进行移动,产生不同的柱面变换。在程序实现时,我们直接更改center_x与
center_y的值即可。例如,center_x = int(cols/3), center_y = int(rows/2), 产生的效果图如下所示。