Используя компьютерное зрение в 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,

Другие вопросы по тегам