gpt4 book ai didi

c++ - 极慢的双线性插值(与 OpenCV 相比)

转载 作者:太空狗 更新时间:2023-10-29 21:25:30 27 4
gpt4 key购买 nike

template<typename T>
cv::Mat_<T> const bilinear_interpolation(cv::Mat_<T> const &src, cv::Size dsize,
float dx, float dy)
{
cv::Mat_<T> dst = dsize.area() == 0 ? cv::Mat_<T>(src.rows * dy, src.cols * dx) :
cv::Mat_<T>(dsize);

float const x_ratio = static_cast<float>((src.cols - 1)) / dst.cols;
float const y_ratio = static_cast<float>((src.rows - 1)) / dst.rows;
for(int row = 0; row != dst.rows; ++row)
{
int y = static_cast<int>(row * y_ratio);
float const y_diff = (row * y_ratio) - y; //distance of the nearest pixel(y axis)
float const y_diff_2 = 1 - y_diff;
auto *dst_ptr = &dst(row, 0)[0];
for(int col = 0; col != dst.cols; ++col)
{
int x = static_cast<int>(col * x_ratio);
float const x_diff = (col * x_ratio) - x; //distance of the nearest pixel(x axis)
float const x_diff_2 = 1 - x_diff;
float const y2_cross_x2 = y_diff_2 * x_diff_2;
float const y2_cross_x = y_diff_2 * x_diff;
float const y_cross_x2 = y_diff * x_diff_2;
float const y_cross_x = y_diff * x_diff;
for(int channel = 0; channel != cv::DataType<T>::channels; ++channel)
{
*dst_ptr++ = y2_cross_x2 * src(y, x)[channel] +
y2_cross_x * src(y, x + 1)[channel] +
y_cross_x2 * src(y + 1, x)[channel] +
y_cross_x * src(y + 1, x + 1)[channel];
}
}
}

return dst;
}

这是一个双线性插值的实现,我用它把一个 512 * 512 的图像(“lena.png”)放大到 2048 * 2048。完成这项工作需要我 0.195 秒,但是 cv::resize(不是OpenCV 的 GPU 版本)只需要 0.026 秒。我不知道是什么让我的程序这么慢(OpenCV 比我快了将近 750%),我想看看 OpenCV 调整大小的源代码,但我找不到它的实现。

您是否知道为什么 OpenCV 的调整大小如此之快或我的双线性太慢?

    {
timeEstimate<> time;
cv::Mat_<cv::Vec3b> const src = input;
bilinear_interpolation(src, cv::Size(), dx, dy);
std::cout << "bilinear" << std::endl;
}

{
timeEstimate<> time;
cv::Mat output = input.clone();
cv::resize(input, output, cv::Size(), dx, dy, cv::INTER_LINEAR);
std::cout << "bilinear cv" << std::endl;
}

编译器:mingw4.6.2操作系统:win7 64位处理器:Intel® i3-2330M (2.2G)

最佳答案

有两个主要因素使 OpenCV 的版本更快:

  1. OpenCV 将调整大小实现为“可分离操作”。 IE。它分两步完成:图像先水平拉伸(stretch),然后垂直拉伸(stretch)。这种技术允许使用更少的算术运算来调整大小。

  2. 手动编码的 SSE 优化。

关于c++ - 极慢的双线性插值(与 OpenCV 相比),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13888210/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com