如何用像素检测每30个单元格的坐标? (不使用 opencv,最好不使用任何库)

How to detect the coordinates of each 30 cells with pixels? (without using opencv, ideally without using any library)

我有 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()

此代码returns:

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

显然,19031 太大了。我只要30个

这是图片[1]:https://i.stack.imgur.com/VhX5o.jpg

您要找的是 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() 来检测斑点。

Blobs detected are overlayed onto original image 如果有人可以推荐我如何上传两张图片作为此 post 的一部分,那就太好了!