首页 > 解决方案 > 在 r 中查找商店平面图中货架的 xy 坐标

问题描述

我正在做以下工作:我有一个商店布局,示例见下文(由于 GDPR 原因,无法添加真实的东西,但示例应该可以解决问题)我有来自访客的 xy 坐标(当然是匿名的)

店铺布局

我已经在图片上放置了一个网格,这样我就可以看到他们在商店里走的路线。这很好用。原点位于左下角,x 和 y 的缩放范围为 0-100。到目前为止,一切都很好。现在下一步是确定货架的坐标,图片中的矩形。有没有办法做到这一点而不必手动执行此操作?真正的店铺布局包含 900 多个货架,还是我把船推得太远了?

我正在寻找的输出是一个包含搁置 ID 和角坐标的数据框。想法是在商店中创建一些热图,以查看是否存在盲点、热点、...

第二个分析也需要整数点。这个想法是创建访问者点的向量,以便我们获得他们正在寻找的方向。通过使用人类可以看到的范围,我会根据与整数点的交集给出“看到”产品的百分比。

谢谢!杰伦

标签: rimagecoordinates

解决方案


一种方法是对图像的黑色像素进行聚类。集群就是货架。如果货架是轴平行的,您只需在每个方向上取最小值/最大值即可找到矩形。这很好用:

找到的矩形

示例代码(我将图像转换为 PNG,因为它比 gif 更容易阅读):

library(png)
library(dbscan)
library(tidyverse)
library(RColorBrewer)


img <- readPNG("G18JU.png")



is_black <-
  img %>% 
  apply(c(1, 2), sum) %>%  #sum all color channels
  {. < 2.5} %>% # we assume black if the sum is lower than 2.5 (max value is 3)
  which(arr.ind=TRUE) # the indices of the black pixels



clust <- dbscan(is_black, 2) # identify clusters

rects <- 
  as.tibble(is_black) %>% 
  mutate(cluster = clust$cluster) %>% # add cluster information
  group_by(cluster) %>% 
  ## find corner points of rectangles normalized to [0, 1]
  summarise(xleft = max(col) / dim(img)[2],
            ybottom = 1 - min(row) / dim(img)[1],
            xright = min(col) / dim(img)[2],
            ytop = 1 - max(row) / dim(img)[1])

## plot the image and the rectangles
plot(c(0, 1), c(0, 1), type="n")
rasterImage(img, 0, 0, 1, 1)
for (i in seq_len(nrow(rects))) {
  rect(rects$xleft[i], rects$ybottom[i], rects$xright[i], rects$ytop[i],
       border = brewer.pal(nrow(rects), "Paired")[i], lwd = 2)
}

当然,这种方法也将其他黑线检测为“矩形”(例如黑色边框)。但我想你可以轻松地创建一个“干净”的图像。

编辑:扩展方法以查找共享黑线的架子

要扩展该方法,使其可以分隔共享黑线的架子:

首先,以上述方式识别矩形。然后,从图像中提取每个矩形并计算行均值。这将为您提供每个矩形的一维图像(= 线)。在这一行中,像以前一样应用阈值和聚类。集群现在是黑色线段,每个集群的平均值对应于两个货架共享的垂直线。要找到水平共享线,可以应用相同的过程,但使用列手段而不是行手段。


推荐阅读