【问题标题】:Using Computer vision in R to find rectangles in noisy data在 R 中使用计算机视觉在嘈杂的数据中查找矩形
【发布时间】:2017-02-11 12:39:16
【问题描述】:

我正在尝试自动检测嘈杂图像矩阵中的矩形。这些值是二进制的,有任意数量的矩形,由于噪声,边缘可能有点模糊。我想最终得到矩形的坐标或其他一些这样的方法,让我可以专注于这些区域。

我一直在尝试使用 PET 包中的霍夫变换,但不明白如何解释输出。我对其他软件包或技术持开放态度。

library(PET)

AddRectangle<- function(df, startx, starty, cols, rows){
    RectangleVector <- rep(1:cols, times = rows)
    #Start Point
    RectangleVector <- ncol(df)*(starty-1) + (startx-1) + RectangleVector
    #Row changes
    RectangleVector<- RectangleVector+ rep((0:(rows-1))*ncol(df), each = cols)
  RectangleVector
}

#create matrix, this is an arbitrary example.
dfrows <- 100
dfcols <- 100
df <- matrix(0, nrow = dfrows, ncol = dfcols)

#put in rectangles
df[AddRectangle(df, startx = 3, starty = 3, cols = 10, rows =10)] <-1
df[AddRectangle(df, startx = 40, starty = 50, cols = 30, rows =20)] <-1
df[AddRectangle(df, startx = 45, starty = 10, cols = 30, rows =35)] <-1
df[AddRectangle(df, startx = 80, starty = 80, cols = 10, rows =10)] <-1

image(df,col = grey(seq(0, 1, length = 2)))

set.seed(2017)
#add in noise
noisydf<- df
#Positives
noisydf[runif(dfrows*dfcols)>0.97]<-1
#negatives
noisydf[runif(dfrows*dfcols)>0.97]<-0

#Visualise
image(noisydf,col = grey(seq(0, 1, length = 2)))

此代码创建以下图像。

使用宠物包我得到了一张非常漂亮的照片,但不知道如何处理它。我想得到的是矩形的坐标。我与霍夫变换无关,任何成功的方法都可以。

test <- hough(noisydf)

image(test$hData)

【问题讨论】:

  • 请提供起始图片。
  • 给出的代码生成显示的图像。我正在寻找一种在嘈杂的二进制矩阵中查找矩形的通用方法,因此没有特定的图像,也没有图像格式,因为我正在查看类矩阵的对象。您是否有理由专门要求图像?如果信息丢失,我将尝试澄清。我是图像处理的新手,如果我错过了有用的信息,我们深表歉意。
  • 所以您想从显示的图像继续并找到矩形?如果是这样,我认为您需要cv::connectedComponents,然后设置一个最小区域以排除小斑点。

标签: r opencv image-processing hough-transform


【解决方案1】:

由于似乎没有人回答您,也许您愿意接受使用 ImageMagick 的替代解决方案,该解决方案安装在大多数 Linux 发行版上,可用于 macOS 和 Windows - 免费。 p>

所以,我只是在命令行中使用 “连接组件分析” 来识别 blob 或具有最小面积的连接组件块。我指定的是 4 个连接的形状(矩形)而不是 8 个连接的形状 - 这允许将东北、东南、西南和西北位置的白色像素视为邻居:

convert rectangles.png -threshold 50%               \
   -define connected-components:verbose=true        \
   -define connected-components:area-threshold=1000 \
   -connected-components 4 -auto-level z.png

输出

Objects (id: bounding-box centroid area mean-color):
  0: 613x460+0+0 287.2,239.0 140894 srgb(255,255,255)
  3: 504x294+69+78 318.1,213.1 115208 srgb(0,0,0)
  168: 153x102+291+237 369.5,286.5 14800 srgb(255,255,255)
  100: 154x59+266+164 344.6,194.5 8334 srgb(255,255,255)
  265: 54x28+84+328 112.5,341.7 1372 srgb(255,255,255)
  41: 49x31+469+110 492.8,123.5 1372 srgb(255,255,255)

查看输出第一行中的列标题,希望您可以看到它已识别出 6 个矩形 - 最后 4 个是白色的,即 rgb(255,255,255) 并对应于您的矩形。让我们看看以168:... 开头的那个。它宽 153 像素,高 102 像素,从左侧开始 291 像素,距离图像顶部 237 像素。所以,让我们在最后四个上色:

convert rectangles.png -fill "rgba(255,0,0,0.5)" -draw "rectangle 291,237 444,339" \
   -fill "rgba(0,0,255,0.5)" -draw "rectangle 266,164 420,224" \
   -fill "rgba(255,0,255,0.5" -draw "rectangle 84,328 138,356" \
   -fill "rgba(0,255,255,0.5)" -draw "rectangle 469,110 518,141" result.png

您可以使用 cv::connectedComponentsOpenCV 做同样的事情。

【讨论】:

  • 谢谢,这很酷也很有趣。不幸的是,它需要适合 R 工作流程,但是我也许可以使用 Opencv 或查看该函数的工作原理,以便我可以在 R 中实现类似的东西。感谢您将这样的想法融入其中。
猜你喜欢
  • 2011-01-26
  • 2013-11-12
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2018-11-07
  • 2011-07-25
相关资源
最近更新 更多