Удалить блики с фотографии opencv

Итак, im использует opencv для захвата документа, сканирования и обрезки. Когда в комнате нет освещения, она прекрасно работает. Когда в комнате есть свет, и на столе есть блик, и документ находится рядом с ним, он также захватывает блик как часть прямоугольника.

Как можно удалить блики с фотографии?

вот код im, используемый для получения изображения, которое я хочу:

 Mat &image = *(Mat *) matAddrRgba;
    Rect bounding_rect;

    Mat thr(image.rows, image.cols, CV_8UC1);
    cvtColor(image, thr, CV_BGR2GRAY); //Convert to gray
    threshold(thr, thr, 150, 255, THRESH_BINARY + THRESH_OTSU); //Threshold the gray

    vector<vector<Point> > contours; // Vector for storing contour
    vector<Vec4i> hierarchy;
    findContours(thr, contours, hierarchy, CV_RETR_CCOMP,
                 CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image
    sort(contours.begin(), contours.end(),
         compareContourAreas);            //Store the index of largest contour
    bounding_rect = boundingRect(contours[0]);

    rectangle(image, bounding_rect, Scalar(250, 250, 250), 5);

вот фотография бликов im talking о компании:

enter image description here

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

Mat &image = *(Mat *) matAddrRgba;

    Mat hsv, newImage, inpaintMask;
    cv::Mat lower_red_hue_range;
    inpaintMask = Mat::zeros(image.size(), CV_8U);
    cvtColor(image, hsv, COLOR_BGR2HSV);
    cv::inRange(hsv, cv::Scalar(0, 0, 215, 0), cv::Scalar(180, 255, 255, 0),
                lower_red_hue_range);
    image = lower_red_hue_range;

    inpaint(image, lower_red_hue_range, newImage, 3, INPAINT_TELEA);

1 ответов


Я имел дело с этой проблемой раньше, и изменение освещения всегда является проблемой в компьютерном зрении для обнаружения и описания изображений. Я фактически обучил классификатор для цветовых пространств HSV вместо RGB/BGR, который отображал изображение с изменением падающего света на тот, у которого нет внезапных ярких / темных пятен (это будет метка). Это сработало для меня довольно хорошо, однако изображения всегда были одного и того же фона (я не знаю, есть ли у вас это).

конечно, машинное обучение может решить проблему, но это может быть перебор. Пока я делал вышеупомянутое, я наткнулся CLAHE который работал довольно хорошо с для местного повышения контраста. Я предлагаю вам попробовать это, прежде чем обнаруживать контуры. Кроме того, для этой цели можно использовать другое цветовое пространство, например HSV/Lab/Luv вместо RGB/BGR. Вы можете применить CLAHE отдельно к каждому каналу, а затем объединить их.

давайте мне знать, если вам нужна другая информация. Я реализовал это с вашим изображением в python, он работает довольно хорошо, но я бы оставил кодирование вам. Я мог бы обновить результаты, которые я получил через пару дней (надеясь, что вы получите их первыми ;) ). Надеюсь, это поможет.

Gray image

V channel of HSV after CLAHE - clipLimit=10, TileGridSize= (16, 16)