在植物显微镜图像中找到气孔

信息处理 图像处理 计算机视觉
2022-01-09 22:54:29

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

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

我正在使用 OpenCV。我的计划是审查可能对气孔识别有用的特征。

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

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

我错过了什么?你会如何解决这个问题?类似对象检测问题的解决方案将非常有帮助。

示例图像在这里

气孔

带通滤波器后: 带通滤波

Canny 边缘检测并不乐观。某些图像区域失焦: 精明的边缘检测

4个回答

抱歉,我不知道 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)

霍夫变换可以用来检测像这样由“边缘像素”组成的脊椭圆,尽管它在计算和内存方面确实很昂贵,而且它们不是完美的椭圆,所以它必须是一个有点“草率”的检测器我从来没有做过,但是有很多关于“霍夫椭圆检测”的谷歌结果。我会说,如果您在一定大小的搜索空间内检测到另一个椭圆内的一个椭圆,则应将其视为造口。

另见:

我要尝试的第一件事是模板匹配,模板以一些步骤旋转所有角度。旋转模板在这里必不可少。模板的选择也可能很重要 - 可以是几个具有不同照明的模板,并且可以模糊以允许形状不同。

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 个自由参数。

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

在此处输入图像描述

我将首先使用一个敏感的边缘检测器(例如,具有低阈值的梯度幅度),然后使用霍夫变换来尝试找到椭圆。Canny 可能仍然有效。我确信您可以调整一些参数以使其更敏感并拾取模糊的边缘。