Обнаружение квадрата на изображении

В школе мы готовим художественные работы, которые мы отсканировали и хотим автоматически обрезать до нужного размера. Дети (попытка) рисовать внутри прямоугольника:

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

Я хочу определить границы внутреннего прямоугольника, поэтому я применил несколько фильтров в согласии.net:

var newImage = new Bitmap(@"C:\Temp\temp.jpg");
var g = Graphics.FromImage(newImage);
var pen = new Pen(Color.Purple, 10);

var grayScaleFilter = new Grayscale(1, 0, 0);
var image = grayScaleFilter.Apply(newImage);
image.Save(@"C:\temp\grey.jpg");

var skewChecker = new DocumentSkewChecker();
var angle = skewChecker.GetSkewAngle(image);
var rotationFilter = new RotateBilinear(-angle);
rotationFilter.FillColor = Color.White;
var rotatedImage = rotationFilter.Apply(image);
rotatedImage.Save(@"C:\Temp\rotated.jpg");

var thresholdFilter = new IterativeThreshold(10, 128);
thresholdFilter.ApplyInPlace(rotatedImage);
rotatedImage.Save(@"C:\temp\threshold.jpg");

var invertFilter = new Invert();
invertFilter.ApplyInPlace(rotatedImage);
rotatedImage.Save(@"C:\temp\inverted.jpg");

var bc = new BlobCounter
{
    BackgroundThreshold = Color.Black,
    FilterBlobs = true,
    MinWidth = 1000,
    MinHeight = 1000
};

bc.ProcessImage(rotatedImage);
foreach (var rect in bc.GetObjectsRectangles())
{
    g.DrawRectangle(pen, rect);
}

newImage.Save(@"C:\Temp\test.jpg");

Это создает следующее перевернутое изображение, которое BlobCounter использует в качестве входных данных: введите здесь описание изображения

Но результат blobcounter не очень точен, фиолетовые линии показывают, что обнаружил BC.

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

Будет ли лучшая альтернатива BlobCounter в согласии.net, или есть другая библиотека C #, лучше подходящая для такого компьютерного зрения?


person Roger Far    schedule 12.10.2020    source источник
comment
Граница всегда одного цвета? Область обрезки всегда прямоугольная (то есть всегда имеет четыре угла), верно?   -  person stateMachine    schedule 12.10.2020
comment
Верно, я даже применил коррекцию поворота, чтобы получился почти идеально прямой прямоугольник. Каждая часть сканируется в одном разрешении.   -  person Roger Far    schedule 12.10.2020


Ответы (1)


person    schedule
comment
Хорошее решение! N i c e - person stateMachine; 12.10.2020
comment
Это работает хорошо, за исключением того, что, к сожалению, под изображением есть часть, где ученики пишут свое имя (обрежьте это, чтобы упростить пример), и он считает, что это часть прямоугольника, потому что у него есть линия для записи. В идеале я должен добавить функцию, чтобы проверить либо толщину линии, либо посмотреть, насколько она непрерывна. - person Roger Far; 13.10.2020
comment
@RogerFar да, есть много способов настроить его, и в конце концов все сведется к тому, что вам подходит. В любом случае удачи - person TheGeneral; 13.10.2020
comment
В конце концов мне пришлось сделать лишь небольшую модификацию: я искал лучшее значение от середины, таким образом, я также захватывал внутреннюю часть коробки! Я проверил его на нескольких тестовых образцах, и он отлично работает! - person Roger Far; 13.10.2020
comment
@RogerFar ааа, хорошо, это звучит как победа, рад, что это помогло. Также хорошая работа с внутренней стороной наружу, похоже, она будет работать хорошо. - person TheGeneral; 13.10.2020