У меня есть изображение, которое я хочу обработать.Я использую Opencv и Skimage.Моя цель - найти распределение красных точек вокруг барицентра всех точек.Я действую следующим образом: сначала я выбираю цвет, а затем бинаризирую полученное изображение.В конце концов, я бы просто посчитал красный пиксель, который находится на кольцах с определенной шириной вокруг этого барицентра, чтобы получить среднее распределение по радиусу, предполагая цилиндрическую симметрию.
Моя проблема в том, что я понятия не имею, как найти положение барицентра.
Я также хотел бы знать, есть ли короткий способ подсчета красных пикселей в кольцах.
Вот мой код:
import cv2
import matplotlib.pyplot as plt
from skimage import io, filters, measure, color, external
Я загружаю изображение:
sph = cv2.imread('image_sper.jpg')
sph = cv2.cvtColor(sph, cv2.COLOR_BGR2RGB)
plt.imshow(sph)
plt.show()
Я хочу выбрать красный цвет.После https://realpython.com/python-opencv-color-spaces/, я конвертирую его в HSV и использую маску.
hsv_sph = cv2.cvtColor(sph, cv2.COLOR_RGB2HSV)
light_red = (1, 100, 100)
dark_red = (18, 255, 255)
mask = cv2.inRange(hsv_sph, light_red, dark_red)
result = cv2.bitwise_and(sph, sph, mask=mask)
И вот результат:
plt.imshow(result)
plt.show()
Теперь я бинаризирую изображение, так как потом будет легче его обрабатывать.
red_image = result[:,:,1]
red_th = filters.threshold_otsu(red_image)
red_mask = red_image > red_th;
red_mask.dtype ;
io.imshow(red_mask);
И вот мы:
То, что я хотел бы помочь, теперь найти барицентр белых пикселей.
Thx
Редактировать: Бинаризация дает изображениям логические значения False / True для пикселей.Я не знаю, как преобразовать их в 0/1 пикселей.Если False был 0 и True 1, код для поиска барицентра был бы:
np.shape(red_mask)
(* (321L, 316L) *)
bari=0
barj=0
N=0
for i in range(321):
for j in range(316):
bari=bari+red_mask[i,j]*i
barj=barj+red_mask[i,j]*j
N=N+red_mask[i,j]
bari=bari/N
barj=barj/N