2017-02-11 5 views
3

Ich versuche, Rechtecke in einer verrauschten Bildmatrix automatisch zu erkennen. Die Werte sind binär, es gibt eine beliebige Anzahl von Rechtecken, die Kanten können aufgrund von Rauschen ein wenig unscharf sein. Ich würde gerne mit den Koordinaten der Rechtecke oder einer anderen solchen Methode enden, die es mir erlaubt, mich auf diese Bereiche zu konzentrieren.Verwenden von Computer Vision in R, um Rechtecke in verrauschten Daten zu finden

Ich habe versucht, die Hough-Transformation aus dem PET-Paket zu verwenden, aber verstehe nicht, wie man die Ausgabe interpretiert. Ich bin offen für andere Pakete oder Techniken.

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))) 

Dieser Code erstellt das folgende Bild.

The noisy rectangles generated by the above example

Mit dem Haustiere Paket, das ich ein sehr schönes Bild zu bekommen, aber nicht wissen, was damit zu tun. Was ich gerne bekommen würde, sind so etwas wie die Koordinaten der Rechtecke. Ich bin nicht an die Hough-Transformation gebunden und jede erfolgreiche Methode ist in Ordnung.

test <- hough(noisydf) 

image(test$hData) 
+0

Das Startbild wäre bitte nützlich. –

+0

Der angegebene Code erzeugt das angezeigte Bild. Ich suche nach einer allgemeinen Methode, Rechtecke in einer verrauschten binären Matrix zu finden, so dass es kein spezifisches Bild gibt, es gibt kein Bildformat, weil ich ein Objekt der Klassenmatrix betrachte. Gibt es einen Grund, warum Sie speziell nach einem Bild fragen? Ich werde versuchen zu klären, ob Informationen fehlen. Ich bin neu in der Bildbearbeitung und entschuldige mich, wenn ich nützliche Informationen verpasst habe. –

+0

Also willst du weiter von dem Bild sehen und die Rechtecke finden? Wenn das der Fall ist, denke ich, dass du 'cv :: connectedComponents' brauchst und setze dann einen minimalen Bereich um kleine Blobs auszuschließen. –

Antwort

1

Da niemand Sie zu beantworten scheint, vielleicht sind Sie offen für eine alternative Lösung mit ImageMagick die auf den meisten Linux-Distributionen installiert und ist für Mac OS und Windows zur Verfügung - kostenlos.

Also, ich bin mit „Connected Component Analysis“ nur auf der Kommandozeile Blobs oder Klumpen von verbundenen Komponenten mit einer minimalen Fläche zu identifizieren. Mir Angabe 4-verbundene Formen (Rechtecke), anstatt 8 verbundene Formen - die weißen Pixel in Nord-Ost, Süd-Ost, Süd-West und Nord-West-Positionen in Betracht gezogen werden kann Nachbarn:

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

Ausgabe

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) 

Blick auf die Spaltentitel in der ersten Zeile der Ausgabe und hoffentlich können Sie sehen, es 6 Rechtecke identifiziert hat - die letzten 4 sind weiß, dh rgb(255,255,255) und Ihre Rechtecke entsprechen. Schauen wir uns einmal die 168:... an. Es ist 153 Pixel breit und 102 Pixel groß und beginnt 291 Pixel von links und 237 Pixel von der Spitze des Bildes. Also, lassen Sie die Farbe in diesen letzten vier:

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

können Sie tun, um die gleiche Art der Sache mit OpenCV mit cv::connectedComponents.

+0

Danke das ist ziemlich cool und interessant. Leider muss es in einen R-Workflow passen, aber ich könnte Opencv benutzen oder schauen, wie die Funktion funktioniert, damit ich etwas ähnliches in R implementieren kann.Danke, dass du so viel darüber nachgedacht hast. –

Verwandte Themen