Алгоритм, который распознает изображения в документе и автоматически удаляет его - PullRequest
0 голосов
/ 03 июля 2019

У меня есть изображение ниже:

enter image description here

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

1 Ответ

1 голос
/ 03 июля 2019

Вы следуете ниже: (описания в комментариях к коду)

namedWindow("Original_Image", cv::WINDOW_FREERATIO);
namedWindow("Result", cv::WINDOW_FREERATIO);
cv::Mat img = cv::imread("5ZKfM.png");
cv::Mat copy;   // this just for showing image
img.copyTo(copy);

// to gray
cv::Mat gray;
cvtColor(img, gray, cv::COLOR_BGR2GRAY);
cv::Mat binaryImg;
// threshold the img to get a binary image
threshold(gray, binaryImg, 80, 255, cv::THRESH_BINARY_INV);

cv::morphologyEx(binaryImg, binaryImg, cv::MORPH_CLOSE, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)));

// Floodfill from point (0, 0)
cv::Mat im_floodfill = binaryImg.clone();
cv::floodFill(im_floodfill, cv::Point(0, 0), cv::Scalar(255));

// Invert floodfilled image
cv::Mat im_floodfill_inv;
bitwise_not(im_floodfill, im_floodfill_inv);
// Combine the two images to get the foreground.
cv::bitwise_or(im_floodfill_inv, binaryImg, binaryImg);

// find the contours
std::vector<std::vector<cv::Point> > contours;
cv::findContours(binaryImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

// get the largest contoure
cv::Rect rect;
for (std::vector<cv::Point> &contour : contours) {
    cv::Rect tempRect = cv::boundingRect(contour);
    if(tempRect.area() > rect.area()) {
        rect = tempRect;
    }
}

// get the sub mat of the picture from the original image
cv::Mat submatOriginal = img(rect);
// prepare the mask
cv::Mat submatBinary = binaryImg(rect);
// remove the picture from the image (set all pixels to white)
submatOriginal.setTo(cv::Scalar(255, 255, 255), submatBinary);

imshow("Result", img);
imshow("Original_Image", copy);
cv::waitKey();

И вот результат:

enter image description here

Примечание. Код - это C ++, но вы можете выполнить шаги и переопределить его в Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...