之前因为实际需求提取过变形图像中间的坐标数据,发现MMA确实是可以当玩具玩玩的,于是就再结合论坛和帮助文档,看看有没有什么好玩的。偶然发现MMA可以进行图像匹配,于是就想通过MMA的图像匹配获取一小块图片在图像中的位置。
MMA自身的图像匹配函数可以匹配图像,但是却不能返回位置,因此需要我们自己操作。为了避免重复造轮子,先去Google一番,发现MMA的论坛上还真是有人提问,然而这个方法并不能完全解决我们的问题,因为通过我的试验,发现这个方法不是全能的,存在一定的缺陷。要想获得一个比较好的坐标提取方式,看来只能自己动手了。
1.基本知识
- MMA中的图片坐标问题:
在MMA中的图片原点是在图片的左下角,这个和平时的坐标系是一样的。但是在有的编程语言中,这个坐标定位是在左上角,容易混淆,这里要先记住。 - ImageData函数:
这个函数的作用就是将图片中的像素信息和颜色信息提取出来。简而言之就是提取出带有颜色信息的像素点的坐标位置。但是这个函数是从上往下逐行扫描像素信息的因此我们需要先了解一下这个矩阵。我以下面这张图片为例:
在MMA中,规范的光栅化数据是0为黑色,1为白色。因此当我们用ImageData获取这张图片的信息数据的时候,我们可以得到下面的矩阵:
\[\left[ {\begin{array}{*{20}{c}}
0&{0.1}&{0.2}\\
{0.3}&{0.4}&{0.5}\\
{0.6}&{0.7}&{0.8}
\end{array}} \right]\]
那么如果我们用Position[ ]函数提取其中这个颜色值为0.2的像素点的位置,那么获得的数据是(1,3),这样相当于从图片的左上角计算这个像素坐标位置了。 这和MMA的默认坐标位置不同,因此需要注意一下。
2.图片匹配
在进行了上面的基本分析之后,我们就可以正式开始完成这个任务了。我们先获得原始图片:
这张图片是从unsplash上Dmitriy Me2dev摄影作品里随便挑选的一张图。然后我们获取其中的一部分:
那么问题来了,这个局部图片到底是来自于原图的那个位置?
如果拿着放大镜仔细对比,可能会找这个具体的位置,但是这样的工作量是非常大的,我们使用MMA提供的图像匹配函数可以很顺利的实现匹配。先将原图命名为origin.jpg,那个部分的图片命名为part.jpg。这样我们直接用下面的命令进行图片的匹配:
1 2 3 4 |
origin = Import[NotebookDirectory[] <> "origin.jpg"] part = Import[NotebookDirectory[] <> "part.jpg"] comp = ImageAlign[origin, part] ImageCompose[comp, {origin, .5}] |
匹配完成后可以得到下面的图片:
很快就可以得到这张局部图所在的位置,但是现在问题来了,如何提取这个具体的位置?
3.坐标获取
首先我们要分析一下这个合成之后的图片,这是一张四通道的RGB图片,上面是带了一个Alpha通道的。这个我们可以右键查看这个图片信息的时候看到:
其实对我们而言,这个图片没啥用,但是这个合成通道是很有用的。我们需要获得这张通道图片:
1 |
pos = ColorSeparate[comp] |
通过上面的命令,这张图片将会按照颜色通道进行分离。会分离出四个通道,最后一个就是我们需要的Alpha通道图:
有了这张通道图之后,就可以通过Position[ ]函数提取其中的所有白色点的坐标,然后获取其中的最小值就行了:
1 2 |
cood = Position[ImageData[pos[[4]]], 1.]; min = Min /@ Transpose[cood] |
直接输出了一个坐标值:(641, 874),根据之前的基本知识就可知道,这个点是这个白色色块的左上角的点,即从上往下第641行第874列的像素坐标。稍加转换,获得色块左下角的像素坐标:
1 |
min = {min[[2]], ImageDimensions[origin][[2]] - min[[1]]} |
这样可以获得白色色块左下角的坐标为:(874, 353)
将这个区域在图片上高亮显示一下:
1 |
HighlightImage[origin, Rectangle[{min[[1]], min[[2]] - ImageDimensions[part][[2]]}, {min[[1]] + ImageDimensions[part][[1]], min[[2]]}]] |
至此我们完成了图像匹配后坐标的提取工作。
4.End小结
这个东西看起来简单,但是要完全弄好了还是要花一些时间的,在没有任何资料的时候,帮助文件就是最好的书了,但是帮助有时候说的比较简单,只能一点一点摸索。
给出一个文中代码的下载链接:WQ70Z7.zip
GRE就要考了,紧张的不行啊~