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);
}
The difference image. The outline is still visible in this picture.

