如何将图像转换为散点图的点数据用于 ggplot2?

8

我最近在Github上发现了一个程序包, 其中开发者分析了Antonio Prohias在Mad Magazine上创作的248个Spy vs Spy漫画的粉丝策划数据。

他进行了一些基本的探索性数据分析,计算了黑色间谍胜利的净得分,并运行了一个非参数检验(Wald Wolfowitz test)来查看一个间谍连续胜利的集群,以确定Prohias是否通过颠倒前面的结果或选择喜欢的方式来保持得分平衡。

虽然我觉得这是一个有趣的练习,但我最感兴趣的是Spy Plot。

Spy Vs. Spy

Spy Plot的点数据实际上来自于MATLAB彩蛋spy()包,开发人员将这些点数据放入了R中作为tibble::tribble
我的问题是如何从图像中创建点数据?是否可以使用在R中使用imager()进行边缘检测以获取轮廓?

enter image description here

然后将这些图像数据转换为tbl_df?我不熟悉位图数组,但也许答案就在这样的东西中?

请[编辑]您的问题以展示您目前所拥有的代码。您应该至少包含一个概述(最好是[mcve])您遇到问题的代码,这样我们才能尝试解决具体的问题。您还应该阅读[提问的智慧]。 - Toby Speight
1个回答

6
我们可以使用imager::cannyEdges来获取边缘,然后将坐标放入数据框架中进行绘图。
library('ggplot2')
library('imager')

plot(boats)

boats

img <- cannyEdges(boats)
plot(img)

edges

看起来img是一个有四个维度的逻辑数组。

dim(img)
# [1] 256 384   1   3

我只需要两个维度,因此我将舍弃其中的两个维度。

img <- img[, , 1, 1]
img[1:8, 1:8]
#       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
# [1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [5,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [7,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [8,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

which 可以将这个矩阵转换为坐标列表。

coords <- which(img, arr.ind = T)
head(coords)
#      row col
# [1,] 255   1
# [2,] 255   2
# [3,] 255   3
# [4,] 255   4
# [5,] 255   5
# [6,] 255   6

现在可以绘制它了。
df <- data.frame(x = coords[,1], y = coords[,2])

ggplot(df, aes(x, -y)) +
  geom_point()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接