Why opencv resize and corresponding warpAffine methods produce different results?

Viewed 48

I did some refactoring and decided to replace several steps like shift image + resize with corresponding warpAffine methods. I noticed some changes in the final result and started to analyze it. Finally, I found that the following code produces different results. Where did I go wrong?

cv::Mat warp_resize(const cv::Mat& image, int newSizeX, int newSizeY)
{
    cv::Mat out = cv::Mat::zeros(newSizeY, newSizeX, image.type());
    auto kx     = static_cast<double>(newSizeX) / image.cols;
    auto ky     = static_cast<double>(newSizeY) / image.rows;
    cv::Mat mat = (cv::Mat_<double>(2, 3) << kx, 0, 0, 0, ky, 0);
    cv::warpAffine(image, out, mat, out.size(), cv::INTER_LINEAR);
    return out;
}

cv::Mat resize_func(const cv::Mat& image, int newSizeX, int newSizeY)
{
    cv::Mat out = cv::Mat::zeros(newSizeY, newSizeX, image.type());
    auto kx     = static_cast<double>(newSizeX) / image.cols;
    auto ky     = static_cast<double>(newSizeY) / image.rows;
    cv::resize(image, out, cv::Size(), kx, ky, cv::INTER_LINEAR);
    return out;
}

void test()
{
    auto image = cv::imread("c:/temp/resize_test/lena.png", cv::IMREAD_GRAYSCALE);
    const auto warped = warp_resize(image, 50, 100);
    const auto resized = resize_func(image, 50, 100);
    cv::Mat result;
    cv::subtract(warped, resized, result, cv::noArray());
    cv::imwrite("c:/temp/resize_test/diff.png", result);
 }

Initial picture lena.png

The difference image. The outline is still visible in this picture. difference

0 Answers
Related