首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么正向图像扭曲会在图像中留下空洞?

为什么正向图像扭曲会在图像中留下空洞?
EN

Stack Overflow用户
提问于 2014-03-28 14:22:45
回答 2查看 458关注 0票数 0

我正在使用Homography扭曲第一张图像,新图像由孔组成。这是什么原因呢?

EN

回答 2

Stack Overflow用户

发布于 2014-03-28 16:31:46

单应性是映射图像像素坐标的变换矩阵(参考wiki。因此,假设图像左上角的均匀坐标为:p0 = [0 0 1]^T。在一些一般的单应性H下,可能是因为p = H * p0不是新扭曲图像的左上角,所以在新图像的左上角将有孔。下面是一个更直观的例子(特别是对于相似性转换,图像大小将会缩小):

票数 0
EN

Stack Overflow用户

发布于 2014-03-28 18:05:21

这取决于洞的形状。

如果这些空洞实际上是散布在输出图像上的空洞,那么这意味着发生了一些不好的事情(某个地方的bug,或者你的单应性可能因为一个糟糕的估计过程而退化)。

您可以尝试将直接调用单应性扭曲的结果与cv::remap()函数的输出与从单应性矩阵获得的映射进行比较:

代码语言:javascript
复制
/* Assuming the input image is not empty */
cv::Mat originalImage; // Not empty!

/* Our outputs */
cv::Mat homographyOutput, remapOutput;

cv::Mat H;             // This is our homography
cv::Mat map_x, map_y;  // These matrices are needed for cv::remap()

/* Compute mappings from homography */
map_x.create(originalImage.size(), CV_32FC1);
map_y.create(originalImage.size(), CV_32FC1);
for (int y = 0; y < originalImage.size().height; ++y)
  for (int x = 0; x < originalImage.size().width; ++x)
  {
    double x_mapped = H.at<double>(0,0)*x + H.at<double>(0,1)*y + 
                        H.at<double>(0,2);
    double y_mapped = H.at<double>(1,0)*x + H.at<double>(1,1)*y + 
                        H.at<double>(1,2);
    double w = H.at<double>(2,0)*x + H.at<double>(2,1)*y + 
                        H.at<double>(2,2);
    x_mapped /= w;
    y_mapped /= w;
    map_x.at<float>(y,x) = (float)x_mapped;
    map_y.at<float>(y,x) = (float)y_mapped;
  }

/* Now call remap */
cv::remap(originalImage, remapOutput, map_x, map_y);

我把单应性映射部分留给您(使用cv::warpPerspective())。这两个结果应该是相似的(如果不相等,取决于插值和边界设置)。您还可以在映射计算循环中添加额外的健全性检查,以了解哪里出了问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22705632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档