在植物显微图像中查找气孔


26

这是图像处理专家的问题。

我正在研究一个困难的计算机视觉问题。任务是计算DIC显微镜图像中的气孔(如下所示)。这些图像可以抵抗大多数表面图像处理技术,例如形态学运算和边缘检测。它也不同于其他细胞计数任务。

我正在使用OpenCV。我的计划是复查潜在的有用的气孔特征。

  • 纹理分类器
    • DCT(离散余弦变换/频域分析)
    • LBP(本地二进制模式)
  • HOG(定向梯度直方图)
  • 强大的特征检测器(我对此表示怀疑)
    • 哈里斯角
    • SIFT,SURF,STAR等
  • Haar级联分类器/ Viola-Jones功能

并可能设计一个新颖的特征描述符。我暂时没有选择分类器。

我错过了什么?您将如何解决?解决类似物体检测问题的方法将非常有帮助。

示例图片在这里

气孔

带通滤波器后: 带通滤波

Canny边缘检测前景不佳。一些图像区域不清晰: 坎尼边缘检测


1
也许除了尝试查找气孔以外,您还可以尝试消除模糊的线条?
endolith

1
您必须处理多少张图像?它需要多快?它必须有多自动化?
endlith 2011年

1
它不必很快。我们正在处理1000张图像。它应该是自动的-将图像转储到目录中并进入。
Matt M.11年

Answers:


15

抱歉,我不了解OpenCV,这不是完整的答案,而是更多的预处理步骤:

首先,您不需要边缘检测器。边缘检测器转换过渡(如这种从暗到亮的方式):

    _____ / ‾‾‾‾‾

变成山脊(深色的亮线),像这样:

    ____ / _____

换句话说,它执行区分。

但是在您的图像中,有一束光从一个方向向下照射,这向我们展示了3D表面的浮雕。我们将其视为线条和边缘,因为我们习惯于以3D形式看到事物,但实际上并非如此,这就是边缘检测器无法工作的原因,并且模板匹配在旋转的图像上不容易工作(完美在0度旋转时,匹配实际上会完全抵消180度,因为明暗会相互对齐)。

如果从侧面看这些模糊线之一的高度看起来像这样:

    ____ / _____

那么从一侧照亮时的亮度函数将如下所示:

    ____∧v____

这就是您在图像中看到的。面对的表面变亮,尾部的表面变暗。因此,您不想与众不同。您需要沿照明方向积分图像,这将为您提供表面的原始高度图(大约)。这样一来,无论是通过霍夫变换还是模板匹配或其他方式,都可以更轻松地匹配事物。

我不确定如何自动找到照明方向。如果所有图片都一样,那就太好了。否则,您将必须找到最大的对比线并假定光线垂直于它或其他东西。对于我的示例,我将图像手动旋转到我认为是正确的方向,而光线来自左侧:

原始的,旋转的

但是,您还需要消除图像中所有的低频变化,以仅突出显示快速变化的线状特征。为了避免产生伪影,我使用了2D高斯模糊,然后从原始图像中减去了它:

高通滤波

积分(累计和)很容易失控,从而产生水平条纹。我用另一个高斯高通去除了这些,但是这次仅在水平方向上:

输出

现在,气孔一直是白色的椭圆形,而不是在某些地方是白色,在其他地方是黑色。

原版的:

在此处输入图片说明

集成:

在此处输入图片说明

from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d

filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)

# Remove DC offset
I = I - average(I)

close('all')
figure()
imshow(I)
gray()
show()
title('Original')

# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)

figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)

# Integrate
summed = cumsum(I, 1)

# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)

figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)

霍夫变换可以用来检测脊椭圆这样,由“边缘像素”,虽然它在计算和存储真的很贵,而且他们是不完美的椭圆所以它必须是一个有点“邋遢”探测器。我从来没有做过,但是Google有很多关于“ 霍夫椭圆检测 ”的结果。我想说的是,如果您在一个特定大小的搜索空间内在另一个椭圆内检测到一个椭圆,则应将其视为气孔。

另请参阅:


PS我在这里做的名字有没有?它是常见的过滤器类型吗?
endolith'4

1
+1-好答案!关于光源角度的自动化-您可以使用边缘检测器,该检测器可以计算幅度和梯度,然后计算梯度的加权平均值(按数量)。最强的响应应该在照明方向上。
安德烈·鲁布施泰因

11

我要尝试的第一件事是模板匹配,其中模板旋转了所有角度,并经过了一些步骤。旋转模板必不可少。模板的选择也可能是不平凡的-可以是几种具有不同光照的模板,并且可以模糊以允许形状上的差异。

http://en.wikipedia.org/wiki/Template_matching#Template-based_matching_and_convolution

接下来-HOG在这里看起来很有希望。另一种解决方案是使用诸如Moravec或Shi-Tomasi(具有非最大抑制)之类的强角检测器,并在同一条线上寻找2个角或3-4个角的组作为候选。找到候选人后,您可以应用主动轮廓进行验证(不确定是否真的有帮助,但这是可能的)

http://en.wikipedia.org/wiki/Corner_detector

http://en.wikipedia.org/wiki/Active_contour

还有一种可能性是对椭圆使用霍夫变换,可能不使用2个自由参数,而是使用3-4个自由参数。


7

部分答案。使用Mathematica寻找候选人:

p = ColorConvert[Import@"http://i.stack.imgur.com/38Ysw.jpg", 
    "GrayScale"] // ImageAdjust;
m = DeleteSmallComponents[Erosion[Dilation[DeleteSmallComponents[
      Binarize[EntropyFilter[p, 1] // ImageAdjust, .97], 10], 3], 5], 100];
ImageMultiply[Dilation[m, 3], p]

在此处输入图片说明


有趣的结果……也许可以与其他方案结合起来……
Matt

@MAtt是的,我认为至少要丢弃80%的非目标表面。稍微扩张一下面具后,您应该搜索椭圆形。无论使用哪种方法(我仍然在想我能做些什么),既然您知道野兽被包围了,那就容易得多。
belisarius博士2011年

1

我将首先使用敏感的边缘检测器(例如,具有较低阈值的梯度幅度),然后使用霍夫变换尝试查找椭圆。Canny可能仍然可以正常工作。我敢肯定,您可以调整一些参数以使其更灵敏并拾取模糊的边缘。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.