Пороговое изображение с яркими зонами

Я разрабатываю приложение для iOS с openCV, которое делает снимок с монитора и извлекает кривую, но когда изображение имеет несколько ярких зон после порога, я получаю не полную кривую, а некоторые черные зоны

Исходное изображение

обработанное изображение после установки порога

        original = [MAOpenCV cvMatGrayFromUIImage:_sourceImage];   
        cv::threshold(original, original, 70, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

        findContours(original, contours, hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

        cv::Mat skel(original.size(), CV_8UC1, cv::Scalar(0));

        int idx = 0;
        for(; idx >= 0; idx = hierarchy[idx][0])
        {
            if (contours[idx].size()>250 && idx>-1){
                cv::Scalar color( 255,255,255);
                drawContours(skel, contours, idx, color, CV_FILLED, 8, hierarchy);
            }
        }
        cv::threshold(skel, skel, 100, 255, CV_THRESH_BINARY_INV);
        cv::erode(skel,skel,cv::Mat(),cv::Point(-1,-1),2);

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

2 ответа

Решение

Если у вас фон с неравномерным освещением, вы можете сначала применить белый цилиндр (или здесь для MatLab, и здесь для OpenCV).

Вот результат, который я получил, используя структурирующий элемент типа disk с радиусом 3.

Тогда, какой бы метод порога вы ни выбрали, сработает.

Не будет ли достаточно использовать пороговое значение Оцу? Результат порога Оцу

Фрагмент кода:

import cv2

image = cv2.imread('d:/so.jpg', cv2.IMREAD_GRAYSCALE)

threshold, thresholded = cv2.threshold(image, 0, 255, type=cv2.THRESH_BINARY + cv2.THRESH_OTSU)
print(threshold)

cv2.imshow('so', image);
cv2.imshow('thresholded', thresholded)
cv2.waitKey(0)
Другие вопросы по тегам