Improve bilinear interpolation: if output type is an integer, round instead of truncating

This commit is contained in:
Juha Reunanen 2019-10-30 12:31:29 +02:00
parent b442a3dc8e
commit 865f2ae10e
2 changed files with 13 additions and 5 deletions

View File

@ -865,10 +865,18 @@ namespace dlib
float fout[4]; float fout[4];
out.store(fout); out.store(fout);
out_img[r][c] = static_cast<T>(fout[0]); const auto convert_to_output_type = [](float value)
out_img[r][c+1] = static_cast<T>(fout[1]); {
out_img[r][c+2] = static_cast<T>(fout[2]); if (std::is_integral<T>::value)
out_img[r][c+3] = static_cast<T>(fout[3]); return static_cast<T>(value + 0.5);
else
return static_cast<T>(value);
};
out_img[r][c] = convert_to_output_type(fout[0]);
out_img[r][c+1] = convert_to_output_type(fout[1]);
out_img[r][c+2] = convert_to_output_type(fout[2]);
out_img[r][c+3] = convert_to_output_type(fout[3]);
} }
x = -x_scale + c*x_scale; x = -x_scale + c*x_scale;
for (; c < out_img.nc(); ++c) for (; c < out_img.nc(); ++c)

View File

@ -136,7 +136,7 @@ int main(int argc, char** argv) try
static_cast<int>(chip_details.rect.width()) static_cast<int>(chip_details.rect.width())
); );
dlib::resize_image(mask, resized_mask, interpolate_nearest_neighbor()); dlib::resize_image(mask, resized_mask);
for (int r = 0; r < resized_mask.nr(); ++r) for (int r = 0; r < resized_mask.nr(); ++r)
for (int c = 0; c < resized_mask.nc(); ++c) for (int c = 0; c < resized_mask.nc(); ++c)