python count水晶(总数和颜色)

时间:2015-04-20 01:46:40

标签: python image-processing

我有显微镜的图片,我正在尝试计算水晶的总数以及具有特定颜色(红色,蓝色或黄色)的水晶总数。原则上看起来可以通过查看图片来实现,但考虑到我必须超过200,我相信脚本会更有效。

我的第一种方法是遵循一个非常相似的问题的建议(Finding number of colored shapes from picture using Python)然而,我的问题是水晶颜色和背景颜色(酒精溶液)几乎相同(透明),并且因此到目前为止,无法获得任何成功的结果。

我还检查了" skimage"模块(http://scikit-image.org/)但我遇到了与水晶/背景相同的问题。

使用以下代码,我可以得到一些开始有意义的东西,但它仍然远离我的目标:

import scipy
from scipy import ndimage

sand = scipy.misc.imread(img) # gray-scale image
sandf = ndimage.gaussian_filter(sand, 16)
T = 160 # set threshold by hand to avoid installing `mahotas`

# find connected components
#labeled, nr_objects = ndimage.label(sandf> T) #black-white
labeled, nr_objects = ndimage.label(sandf[:,:,0] > T) #colour
print ("Number of objects is %d " % nr_objects)


import matplotlib.pyplot as plt
plt.imshow(labeled)
plt.show()

如果有人能帮助我,我将非常感激。我甚至尝试修改我拍摄照片的方式,但没有。同样,我有两个目标:计算粒子总数,然后计算那些具有色调(红色,蓝色或黄色)的粒子

请在下面找到一张典型图片:

Cell Image

3 个答案:

答案 0 :(得分:0)

这不是一个理想的解决方案,但它为计数提供了合理的答案。

import scipy, pylab, mahotas as mh
from scipy import ndimage

sand = scipy.misc.imread(img)
dnaf = ndimage.gaussian_filter(sand, 4)
T = mh.thresholding.otsu(dnaf)
labeled, nr_objects = ndimage.label(sand > T)
for i in range(20):
    dnaf = ndimage.gaussian_filter(dnaf, 1)
    T = mh.thresholding.otsu(dnaf)
    labeled, nr_objects = ndimage.label(sand < T)

labeled, nr_objects = ndimage.label(sand > T)
pylab.imshow(labeled)
pylab.show()
print(nr_objects)

这是一个有趣的问题。我会尝试找一些时间来解决它并给你一些其他的选择。

答案 1 :(得分:0)

由于粒子会反射很多光线,如果将粒子放在深色背景上,处理图像会不会更容易?然后,应该更容易将粒子与背景分开。

答案 2 :(得分:0)

透明物品总是很难。我的方法是:

  • 首先删除背景/将其涂成黑色(因为它是仙女均匀着色),这应该是可行的。
  • 检测并增强边缘
  • 将边缘着色为黑色

现在你应该能够计算组件