【问题标题】:OpenCV - Scale / stretch each pixel row of an image differently?OpenCV - 以不同方式缩放/拉伸图像的每个像素行?
【发布时间】:2017-03-23 07:37:26
【问题描述】:

我想水平放大/拉伸图像,但每个像素行需要不同的比例,具体取决于行的位置或行号?

我通过逐行裁剪源图像来实现 1 像素高的裁剪,然后使用 resize 以不同方式缩放每一行,最后在结果图像上复制缩放的像素行:这是我的代码:

        cv::Rect rowCropRect = cv::Rect(0,i, imgOut.size().width, 1);
        cv::Size scaledSize = cv::Size((1.f - smallFrameRatio) * rowCropRect.size().width, 1);

        if (smallestWidth < scaledSize.width)
            smallestWidth = scaledSize.width;

        Mat eachRowCrop(imgIn, rowCropRect);
        resize(eachRowCrop, eachRowCrop, scaledSize);

        rowCropRect.x = (imgIn.size().width - eachRowCrop.size().width) * 0.5f;
        rowCropRect.width = eachRowCrop.size().width;

        if (rowCropRect.x < 0) rowCropRect.x = 0;
        if (rowCropRect.width >= imgOut.size().width) rowCropRect.width = imgOut.size().width - 5;

        eachRowCrop.copyTo(imgOut(rowCropRect));
        eachRowCrop.release();

我通过在循环中迭代每一行来做到这一点。但其较慢的结果转换还不够好。

我希望能够直接在像素级别执行此操作,使用 cv::resize() 内部使用的一些插值数学,或者其他一些有效的方法。

有什么想法吗?

来源图片:

结果图片:

【问题讨论】:

  • 谢谢,我看过但不知道如何准备3x3变换矩阵?因为在我的情况下,我只知道我需要在每一行上应用的比例量,这对于图像的所有行都是不同的。 ?关于准备这种转换以及如何告诉它在什么行号上应用什么比例的任何想法?
  • 您可以通过getPerspectiveTransformdst 参数提供所需的结果大小的四边形来获得它
  • 其实固定点不止4个。我在上面添加了所需的结果图像。请查阅。请注意,这不是我想要的完全相同的变换,它可以是任何形状。规则是任何行都会有不同的规模,我知道它的价值。谢谢。
  • @slawekwin - 你能解释一下我如何在上面的解决方案中使用你建议的 API 吗?我对 openCV 不太满意,因此我们将不胜感激。

标签: c++ opencv image-processing linear-interpolation


【解决方案1】:

尝试使用重映射功能,如this tutorial 中所述。它应该允许您为图像中的每个点设置一个新的 x 和 y 位置(并且它处理所有插值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多