关于图像处理:使用Python从图片中查找彩色形状的数量

Finding number of colored shapes from picture using Python

我的问题与识别图片中的颜色有关。在做微生物学时,我需要计算用显微镜照相机拍摄的照片上的细胞核数量。我用GIMP把核标记成红色的点。现在我需要用python编写一个脚本,给出一个图像,它会告诉我有多少红点。图中除了点外没有红色。

我想到了一个相当复杂的解决方案,它可能不是最好的解决方案:拍一张照片,开始迭代检查每个像素的颜色。如果这是红色的,检查所有8个最近的像素,递归地再次检查每个红色的邻居,直到找不到其他相邻的红色像素。然后将原子核计数增加一个,并标记遍历的像素,这样它们就不会再被迭代。然后从停止的地方继续迭代。看起来有点重,所以我想我会问,也许有人已经更优雅地处理了类似的问题。

当做,砂光机


计数核

代码改编自Python图像教程。从教程中输入带有Nuclei的图像:

nuclei

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
import scipy
from scipy import ndimage

# read image into numpy array
# $ wget http://pythonvision.org/media/files/images/dna.jpeg
dna = scipy.misc.imread('dna.jpeg') # gray-scale image


# smooth the image (to remove small objects); set the threshold
dnaf = ndimage.gaussian_filter(dna, 16)
T = 25 # set threshold by hand to avoid installing `mahotas` or
       # `scipy.stsci.image` dependencies that have threshold() functions

# find connected components
labeled, nr_objects = ndimage.label(dnaf > T) # `dna[:,:,0]>T` for red-dot case
print"Number of objects is %d" % nr_objects

# show labeled image
####scipy.misc.imsave('labeled_dna.png', labeled)
####scipy.misc.imshow(labeled) # black&white image
import matplotlib.pyplot as plt
plt.imsave('labeled_dna.png', labeled)
plt.imshow(labeled)

plt.show()

产量

1
Number of objects is 17

氧化镁


我会这样做:

  • 使用opencv(python绑定),
  • 只取RGB图像的R分量,
  • 二进制阈值R分量,因此只留下最红的像素,
  • 使用一些物体/特征检测来检测点,fe。萃取表面
  • 小精灵

    评论:它不会是最快的,也不会总是准确的。但做起来会很有趣——因为简历总是很有趣的——并且准备好了10行代码。只是一个松散的想法。

    关于更多生产就绪建议:

    • 实际上,我认为你的想法很好,如果考虑一下,它是可以并行的;
    • 在opencv(cvblobslib)中使用blob检测。
    • 小精灵

      但是最优雅的解决方案是计算gimp中的标记核,正如ocaso-protal上面提到的那样。准确、快速。其他的事情都容易出错,速度慢得多,所以我的想法很松散,比任何事情都有趣。


      一个简单的numpy/scipy解决方案是:

      1
      2
      3
      import numpy, scipy
      a = scipy.misc.imread("rgb.jpg") # Imports RGB to numpy array where a[0] is red, a[1] is blue, a[2] is green...
      num_red = numpy.sum((a[:,:,0] == 255) * (a[:,:,1] == 0) * (a[:,:,2] == 0)) # Counts the number of pure red pixels

      您也可以使用PIL来读取图像。

      编辑:根据注释,scipy.ndimage.measurements.label将是有用的,并且还返回一个值num_features,它给出了计数:

      1
      2
      3
      4
      5
      import numpy, scipy
      from scipy import ndimage
      a = scipy.misc.imread("rgb.jpg")
      b = ((a[:,:,0] == 255) * (a[:,:,1] == 0) * (a[:,:,2] == 0))*1
      labeled_array, num_features = scipy.ndimage.measurements.label(b.astype('Int8'))