2017-02-11 12 views
3

Я пытаюсь автоматически обнаруживать прямоугольники в матрице шума. Значения двоичные, есть произвольное количество прямоугольников, края могут быть немного нечеткими из-за шума. Я хотел бы получить координаты прямоугольников или какой-либо другой такой метод, позволяющий мне сосредоточиться на этих областях.Использование зрения компьютера в R для поиска прямоугольников в шумных данных

Я пытался использовать преобразование Hough из пакета 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))) 

Этот код создает следующее изображение.

The noisy rectangles generated by the above example

Использование пакета домашних животных я получаю очень хорошее представление, но не знаю, что делать с ним. То, что я хотел бы получить, - это что-то вроде координат прямоугольников. Я не привязан к преобразованию Хафа, и любой успешный метод в порядке.

test <- hough(noisydf) 

image(test$hData) 
+0

Начальный образ будет полезен, пожалуйста. –

+0

Приведенный код генерирует изображение. Я ищу общий метод поиска прямоугольников в шумной двоичной матрице, поэтому нет конкретного изображения, нет формата изображения, потому что я смотрю на объект класса. Есть ли причина, по которой вы запрашиваете изображение? Я попробую и уточню, если информация отсутствует. Я новичок в обработке изображений, так что извиняюсь, если я пропустил полезную информацию. –

+0

Итак, вы хотите продолжить работу с изображенного изображения и найти прямоугольники? Если это так, я думаю, вам нужно 'cv :: connectedComponents', а затем установить минимальную область, чтобы исключить небольшие капли. –

ответ

1

Как никто не кажется, что отвечать вам, может быть, вы открыты для альтернативного решения с использованием ImageMagick, который устанавливается на большинстве дистрибутивов Linux и доступна для MacOS и Windows - бесплатно.

Итак, я использую «Connected анализ компонентов» только в командной строке, чтобы определить сгустки или комки связных компонент с минимальной площадью. Я с указанием 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 

enter image description here

Вы можете сделать то же рода вещи с OpenCV использованием cv::connectedComponents.

+0

Спасибо, что это круто и интересно. К сожалению, он должен вписываться в рабочий процесс R, однако я мог бы использовать Opencv или посмотреть, как работает функция, чтобы я мог реализовать что-то подобное в R.Спасибо, что вложил в это такую ​​мысль. –

 Смежные вопросы

  • Нет связанных вопросов^_^