如何在C#中裁剪倾斜的图像

10

我拥有一张被手机倾斜的图像。我想要在两个矩形之间裁剪图像的部分/区域,以找到它们之间的圆形。我已经获取了中间部分的所有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库进行裁剪,但会像下面这样切割一部分

enter image description here

这会扭曲圆形的形状,使其变成椭圆,并对其他计算造成问题。
请告诉我如何使用4个点裁剪图像。
或者通过传递校正角度来纠正图像的倾斜是否有任何方法?


你只需要提取圆形,还是你真的想要像素失真修复? - VC.One
1个回答

10

如果这个四边形包含有角边,那么经过变换后的效果会非常好。

使用这张图片:

enter image description here

使用以下代码进行变换:

        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");

这张图片显示的结果:

enter image description here

我认为这正是您在寻找的。

关键在于确保四边形变换使用了倾斜的边缘以避免扭曲。我的点大概长成这样:

enter image description here


最好使用距离公式和平均值来计算宽度和高度,这样会更精确。 - Marco Florian
嗨,TheSoftwareJedi,非常感谢,它对我有用。 - Aamir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接