Я использую OpenCV для предварительной обработки изображений. Мне нужно вырезать только отсканированное фото, без белой области.
Я использую алгоритм:
Кто-нибудь может посоветовать, как мне найти это фото на отсканированном изображении? какие-нибудь примеры, методы?
Есть несколько способов достичь своей цели. Я приведу код для OpenCvSharp, он будет похож на простой C ++.
Попробуйте добавить нейтральную границу вокруг вашего изображения. Например, вы можете просто добавить 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);
У вас есть объект и практически белый фон. Вы можете выполнить любую операцию порогового значения, а затем взять самый большой BLOB-объект.
Обновить.
В обоих случаях темная линия в верхней части изображения и темная область в левом углу могут быть проблемой. В этом случае вы можете выбрать контур с наибольшей площадью по функции
double Cv2.ContourArea(Point[] Contour);
А затем попробуйте создать ограничивающий прямоугольник, который минимизирует ошибку.