【问题标题】:Using R to match image subset with larger image使用 R 将图像子集与更大的图像进行匹配
【发布时间】:2015-01-03 07:37:10
【问题描述】:

我正在使用 R 进行一些非常简单的图像分析。具体来说,我正在尝试确定一张图片是否是另一张图片的裁剪版本。

在 R 中必须有一种“简单”的方法来做到这一点 - 但我没有找到它。我怀疑我对这个问题的思考过度了 - 所以寻找我所缺少的指导。

具体来说,考虑以下几点:

install.packages("jpeg")
library(jpeg)

image.main <- readJPEG("path to a jpeg image")
image.main.sub <- readJPEG("path to another jpeg image, cropped version of the first")

if (someMagicFunctionThatFindsSubImage(image.main,image.main.sub)) {
    # TRUE - image.main.sub is a subset of image.main 
} else {
    # FALSE - image.main.sub is NOT a subset of image.main
}

someMagicFunctionThatFindsSubImage <- function (bigImage,smallImage) {
  # the matrix of values that represent smallImage is also present
  # in the matrix of values that represent bigImage
  # bigImage and smallImage can be megabytes in size
  # bigImage and smallImage can be limited to RGB Jpeg data (array of X,Y and 3 layers)
}

我试过了:

  • grep、grepl、grepRaw : 错误 - 模式的长度 > 1
  • rimage 包:错误,包“rimage”不可用
  • package raster:不确定如何使用它来查找图像子集(我是不是想多了?)
  • package ripa:同样,不确定如何使用它(再次,我是不是想多了?)

我一直在this github 收集结果,并将保持更新。

谢谢你

分钟

【问题讨论】:

  • 请编辑您的问题以解决 2 个问题:“图像子集”的含义是什么?以及从哪个包中读取JPEG?
  • 为什么您认为使用 any 软件是一项“简单”的任务?如果您确定永远不会再压缩、位深度等,那么您可以在卷积操作中使用小图像作为内核。至少可以说这是处理器密集型的。好的匹配算法通常会花钱,这是有道理的。
  • @BondedDust :添加了 install.packages("jpeg") 和 library(jpeg)。
  • @CarlWitthoft :当然 - 图像分析很困难。但在我跳到复杂之前,我试图确保我已经用尽了简单。 “编程是避免复杂解决方案的艺术”
  • 当您使用它时,请不要将“复杂”用于“复杂”。复数在数学中是一个非常具体的概念,因此在软件中也是如此。

标签: r image-processing


【解决方案1】:

实际上,事实证明 是一种“简单”的方法。我很幸运能和一位图像分析教授一起过圣诞节。他花了一分钟以上的时间来建议使用 cross-covariancecross-correlation。两者都作为 stats 包的一部分存在于 R 中。

>? ccf

它是这样工作的:

在上面的示例中,我使用...导入 JPEG 图像

> install.packages("jpeg")
> library(jpeg)

> image.main <- readJPEG("path to a jpeg image")
> image.main.sub <- readJPEG("path to another jpeg image, cropped version of the first")

这会加载带有 jpeg 图像内容的 image.main 和 image.main.sub - 类似这样...

> str(image.main)
num [1:3456, 1:5184, 1:3] 0.839 0.839 0.827 0.831 0.835 ..

为了便于讨论,我将创建此数据的高度简化版本。忍一忍……

> image.main <- sample(1:20,20)
> image.main.sub <- image.main[5:8]

想象 image.main 包含一个非常小的 jpeg 图像。

image.main.sub 包含 image.main 的子集。

他们看起来像这样......

> image.main
[1]  2 10  8  9 19  5 11  3  7 16 20 15  6 14 17  1 13 18 12  4
> image.main.sub
[1] 19  5 11  3

现在,我们可以使用 ccf 函数确定 image.main.sub 在 image.main 中的位置

> ccf(image.main,image.main.sub,plot=FALSE)

Autocorrelations of series ‘X’, by lag

   -3     -2     -1      0      1      2      3 
0.440 -0.332  0.295 -0.935  0.327 -0.010  0.215 

ccf 显示了两个数据集之间不同偏移量(滞后)的correlation。值 1 表示 100% 的相关性。如果我们将 image.main 子集以匹配 image.main.sub,请观察结果...

> ccf(image.main[5:8],image.main.sub,plot=FALSE)

Autocorrelations of series ‘X’, by lag

    -3     -2     -1      0      1      2      3 
-0.398  0.281 -0.382  1.000 -0.382  0.281 -0.398 

请注意延迟为 0 时的值 1.000。匹配!

与此过程相关的是template matching

我已经在我的github 页面构建了整个解决方案。

分钟

【讨论】:

  • 只是一个小提示:github 链接似乎不是最新的,...
猜你喜欢
  • 2014-10-01
  • 2014-01-06
  • 2016-03-21
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多