查找图像中的对称区域/图案


14

我有一组图像代表人的后表面的平均曲率。

我要做的是“扫描”图像中在图像的其他部分具有相似,反射“对应”的点(最有可能与中线对称,但不一定存在畸变)。一些图像拼接技术使用此功能来“自动检测”图像之间的相似点,但是我想针对同一图像的两面进行检测。

最终目标是找到一条连续的,最可能是弯曲的纵向线,以适应性地将背部分成对称的“两半”。

示例图像放在下面。请注意,并非所有区域都是对称的(特别是在图像中心上方,红色的垂直“条”向右偏移)。该区域应获得较差的分数,或类似的分数,但随后将从更远的对称点定义局部对称性。无论如何,我都必须使任何算法适应我的应用程序领域,但是我所追求的是som相关/卷积/模式匹配策略,我认为必须已经有了一些东西。

(编辑:下面有更多图片,还有更多说明)

在此处输入图片说明

编辑:根据要求,我将包括更典型的图像,无论它们行为正常还是有问题。但是它们不是彩色图像,而是灰度图像,因此颜色直接与数据大小有关,而彩色图像却没有发生这种情况(仅用于通信)。尽管与彩色图像相比,灰色图像似乎缺乏对比度,但数据梯度仍然存在,并且可以根据需要提供一些自适应对比度。


1)一个非常对称的物体的图像:

在此处输入图片说明


2)同一主题在不同时刻的图像。尽管有更多的“功能”(更多的渐变),但它并不像以前那样“对称”:

在此处输入图片说明


3)较瘦的年轻受试者,在中线具有凸度(红色的凸起,用较浅的区域表示),而不是更常见的凹形中线:

在此处输入图片说明


4)X射线证实有脊椎偏斜的年轻人(注意不对称):

在此处输入图片说明


5)典型的“倾斜”主题(尽管在弯曲的中线周围大多是对称的,因此不能正确地“变形”):

在此处输入图片说明


任何帮助都非常欢迎!


为什么不仅仅使用书脊作为分隔线呢?
Jim Clay

@JimClay:我怀疑是相对于其余图像的实际对称轴而言,正在测量的部分是脊柱
endolith 2012年

“某些图像拼接技术使用它来“自动检测”图像之间的相似点”制作图像的翻转副本,然后使用其中之一。:)
endlith 2012年

您不能简单地沿Y轴镜像图像并使用配准算法吗?因为已经有很多关于灵活/非参数注册算法的研究可以作为基础。
Niki Estner 2012年

JimClay,脊椎是我想找到的东西,我不知道它在哪里;Endolith,我的问题涉及到人们告诉我其中一些算法的名称,但我还没有找到。而Nikie,这就是重点,但是我不知道任何一种算法,这就是为什么我首先要问这个问题的原因:o)
heltonbiker 2012年

Answers:


9

就像我在评论中说的那样,医学图像配准是一个话题,有很多研究可用,我不是专家。根据我的阅读,常用的基本思想是定义两个图像(在您的情况下为图像及其镜像)之间的映射,然后定义能量项以实现平滑度和图像相似性(如果应用了映射),最后使用标准(或有时是特定于应用程序的)优化技术来优化此映射。

我用Mathematica破解了一个快速算法来演示这一点。这是不是您应该在医疗应用中使用的算法,只是基本概念的演示。

首先,我加载您的图像,对其进行镜像,然后将这些图像分成小块:

src = ColorConvert[Import["http://i.stack.imgur.com/jf709.jpg"], 
   "Grayscale"];
mirror = ImageReflect[src, Left -> Right];
blockSize = 30;
partsS = ImagePartition[src, {blockSize, blockSize}];
partsM = ImagePartition[mirror, {blockSize, blockSize}];
GraphicsGrid[partsS]

Mathematica图形

通常,我们会进行近似的刚性配准(例如使用关键点或图像矩),但是您的图像几乎居中,因此我将跳过此过程。

如果我们看一个块,它是对应的镜像:

{partsS[[6, 10]], partsM[[6, 10]]}

Mathematica图形

我们可以看到它们是相似的,但是发生了变化。我们正在努力寻找转变的数量和方向。

为了量化匹配相似度,我可以使用平方的欧几里德距离:

