Вычисление периметра контуров (OpenCV, Python)

#python #opencv #computer-vision

#python #opencv #компьютерное зрение

Вопрос:

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

После разделения цветового канала (CMYK) Я применил пороговое значение к изображению.

Здесь для цветового канала голубой.

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

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

Я уже нашел способ (с помощью кого-то здесь, в stackoverflow) вычислить среднее значение и std dev для размеров точек с помощью:

 def compute_mean_stddev(contours_of_images):
    for contours_of_image in contours_of_images:
        count = len(contours_of_image)

        sum_list = []
        for cntr in contours_of_image:
            area = cv2.contourArea(cntr) 
            sum_list.append(area) 
            
        average = np.mean(sum_list)
        standard_deviation = np.std(sum_list)    
 

Вместо этого теперь для области, есть ли способ получить периметр?

Комментарии:

1. Для чего вам нужны площадь и периметр? будете ли вы обучать нейронную сеть? или другой классификатор?

Ответ №1:

Хороший случай, согласно документации OpenCV, когда у вас будут контуры, вы сможете вычислить то, что хотите, используя cv.arcLength() метод.

Это также называется длиной дуги. Это можно выяснить с помощью функции cv.arcLength(). Второй аргумент указывает, является ли форма замкнутым контуром (если передано значение True) или просто кривой.

Пример из официальных документов:

     import numpy as np
    import cv2 as cv
    img = cv.imread('star.jpg',0)
    ret, thresh = cv.threshold(img,127,255,0)
    contours, hierarchy = cv.findContours(thresh, 1, 2)
    
    cnt = contours[0]
    area = cv.contourArea()  # Area of first contour
    perimeter = cv.arcLength(cnt, True)  # Perimeter of first contour 
 

Итак, в вашем случае вы должны обновить свой код следующим образом:

     def compute_mean_stddev(contours_of_images):
        for contours_of_image in contours_of_images:
            count = len(contours_of_image)

            sum_list = []
            for cntr in contours_of_image:
                area = cv2.contourArea(cntr)
                perimeter = cv.arcLength(cntr, True)  
            
            average = np.mean(sum_list)
            standard_deviation = np.std(sum_list) 
 

Надеюсь, это сработает!