Как определить координаты каждых 30 ячеек с пикселями? (без использования opencv, в идеале без использования какой-либо библиотеки) - PullRequest
0 голосов
/ 08 апреля 2019

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

Следующий код получает координатывсех голубых пикселей.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

control = mpimg.imread('jpeg.jpg')
ys = control.shape[0]
xs = control.shape[1]
blue = np.nonzero(control[:,:,2])


print(blue[0], len(blue[0]))
print(blue[1], len(blue[1]))

plt.imshow(control,cmap = plt.get_cmap('gray'),interpolation='none')
plt.show()

Этот код возвращает:

[  0   0   0 ... 447 447 447] 19031
[112 113 114 ... 381 382 383] 19031

Очевидно, 19031 слишком велик.Я хочу только 30.

Это изображение [1]: https://i.stack.imgur.com/VhX5o.jpg

1 Ответ

0 голосов
/ 08 апреля 2019

То, что вы ищете, это 30 капель, а не пикселей. Использовать Hough Circles приятно и просто.

import cv2
import numpy as np
import matplotlib.pyplot as plt

# load image
img = plt.imread('VhX5o.jpg')

# convert image to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# median blur
gray = cv2.medianBlur(gray, 5)

# Detect circles
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.2, 10,
          param1=200,
          param2=30,
          minRadius=0,
          maxRadius=0)

print(len(circles))  # 30
circles = np.uint16(np.around(circles))

# filtered image returns just the (blue) nucleus blobs
filt_img = np.zeros(img.shape)
for i in circles[0,:]:
    cv2.circle(filt_img,(i[0],i[1]),2,(0,0,255), 3)
    cv2.circle(img,(i[0],i[1]),2,(0,0,255), 3)

# plot filt_img
plt.figure()
plt.imshow(filt_img)

# plot with circles drawn over original image
plt.imshow(img)

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

Надеюсь, это поможет!

Для будущих случаев я бы также рекомендовал scipy.ndimage.measurements.label () для обнаружения больших двоичных объектов.

Обнаруженные BLOB-объекты накладываются на исходное изображение Если бы кто-нибудь мог порекомендовать мне, как загрузить оба изображения как часть этого поста, это было бы здорово!

...