Finding number of colored shapes from picture using Python
我的问题与识别图片中的颜色有关。在做微生物学时,我需要计算用显微镜照相机拍摄的照片上的细胞核数量。我用GIMP把核标记成红色的点。现在我需要用python编写一个脚本,给出一个图像,它会告诉我有多少红点。图中除了点外没有红色。
我想到了一个相当复杂的解决方案,它可能不是最好的解决方案:拍一张照片,开始迭代检查每个像素的颜色。如果这是红色的,检查所有8个最近的像素,递归地再次检查每个红色的邻居,直到找不到其他相邻的红色像素。然后将原子核计数增加一个,并标记遍历的像素,这样它们就不会再被迭代。然后从停止的地方继续迭代。看起来有点重,所以我想我会问,也许有人已经更优雅地处理了类似的问题。
当做,砂光机
计数核
代码改编自Python图像教程。从教程中输入带有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。萃取表面
- 实际上,我认为你的想法很好,如果考虑一下,它是可以并行的;
- 在opencv(cvblobslib)中使用blob检测。
小精灵
评论:它不会是最快的,也不会总是准确的。但做起来会很有趣——因为简历总是很有趣的——并且准备好了10行代码。只是一个松散的想法。
关于更多生产就绪建议:
小精灵
但是最优雅的解决方案是计算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来读取图像。
编辑:根据注释,
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')) |
号