Используя компьютерное зрение в R, чтобы найти прямоугольники в шумных данных
Я пытаюсь автоматически обнаружить прямоугольники в матрице с шумным изображением. Значения являются двоичными, имеется произвольное количество прямоугольников, края могут быть нечеткими из-за шума. Я хотел бы закончить с координатами прямоугольников или каким-либо другим подобным методом, позволяющим мне сосредоточиться на этих областях.
Я пытался использовать преобразование Хафа из пакета 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)
1 ответ
Поскольку никто, кажется, не отвечает вам, возможно, вы открыты для альтернативного решения, использующего ImageMagick, которое установлено в большинстве дистрибутивов Linux и доступно для macOS и Windows - бесплатно.
Итак, я использую "Анализ связанных компонентов" только в командной строке, чтобы идентифицировать капли или куски связанных компонентов с минимальной площадью. Я указываю 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
Вы можете сделать то же самое с OpenCV, используя cv::connectedComponents
,