Используя оболочку OpenCvSharp, я использовал эту функцию для изменения размера изображений (с сохранением соотношения сторон)
public static void Resize_PreserveAspectRatio(this Mat mat, Mat dst, int length, InterpolationFlags st = InterpolationFlags.Cubic, bool changeMaxLength = true)
{
double w = mat.Width;
double h = mat.Height;
double div = changeMaxLength ? Math.Max(w, h) : Math.Min(w, h);
double w1 = (w / div) * length;
double h1 = (h / div) * length;
Cv2.Resize(mat, dst, new Size(w1, h1), 0d, 0d, st);
}
При изменении размера изображения шириной 1920 пикселей до размера 200 пикселей я понял, что результат выглядит плохо, даже если я использую кубическую интерполяцию. Я пробовал этот код, который не использует OpenCV изменения размера напрямую, но сначала используйте PyrDown:
public static void Resize_PreserveAspectRatio(this Mat mat, Mat dst, int length, InterpolationFlags st = InterpolationFlags.Cubic, bool changeMaxLength = true)
{
double w = mat.Width;
double h = mat.Height;
double len2x = length * 2d;
double div = changeMaxLength ? Math.Max(w, h) : Math.Min(w, h);
if (div > len2x)
{
using (Mat mat1 = mat.Clone())
{
while (div > len2x)
{
Cv2.PyrDown(mat1, mat1);
w = mat1.Width;
h = mat1.Height;
div = changeMaxLength ? Math.Max(w, h) : Math.Min(w, h);
}
double w1 = (w / div) * length;
double h1 = (h / div) * length;
Cv2.Resize(mat1, dst, new Size(w1, h1), 0d, 0d, st);
}
}
else
{
double w1 = (w / div) * length;
double h1 = (h / div) * length;
Cv2.Resize(mat, dst, new Size(w1, h1), 0d, 0d, st);
}
}
Результат:
Это нормально или что-то не так с функцией изменения размера OpenCV (или оболочкой)?
Edit:
То, что я на самом деле спрашиваю, это нормальные результаты?
Исходное изображение:
Edit2
Согласно , и , мои результаты понижающей дискретизации являются нормальными.