c # — Обнаружение документа на отсканированном изображении OpenCV

Я использую OpenCV для предварительной обработки изображений. Мне нужно вырезать только отсканированное фото, без белой области.
Я использую алгоритм:

  • image_canny <- примените детектор краев Canny к этому каналу
  • для порога в связке
  • image_thresholds [Порог] <- применить порог к этому каналу
    для каждого контура, найденного в {image_canny} U image_thresholds:
  • Примерный контур с полигонами
  • если аппроксимация имеет четыре угла и углы близки к 90 градусам. для поиска прямоугольного объекта на отсканированном изображении. Но этот пример не работает, если я положу свою картинку в угол сканера!

Кто-нибудь может посоветовать, как мне найти это фото на отсканированном изображении? какие-нибудь примеры, методы?

3

Решение

Есть несколько способов достичь своей цели. Я приведу код для OpenCvSharp, он будет похож на простой C ++.

  1. Попробуйте добавить нейтральную границу вокруг вашего изображения. Например, вы можете просто добавить 10-20 пикселей белого вокруг исходного изображения. Он может создавать ложные контуры, но все же ваша целевая часть изображения больше не будет находиться в углу.

    Mat img = Cv2.ImRead("test.jpg");
    Mat imgExtended = new Mat(new OpenCvSharp.Size(img.Size().Width + 40, img.Size().Height + 40), MatType.CV_8UC3, Scalar.White);
    OpenCvSharp.Rect roi = new OpenCvSharp.Rect(new OpenCvSharp.Point(20, 20), img.Size());
    img.CopyTo(imgExtended.SubMat(roi));
    img = imgExtended;
    Mat coloredImage = img.Clone();
    Cv2.CvtColor(img, img, ColorConversionCodes.BGR2GRAY);
    OpenCvSharp.Point[][] contours;
    HierarchyIndex[] hierarchy;
    Cv2.Canny(img, result, 80, 150);
    Cv2.FindContours(result, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
    
  2. У вас есть объект и практически белый фон. Вы можете выполнить любую операцию порогового значения, а затем взять самый большой BLOB-объект.

Обновить.
В обоих случаях темная линия в верхней части изображения и темная область в левом углу могут быть проблемой. В этом случае вы можете выбрать контур с наибольшей площадью по функции

double Cv2.ContourArea(Point[] Contour);

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

0

Другие решения


По вопросам рекламы [email protected]