Залейте контуры черным цветом с помощью openCv

Я пытаюсь получить всю темную букву «D» из этого изображения:

введите здесь описание изображения

С этим кодом я получаю такой результат:

```

        Cv2.Threshold(im_gray, threshImage, 80, 255, ThresholdTypes.BinaryInv); // Threshold to find contour

        Cv2.FindContours(
            threshImage,
            out contours,
            out hierarchyIndexes,
            mode: RetrievalModes.Tree,
            method: ContourApproximationModes.ApproxSimple
        );

        double largest_area = 0;
        int largest_contour_index = 0;
        Rect rect = new Rect();
        //Search biggest contour
        for (int i = 0; i <contours.Length; i++)
        {
            double area = Cv2.ContourArea(contours[i]);  //  Find the area of contour

            if (area > largest_area)
            {
                largest_area = area;
                largest_contour_index = i;               //Store the index of largest contour
                rect = Cv2.BoundingRect(contours[i]); // Find the bounding rectangle for biggest contour
            }
        }

        Cv2.DrawContours(finalImage, contours, largest_contour_index, new Scalar(0, 0, 0), -1, LineTypes.Link8, hierarchyIndexes, int.MaxValue);

```

Но когда я сохраняю finalImage, я получаю следующий результат: введите описание изображения здесь Как я могу получить всю черную букву?


person Portekoi    schedule 21.02.2017    source источник
comment
попробуйте некоторые методы улучшения: выравнивание гистограммы и так далее...   -  person Jeru Luke    schedule 21.02.2017


Ответы (1)


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

Для этого изображения я использовал среднее значение изображения, чтобы выбрать оптимальное пороговое значение.

Оптимальное значение выбирается путем выбора всех значений пикселей менее 33% от среднего значения.

med = np.mean(gray)
optimal = int(med * 1.33) #selection of the optimal threshold

ret,th = cv2.threshold(gray, optimal, 255, 0)

Вот что я получил в результате:

введите здесь описание изображения

Теперь инвертируйте это изображение и получите самый большой контур, и у вас получится большая буква D.

РЕДАКТИРОВАТЬ:

Для некоторых изображений с резкой гистограммой можно использовать медиану изображения в градациях серого вместо среднего.

person Jeru Luke    schedule 21.02.2017
comment
Знаете ли вы эквивалент numpy в C# (OpenCvSharp)? - person Portekoi; 21.02.2017
comment
Мне правда жаль. Я никогда не работал с С# в OpenCV. Моя игра - OpenCV с python. Если я столкнусь с какой-либо функцией, я дам вам знать. :D - person Jeru Luke; 21.02.2017
comment
Посетите это LINQ кажется опция - person Jeru Luke; 21.02.2017