Как обрезать наклонное изображение в C#

У меня есть захват изображения наклона с помощью мобильного телефона. Я хочу разрезать участок / часть изображения между двумя прямоугольниками с обеих сторон, чтобы найти круги между ними. У меня есть все 4 координаты средней части, такие как (x0,y0),(x1,y1),(x2,y2),(x3,y3).

Мой образ выглядит так, введите описание изображения здесь

Но функция обрезки у меня что-то вроде

public static Bitmap CropImage(int x, int y, int width, int height, Bitmap bitmap)
{

    Bitmap croppedImage;
    var originalImage = bitmap;
    {
        Rectangle crop = new Rectangle(x, y, width, height);
        croppedImage = originalImage.Clone(crop, originalImage.PixelFormat);

    } // Here we release the original resource - bitmap in memory and file on disk.

    return croppedImage;
}  

Но выше функция обрезает часть в виде прямоугольника, как показано в 1-й и 2-й красной рамке.
Я ищу код для вырезания части, показанной в 3-м красном прямоугольнике. У меня был поиск кода и узнать код ниже

List<IntPoint> corners = new List<IntPoint>();

corners.Add(new IntPoint(x0, y0));
corners.Add(new IntPoint(x3, y3));
corners.Add(new IntPoint(x1 + 30, y1 + 20));
corners.Add(new IntPoint(x2 + 30, y2 + 0));
AForge.Imaging.Filters.QuadrilateralTransformation filter = new AForge.Imaging.Filters.QuadrilateralTransformation(corners, WidthOfCut, HeightOfCut);
Bitmap newImage = filter.Apply(mainOuterWindow);

AForge.Imaging. библиотека, но она будет резать зелье, как показано ниже

введите описание изображения здесь

которые нарушают форму круга и делают его эллипсом, что вызывает проблемы для других расчетов.
пожалуйста, дайте мне знать, как обрезать изображение, используя 4 балла.
Или есть какой-то способ исправить наклон изображения, передав угол коррекции?

1 ответ

Решение

Если четырехугольник включает в себя угловые стороны, результирующее преобразование на самом деле выглядит довольно хорошо.

Используя это изображение:

Преобразовано этим кодом:

        var i = Image.FromFile("pic.png");

        List<IntPoint> corners = new List<IntPoint>();
        corners.Add(new IntPoint(63, 183));
        corners.Add(new IntPoint(863, 151));
        corners.Add(new IntPoint(869, 182));
        corners.Add(new IntPoint(65, 211));
        QuadrilateralTransformation filter = new QuadrilateralTransformation(corners, 869 - 63, 211 - 183);
        var i2 = filter.Apply(i);

        i2.Save("pic2.png");

Результаты на этом изображении:

Я думаю, что это именно то, что вы ищете.

Уловка заключалась в том, чтобы четырехугольное преобразование использовало угловые стороны, чтобы избежать перекоса. Мои очки выглядят примерно так:

Другие вопросы по тегам