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

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

我正在使用OpenCV。我的计划是审查对气孔识别有用的潜在功能。 br /> LBP(局部二进制模式)


HOG(定向梯度直方图)
稳健特征检测器(我对此表示怀疑) />哈里斯角
SIFT,SURF,STAR等描述符。我暂时没有选择分类器。

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

这里的图像示例。 br />
Canny边缘检测前景不佳。一些图像区域不清晰:


评论

也许您可以尝试删除模糊的线条,而不是尝试查找气孔?

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

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

#1 楼

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

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



转换成山脊(暗的亮线),例如: >

它执行微分,换句话说。

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



,那么从一侧照亮时的亮度功能将如下所示:



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

我不确定如何自动找到照明方向。如果所有图片都一样,那就太好了。否则,您将必须找到最大的对比线并假定光线垂直于它或其他东西。以我的示例为例,我手动将图像旋转到我认为正确的方向,并且光线从左侧射出:但是,您还需要消除图像中所有的低频变化,以仅突出显示快速变化的线状特征。为避免产生伪影,我使用了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)


Hough变换可用于检测由“边缘像素”制成的这种脊形椭圆,尽管它在计算和存储上确实很昂贵,而且它们并不是完美的椭圆,将不得不有点“草率”的探测器。我从来没有做过,但是Google有很多“椭圆检测”结果。我想说的是,如果您在一个特定大小的搜索空间内在另一个椭圆内检测到一个椭圆,则应将其视为气孔。 > OpenCV:如何在二进制图像中检测椭圆
Python和OpenCV。如何检测图像中所有(实心)圆形/圆形物体?
检测图像上的硬币(和椭圆形)


评论


$ \ begingroup $
附言我在这里做的名字有没有?它是常见的过滤器类型吗?
$ \ endgroup $
– Endolith
2012年4月16日21:25

$ \ begingroup $
+1-好答案!关于光源角度的自动化-您可以使用边缘检测器来计算幅度和梯度,然后计算梯度的加权平均值(按数量)。最强的响应应该在照明方向上。
$ \ endgroup $
– Andrey Rubshtein
2012年10月5日18:33

#2 楼

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

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

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

#3 楼

部分答案。使用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]




评论


$ \ begingroup $
有趣的结果...也许可以与其他方案结合使用...
$ \ endgroup $
– Matt M.
2011年11月22日下午4:11

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



#4 楼

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