Должен ли я использовать PyrDown перед изменением размера для лучшего результата? - PullRequest
0 голосов
/ 31 марта 2019

Используя оболочку 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);
            }
        }

Результат:

enter image description here

Это нормально или что-то не так с функцией изменения размера OpenCV (или оболочкой)?

Edit:

То, что я на самом деле спрашиваю, это нормальные результаты?

enter image description here

Исходное изображение: enter image description here

Edit2

Согласно , и , мои результаты понижающей дискретизации являются нормальными.

...