python粒子特效照相机_用python中的图像处理计算粒子

有没有在背景强度变化的情况下检测粒子的好算法?

例如,如果我有以下图像:

python粒子特效照相机_用python中的图像处理计算粒子_第1张图片

有没有办法计算小的白色粒子,即使在左下角出现的背景明显不同的情况下?

为了更清楚一点,我想标记图像并使用一种算法计算粒子数,该算法发现这些粒子很重要:

我用PIL、cv、scipy、numpy等模块做了很多尝试。

我从this very similar SO question那里得到了一些提示,乍一看,您可以采用这样一个简单的阈值:im = mahotas.imread('particles.jpg')

T = mahotas.thresholding.otsu(im)

labeled, nr_objects = ndimage.label(im>T)

print nr_objects

pylab.imshow(labeled)

但由于背景的变化,你会发现:

import numpy as np

import scipy

import pylab

import pymorph

import mahotas

from scipy import ndimage

import cv

def detect_peaks(image):

"""

Takes an image and detect the peaks usingthe local maximum filter.

Returns a boolean mask of the peaks (i.e. 1 when

the pixel's value is the neighborhood maximum, 0 otherwise)

"""

# define an 8-connected neighborhood

neighborhood = ndimage.morphology.generate_binary_structure(2,2)

#apply the local maximum filter; all pixel of maximal value

#in their neighborhood are set to 1

local_max = ndimage.filters.maximum_filter(image, footprint=neighborhood)==image

#local_max is a mask that contains the peaks we are

#looking for, but also the background.

#In order to isolate the peaks we must remove the background from the mask.

#we create the mask of the background

background = (image==0)

#a little technicality: we must erode the background in order to

#successfully subtract it form local_max, otherwise a line will

#appear along the background border (artifact of the local maximum filter)

eroded_background = ndimage.morphology.binary_erosion(background, structure=neighborhood, border_value=1)

#we obtain the final mask, containing only peaks,

#by removing the background from the local_max mask

detected_peaks = local_max - eroded_background

return detected_peaks

im = mahotas.imread('particles.jpg')

imf = ndimage.gaussian_filter(im, 3)

#rmax = pymorph.regmax(imf)

detected_peaks = detect_peaks(imf)

pylab.imshow(pymorph.overlay(im, detected_peaks))

pylab.show()

但这也不会带来好运,显示出这样的结果:

使用区域最大值函数,我得到的图像几乎可以给出正确的粒子识别,但根据高斯滤波,错误位置的粒子太多或太少(图像的高斯滤波为2、3和4):

python粒子特效照相机_用python中的图像处理计算粒子_第2张图片

python粒子特效照相机_用python中的图像处理计算粒子_第3张图片

此外,它还需要处理类似的图像:

python粒子特效照相机_用python中的图像处理计算粒子_第4张图片

这与上面的图像类型相同,只是粒子密度要高得多。

编辑:已解决的解决方案:使用以下代码,我能够获得解决此问题的体面工作解决方案:import cv2

import pylab

from scipy import ndimage

im = cv2.imread('particles.jpg')

pylab.figure(0)

pylab.imshow(im)

gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

gray = cv2.GaussianBlur(gray, (5,5), 0)

maxValue = 255

adaptiveMethod = cv2.ADAPTIVE_THRESH_GAUSSIAN_C#cv2.ADAPTIVE_THRESH_MEAN_C #cv2.ADAPTIVE_THRESH_GAUSSIAN_C

thresholdType = cv2.THRESH_BINARY#cv2.THRESH_BINARY #cv2.THRESH_BINARY_INV

blockSize = 5 #odd number like 3,5,7,9,11

C = -3 # constant to be subtracted

im_thresholded = cv2.adaptiveThreshold(gray, maxValue, adaptiveMethod, thresholdType, blockSize, C)

labelarray, particle_count = ndimage.measurements.label(im_thresholded)

print particle_count

pylab.figure(1)

pylab.imshow(im_thresholded)

pylab.show()

这将显示如下图像:

python粒子特效照相机_用python中的图像处理计算粒子_第5张图片

(这是给定的图像)

以及

(这是被计数的粒子)

计算粒子数为60。

你可能感兴趣的:(python粒子特效照相机)