我试图在嘈杂的图像矩阵中自动检测矩形。这些值是二进制的,有任意数量的矩形,由于噪声,边缘可能有点模糊。我想最后得到矩形的坐标或其他一些这样的方法,让我专注于那些区域。
我一直在尝试使用PET包中的Hough变换,但不了解如何解释输出。我对其他包装或技术持开放态度。
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)))
此代码创建以下图像。
使用宠物包我得到一张非常漂亮的图片,但不知道如何处理它。我想得到的是像矩形的坐标。我没有与Hough变换联系,任何成功的方法都没问题。
test <- hough(noisydf)
image(test$hData)
答案 0 :(得分:1)
由于似乎没有人回答您,也许您对使用 ImageMagick 的替代解决方案持开放态度,该解决方案安装在大多数Linux发行版上,并且可用于macOS和Windows - 免费。
因此,我只是在命令行中使用“连接组件分析”来识别 blobs 或具有最小区域的连接组件块。我指定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::connectedComponents
对 OpenCV 执行相同的操作。