鱼眼图片效果(桶形畸变)算法(使用Java)?

4
我正在寻找一种算法(位图像素操作),可以从普通图片中模拟鱼眼镜头(桶形畸变)。目前我已经找到了涉及外部库(如OpenCV、OpenGL或jhlabs)的实现。由于我正在学习数字图像处理课程并且正在进行课程评估项目,我不确定使用任何外部库是否会让我获得好成绩。所以有没有人能给我这样的算法参考呢?
附注:我被要求在Java中实现它,但来自任何语言的示例都可以。
3个回答

6
很好,你已经能够找到做你想要的事情的示例。在你的问题中包含它们是有帮助的——这确保了阅读它的人和你在同一页面上。所以这里有一个链接
你想自己完成任务而不依赖于某个库来完成艰苦的工作也是好的。但这并不意味着你必须忽略这样的解决方案。以下是原因。
看看OpenCV在该链接中实际用于什么。这些是以cv开头的函数:
$ grep -o "cv\\w*" barrel.cpp | sort | uniq
cv
cvCreateImage
cvGet2D
cvGetSize
cvLoadImage
cvNamedWindow
cvSaveImage
cvSet2D
cvShowImage
cvWaitKey

如果您查看OpenCV API,所有这些函数都只处理平凡的任务,如图像创建、删除、显示、像素设置等。 这些任务都与桶形畸变无关。 至于桶形畸变,该解决方案不特定于OpenCV
实际上,程序的核心在这里:
float getRadialX(float x,float y,float cx,float cy,float k){
  x = (x*xscale+xshift);
  y = (y*yscale+yshift);
  float res = x+((x-cx)*k*((x-cx)*(x-cx)+(y-cy)*(y-cy)));
  return res;
}

float getRadialY(float x,float y,float cx,float cy,float k){
  x = (x*xscale+xshift);
  y = (y*yscale+yshift);
  float res = y+((y-cy)*k*((x-cx)*(x-cx)+(y-cy)*(y-cy)));
  return res;
}

这仅仅是径向变换公式 -- 这是你需要理解的部分。正如你所看到的,其中没有OpenCV调用。


哇,非常感谢!我想我没有彻底检查那段代码。虽然基于那段代码,我可能能够继续我的项目而不使用OpenCV,但由于我对OpenCV不是很熟悉,它的Java封装器是否与这个特定任务兼容呢? - tsong99
是的,在理论上,你应该能够在Java中重复使用大部分代码而不需要太多的努力。但我从未在Java中使用过OpenCV,所以我不知道实际情况如何。 - mpenkov
嗨,我正在尝试在Android中创建相同的效果。你能解释一下上面的方法如何工作吗?目前,我有一个应用程序,在位图上放置一个圆形,我有一个算法,只针对圆形中的像素。我知道圆的半径,圆的中心点,可以逐个像素地循环遍历位图。这是我在图像处理方面所做的全部工作,因为我是新手。你介意给我讲解一下如何应用这种效果吗?任何帮助都将不胜感激。如果您愿意,我可以使用我的源代码开始一个线程。 - turtleboy
@turtleboy:很遗憾,我没有任何Android经验,所以无法帮助你。但如果你在提问时标记“android”,很可能会找到能够帮助你的人。 - mpenkov
@mishsa 好的谢谢,但是上面的代码并不特定于Android,我只是想知道径向变换是如何工作的,以及如何在位图中进行该变换。例如,通常您会有一个源图像和一个目标图像,然后将新点绘制到目标图像中。其他我不清楚的事情是,我需要什么变量,例如半径、像素的X和Y坐标等。 - turtleboy
一旦您拥有了RadialX和RadialY,如何将它们应用于再次生成图像?我正在使用R,不确定如何应用此解决方案以在最后获得图像。 - SqueakyBeak

3

4
欢迎来到Stack Overflow!请注意,仅提供指向您自己的网站/产品的裸链接在这里并不被鼓励,有两个原因:首先,答案应该作为一个独立的答案发布,而不仅仅是外部网站的链接。其次,在这里进行自我推销往往会受到反感,并经常被标记为垃圾邮件(特别是如果没有披露您正在链接到自己的网站/产品)。 - Andrew Barber
2
正如安德鲁所说,你的帖子看起来非常详细。你能否总结一下与这个问题相关的信息,并将其放在你的答案中?这样可以防止你的链接在未来某个时候消失。 - Brad Larson


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接