代码之家  ›  专栏  ›  技术社区  ›  Matthew J. Oldach

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

  •  8
  • Matthew J. Oldach  · 技术社区  · 7 年前

    我最近发现 package on Github 在那里,开发人员分析了出现在Mad杂志上的安东尼奥·普罗希亚斯(AntonioProhias)的间谍vs间谍漫画248期的粉丝策划数据。

    他进行了一些基本的探索性数据分析,计算出黑人间谍获胜的连续净分,然后进行非参数测试(沃尔福威茨测试),查看其中一名间谍连续获胜的情况,以确定普罗希亚斯是否通过逆转之前的结果来保持得分平衡,或者他是否选择了最喜欢的。

    虽然我觉得这是一个有趣的练习,但我对间谍阴谋最感兴趣。

    Spy Vs. Spy

    间谍阴谋的点数据实际上来自 MATLAB easter egg spy() 包和开发人员将此点数据作为 tibble::tribble .

    我的问题是如何从图像创建点数据?有可能吗 edge detection in R with imager() 获取大纲

    enter image description here

    然后以某种方式将这些图像数据转换为 tbl_df ? 我不熟悉位图数组,但也许答案就在于这样?

    1 回复  |  直到 7 年前
        1
  •  6
  •   Paul    7 年前

    我们可以使用 imager::cannyEdges 要获取边,请将坐标放在数据框中进行绘制。

    library('ggplot2')
    library('imager')
    
    plot(boats)
    

    boats

    img <- cannyEdges(boats)
    plot(img)
    

    edges

    看起来像 img 是具有4个维度的逻辑阵列。

    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