使用Python从图片中找出彩色graphics的数量
我的问题与识别图片颜色有关。 做微生物学我需要计数显微镜照相机拍摄的照片上的细胞核数量。 我用GIMP标记核红点的核。 现在我需要在python中创build一个脚本,给出一个图像,告诉我有多less红点。 图片中除了点之外没有红色。
我已经想到了一个相当复杂的解决scheme,可能不是最好的解决scheme:拍一张照片,开始通过像素检查每个人的颜色。 如果是红色,检查所有8个最近的像素,recursion地检查每个红色的邻居,直到没有更多的邻居红色像素被发现。 然后将核数加1,并标记遍历的像素,这样它们不会再次迭代。 然后从停止的地方继续迭代。 似乎有点沉重,所以我想我会问,也许有人已经更优雅地处理了类似的问题。
问候,桑德
数核
该代码从Python Image Tutorial改编而来。 从教程input图像与核:
#!/usr/bin/env python import scipy from scipy import ndimage # read image into numpy array # $ wget http://pythonvision.org/media/fileshttp://img.dovov.comdna.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()
产量
Number of objects is 17
我会这样做:
- 使用OpenCV ( python绑定 ),
- 只取RGB图像的R分量,
- 二进制阈值的R分量,使它只剩下最红的像素,
- 使用一些对象/特征检测来检测点,fe。 ExtractSURF
评论:它不会是最快的,它不会总是准确的。 但是这将会很有趣,因为CV总是很有趣,并且准备好了10行代码。 只是一个松散的想法。
至于更多生产就绪的build议:
- 其实我觉得你的想法是非常好的,如果有一些思考的话可以并行化;
- 在OpenCV( cvBlobsLib )中使用blob检测。
但最优雅的解决scheme只是计算GIMP中的标记核,正如Ocaso Protal在上面提出的那样。 准确和最快。 其他的一切都容易出错,而且要慢得多,因此我的想法是松散的,比任何事情都更有趣。
一个简单的Numpy / Scipy解决scheme将是这样的:
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
给你的计数:
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'))