Как определить края изображения с разным контрастом и цветом фона, используя Opencv? - PullRequest
0 голосов
/ 08 марта 2019

Я разрабатываю приложение для Android, чтобы обнаружить все контуры изображения и нарисовать их с помощью Opencv.

Я тестировал одно и то же изображение, и все работало нормально.

Но как толькоЯ изменил то же изображение, но с другой контрастностью, обнаружение не удалось.

Также я изменил другое примерное изображение с более темным фоном, и оно снова не работает.

Вот код:

  Imgproc.cvtColor(mRGBA, mGray, Imgproc.COLOR_RGB2HSV);

    Core.split(mGray, channels);

    mGray = channels.get(1);

    Imgproc.threshold(mGray, mGray, 50, 255, Imgproc.THRESH_BINARY);

    Core.meanStdDev(mGray, mu, stddev);

    Imgproc.GaussianBlur(mGray, mGray, new Size(5, 5), 5);

    //Imgproc.Canny(mGray, mGray, 20, 80, 3, false);

    Imgproc.Canny(mGray, mGray, mu.get(0, 0)[0], stddev.get(0, 0)[0], 3, false);

    Mat kernell = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(9,9));

    Imgproc.morphologyEx(mGray, mGray, Imgproc.MORPH_CLOSE, kernell);

    Imgproc.dilate(mGray, mGray, Imgproc.getStructuringElement(Imgproc.MORPH_CROSS, new Size(3, 3)));

Вот первый пример изображения

enter image description here

Результат обработки

enter image description here

Вот второй пример изображения

enter image description here

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

enter image description here

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

Есть ли способ применить Canny универсальным способом?

1 Ответ

0 голосов
/ 08 марта 2019

Мне удалось получить лучшие результаты для всех типов изображений, используя метод CLAHE из Opencv для повышения контрастности изображения с пределом клипа 1.

Конечно, переменная ограничения клипа зависит от приложения, и 1 работал почти идеально для меня.

И я убрал порог изображения.

Вот что я добавил перед применением GaussianBlur :

    CLAHE clahe = Imgproc.createCLAHE();

    clahe.setClipLimit(1);

    clahe.apply(mGray, mGray);
...