вычислить центроид с помощью opencv - PullRequest
0 голосов
/ 11 декабря 2018

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

im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
     # calculate moments for each contour
     M = cv2.moments(c)

     # calculate x,y coordinate of center
     if M["m00"] != 0:
         cX = int(M["m10"] / M["m00"])
         cY = int(M["m01"] / M["m00"])
      else:
         cX, cY = 0, 0

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

Дело в том, что мне нужно найти взвешенный центроид изображения RGB / оттенков серого (который учитывает интенсивность пикселей), а не двоичное изображение.Как я могу это сделать?

Спасибо!

1 Ответ

0 голосов
/ 11 декабря 2018

Вот своего рода решение псевдокода Python для вашего вопроса.Код предназначен для расчета взвешенного центра центроида.Уровень интенсивности изображения используется как вес в расчете.Следовательно, чем выше интенсивность, тем выше вес.

Чтобы упростить процесс расчета, нам нужно иметь сетку из координат х и координат у размера исходного изображения.Средневзвешенная координата x и y даст вам взвешенные центроиды

import numpy as np
import cv2

# create a meshgrid for coordinate calculation
r,c = np.shape(ori_img)
r_ = np.linspace(0,r,r+1)
c_ = np.linspace(0,c,c+1)
x_m, y_m = np.meshgrid(c_, r_, sparse=False, indexing='ij')


im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)


for c in contours:
     # Get the boundingbox
     x,y,w,h = cv2.boundingRect(c)

     # calculate x,y coordinate of center
     # Get the corresponding roi for calculation
     weights = ori_img[y:y+h,x:x+w]
     roi_grid_x = x_m[y:y+h,x:x+w]
     roi_grid_y = y_m[y:y+h,x:x+w]

     # get the weighted sum
     weighted_x = weights * roi_grid_x
     weighted_y = weights * roi_grid_y

     cx = np.sum(weighted_x) / np.sum(weights)
     cy = np.sum(roi_grid_y) / np.sum(weights)  
...