ListPlot3D[
  ImageData[
   ImageCorrelate[partsM[[6, 10]], partsS[[6, 10]], 
    SquaredEuclideanDistance]]]

Mathematica图形

可悲的是,直接使用此数据进行优化比我想的要难,所以我改用了二阶近似:

fitTerms = {1, x, x^2, y, y^2, x*y};

fit = Fit[
   Flatten[MapIndexed[{#2[[1]] - blockSize/2, #2[[2]] - 
        blockSize/2, #1} &, 
     ImageData[
      ImageCorrelate[partsM[[6, 10]], partsS[[6, 10]], 
       SquaredEuclideanDistance]], {2}], 1], fitTerms, {x, y}];

Plot3D[fit, {x, -25, 25}, {y, -25, 25}]

Mathematica图形

该函数与实际的相关函数不同,但是第一步足够接近。让我们为每对块计算一下:

distancesFit = MapThread[
   Function[{part, template},
    Fit[Flatten[
      MapIndexed[{#2[[2]] - blockSize/2, #2[[1]] - blockSize/2, #1} &,
        ImageData[
        ImageCorrelate[part, template, 
         SquaredEuclideanDistance]], {2}], 1], 
     fitTerms, {x, y}]], {partsM, partsS}, 2];

这为我们提供了优化的第一个能量项:

variablesX = Array[dx, Dimensions[partsS]];
variablesY = Array[dy, Dimensions[partsS]];

matchEnergyFit = 
  Total[MapThread[#1 /. {x -> #2, y -> #3} &, {distancesFit, 
     variablesX, variablesY}, 2], 3];

variablesX/Y包含每个块的偏移量,并在应用偏移量的情况下matchEnergyFit近似原始图像和镜像图像之间的平方欧几里德差。

仅优化此能量将产生较差的结果(如果完全收敛)。我们还希望偏移量是平滑的,在块相似度中,偏移量没有任何意义(例如,沿着直线或在白色背景中)。

因此,我们为光滑度设置了第二个能量项:

smoothnessEnergy = Total[Flatten[
    {
     Table[
      variablesX[[i, j - 1]] - 2 variablesX[[i, j]] + 
       variablesX[[i, j + 1]], {i, 1, Length[partsS]}, {j, 2, 
       Length[partsS[[1]]] - 1}],
     Table[
      variablesX[[i - 1, j]] - 2 variablesX[[i, j]] + 
       variablesX[[i + 1, j]], {i, 2, Length[partsS] - 1}, {j, 1, 
       Length[partsS[[1]]]}],
     Table[
      variablesY[[i, j - 1]] - 2 variablesY[[i, j]] + 
       variablesY[[i, j + 1]], {i, 1, Length[partsS]}, {j, 2, 
       Length[partsS[[1]]] - 1}],
     Table[
      variablesY[[i - 1, j]] - 2 variablesY[[i, j]] + 
       variablesY[[i + 1, j]], {i, 2, Length[partsS] - 1}, {j, 1, 
       Length[partsS[[1]]]}]
     }^2]];

幸运的是,Mathematica内置了约束优化:

allVariables = Flatten[{variablesX, variablesY}];
constraints = -blockSize/3. < # < blockSize/3. & /@ allVariables;
initialValues = {#, 0} & /@ allVariables;
solution = 
  FindMinimum[{matchEnergyFit + 0.1 smoothnessEnergy, constraints}, 
   initialValues];

让我们看一下结果:

grid = Table[{(j - 0.5)*blockSize - dx[i, j], (i - 0.5)*blockSize - 
      dy[i, j]}, {i, Length[partsS]}, {j, Length[partsS[[1]]]}] /. 
   solution[[2]];
Show[src, Graphics[
  {Red,
   Line /@ grid,
   Line /@ Transpose[grid]
   }]]

Mathematica图形

0.1之前的因素smoothnessEnergy是平滑能量相对于图像匹配能量项的相对权重。这些是不同权重的结果:

Mathematica图形

可能的改进:

  • 就像我说的,先执行严格的注册。在白色背景下,基于简单图像瞬间的配准应该可以正常工作。
  • 这只是一步。您可以使用在第一步中找到的偏移量,然后在第二步中对其进行改进,也许使用较小的搜索窗口或较小的块大小
  • 我读过一些文章,他们完全没有障碍,但是优化了每个像素的偏移量。
  • 尝试不同的平滑功能

回答时间太长,以至于只是为了娱乐而阅读,但是最终的图像很有指示性:它看起来很棒:D
penelope

这个答案很有启发性。我需要花些时间来吞下它,但很可能我需要使用非刚性注册技术。幸运的是,您提供了一些概念上的细节,因此在最坏的情况下,我可以找出一些类似的方法。同时,我将使用更多图片更新问题。现在谢谢!
heltonbiker

4

有趣的问题。首先,也许您正在追求基于兴趣关键点检测器和匹配的方法。这将包括SIFT(尺度不变特征变换),SURF,ORB等……甚至是仅基于Harris算子的更简单方法(csce.uark.edu/~jgauch/library/Features/Harris.1988.pdf )。从您的帖子中还不清楚您尝试过什么,因此,如果我在这里太幼稚,对不起。

话虽如此,让我采用一种简单的数学形态学(MM)方法只是为了好玩:)最后,用于可视化所有步骤的图像。

我拍摄了您的样本图像,并使用ImageMagick 将其转换为L a b *颜色空间,并且仅使用了L *波段:

convert x.jpg -colorspace Lab -separate %d.png

0.png对应于L *波段。现在,我确定您具有实际的图像数据,但是我正在处理jpg压缩伪像,而没有其他内容。为了部分处理此问题,我先进行了形态学打开,然后使用半径为5的平盘进行了形态学封闭,这是减少MM噪声的一种基本方法,并且鉴于磁盘半径不会改变太多图像。接下来,我的想法是基于这个单一图像,它很可能在其他情况下失败。在视觉上,您感兴趣的区域会变暗(在彩色图像中“较热”),因此我认为基于统计的二值化器可以表现良好。我使用了Otsu的方法,这是一种自动方法。

此时,可以清楚地看到感兴趣的中心区域。问题在于,在我的方法中,我希望它成为一个封闭组件,但事实并非如此。我首先丢弃所有小于最大组件的连接组件(不将背景作为其中之一)。如果二值化结果很好,则在其他情况下有更大的机会工作。在您的示例图像中,只有一个组件连接到背景,因此它不会被丢弃,但不会引起问题。

如果您仍在关注我,我们尚未找到实际假定的关注中心区域。这是我的看法。无论人的弯曲程度如何(实际上我可以看到某些有问题的情况),该区域都类似于一条垂直线。为此,我通过使用长度为100的垂直线执行形态学开口来简化当前图像。该长度完全是任意的,如果您没有缩放问题,那么这并不是一个很难确定的值。现在我们再次丢弃组件,但是在此步骤中我要更加小心。我使用图像补全的按区域开口来丢弃我认为很小的区域,这可以通过执行粒度分析(也来自MM)形式的某种方式以更可控的方式完成。

现在,我们大致分为三部分:图像的左侧部分,中央部分和图像的右侧部分。预期中心部分将是这三个部分的较小部分,因此可以轻松获得。

这是最终结果,右下方的图像只是其与原始图像左侧的叠加图像。各个数字并不一致,对不起。

http://i.imgur.com/XRhYv.png


非常感谢您的关心,但是您的方法应该考虑我的数据的某些属性(不是抱怨,而只是一个细节):1)实际数据是2D浮点数组,颜色映射为发散的红黄色- Python的matplotlib中的绿色配色图。我认为使用颜色数据在概念上并不正确,显示图像仅出于交流目的;2)实际数据与表面曲率有关(凸与凹),红色部分为凹面,绿色部分为凸面。对称轴不一定落在凹形区域中。
heltonbiker

我很快将添加更多图像(并替换为灰度图像),以便可以将图像本身用于测试,消除了由于色彩而导致动态范围失真的危险。
heltonbiker

不幸的是,该数据尚不可用。灰度图像充其量只是其近似值。
mmgp 2012年

我相信这种近似值很可能就足够了,但是我不介意提供实际数据。我可以发布一些公共的DropBox下载链接,只是不知道哪种文件格式。
heltonbiker
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.