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

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

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

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

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



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


1)非常对称的图像主题:




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




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




4)由X射线证实患有脊柱侧弯的年轻人(注意不对称):




5)典型的“倾斜”受试者(尽管主要围绕弯曲的中线对称,因此不能正确“变形”):




任何帮助都非常欢迎!

评论

为什么不只将脊柱用作分隔线?

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

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

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

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

#1 楼

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

我在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]




通常,我们会进行近似的刚性配准(例如使用关键点或图像矩),但是您的图像几乎居中,所以我

如果我们看一个块,它是镜像副本:

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




我们可以看到它们是相似的,但是发生了变化。我们试图找出偏移量和方向。

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

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




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

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}]




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

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]
   }]]




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



可能的改进:


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


评论


$ \ begingroup $
回答时间太长,以至于只是为了好玩而没有阅读,但是最终的图像非常具有指示性:它看起来很棒:D
$ \ endgroup $
–佩内洛普
2012年11月29日10:38

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

#2 楼

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

说,让我采用一种简单的数学形态学(MM)方法fun :)
用于可视化所有步骤的图像都在最后。

我拍摄了示例图像,并使用ImageMagick将其转换为Lab *颜色空间,仅使用了L *波段:

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


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

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

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

我们现在大约有三块:图像的左侧部分,中央部分和图像的右侧部分。中心部分应该是这三个部分中较小的部分,因此可以轻松获得。

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



评论


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

$ \ begingroup $
我很快将添加更多图像(并替换为灰度图像),以便可以将图像本身用于测试,从而消除了由于色彩而导致动态范围失真的危险。
$ \ endgroup $
– heltonbiker
2012年11月29日12:26

$ \ begingroup $
很遗憾,该数据尚不可用。灰度图像充其量只是其近似值。
$ \ endgroup $
– mmgp
2012年11月29日13:19

$ \ begingroup $
我相信近似值可能就足够了,但是我不介意提供实际数据。我可以发布一些公共的DropBox下载链接,只是不知道哪种文件格式。
$ \ endgroup $
– heltonbiker
2012年11月29日13:27