Image prozessing/Clustering vom Bild

Varianzanalyse, Diskriminanzanalyse, Kontingenzanalyse, Faktorenanalyse, Clusteranalyse, MDS, ....

Moderator: EDi

Antworten
waldoo

Image prozessing/Clustering vom Bild

Beitrag von waldoo »

Hallo R-Forum,

Ich versuche für meine Abschlussarbeit image prozessing analyse durchzuführen und mir fehlt ein wenig Verständnis zum gesamten Prozess, da ich sowohl in R, als auch in image prozessing kompletter Neuling bin.
Es handelt sich um Clusteranalyse (oder etwas ähnliches).
als Input benutze ich die Bilder, die an sich die Information über die Tracerverteilung im Boden enthalten. Was ich am Endeffekt brauche: die einzelnen blauen px (mein Tracer ist auf dem Bild blau) will ich nicht betrachten. Aber wenn es mehrere px sehr nah zueinander liegen, will ich die als ein großer blauer Fleck betrachten.
Ich habe probiert mit dem Packages mmand dies Problem zu lösen, wo ich mit der funktion erode() gearbeitet habe. Der Package hat aber leider nicht so viele erweiterte Dokumentation und ich weiß leider nicht, wie ich einige Funktionen verbessern könnte.
Was ich schon gemacht habe:

Code: Alles auswählen

library(jpeg)
library(mmand)

tracer <- readJPEG("plot.jpg")
display(tracer)

tracer_thresholded <- threshold(tracer, method="kmeans") 

k <- shapeKernel(c(5,5), type="diamond")
display(erode(tracer, k))
Das Problem ist, dass Output-Datei zwar schärfer als Original ist, aber da sind immer wieder einzelnen px dabei.

Mit dem Package ClusteR habe ich auch probiert zu arbeiten, aber es geht eher nicht darum, klassische Clusteranalyse zu machen (da ich schon nur drei Farben auf dem Bild habe), sondern wirklich die einzeln stehende px nicht betrachten und aus dem Bild entfernen. Und der Package hat mir als Output-Datei genau das gleiche Bild gegeben, nur mit anderer Farbauflösung.

Code: Alles auswählen

library(ClusterR)
library(OpenImageR)
path_d = 'plot.jpg'
im_d = readImage(path_d)

im_d = resizeImage(im_d, 350, 350, method = 'bilinear')            
imageShow(im_d)   
im3 = apply(im_d, 3, as.vector)                               
dim(im3)                      
km_mb = MiniBatchKmeans(im3, clusters = 2, batch_size = 20, num_init = 10, max_iters = 500, 
                        init_fraction = 0.5, initializer = 'kmeans++', early_stop_iter = 10,
                        verbose = F)
pr_mb = predict_MBatchKMeans(im3, km_mb$centroids)
getcent_mb = km_mb$centroids
new_im_mb = getcent_mb[pr_mb, ]   
dim(new_im_mb) = c(nrow(im_d), ncol(im_d), 3)     

imageShow(new_im_mb)

Ich würde gerne eure Meinung hören, wie man vllt dieses Problem nicht nur mit mmand lösen kann, oder wie man erode() verbessern könnte und so machen könnte, dass die wirklich die einzeln liegende px nicht betrachtet, und alle anderen clustert? Oder gibt es welche andere Möglichkeiten?

Danke euch im Voraus!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Image prozessing/Clustering vom Bild

Beitrag von bigben »

als Input benutze ich die Bilder
Ich glaub es wär gut, so ein Bild mal zu sehen. Und dann glaube ich wäre es gut zu verstehen, was Du anschließend mit dem Bild nach Entfernen der Einzelstehenden Pixel weiter machen willst. Nur Anschauen, oder auch was rechnen. Wenn ja, was?
Reden wir von zigtausend Bilder, die hohe Rechengeschwindigkeit eines spezialisierten Packages erforderlich machen oder kann man auch mit verschachtelten for-Schleifen durch den Blau-Kanal gehen und gemütlich Pixel für Pixel die Nachbarpixel abfragen?

Würde so etwas hier helfen: https://docs.gimp.org/en/plug-in-despeckle.html "The filter replaces each pixel with the median value of the pixels within the specified radius"

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
waldoo

Re: Image prozessing/Clustering vom Bild

Beitrag von waldoo »

Hallo Bernhard,
danke für deine schnelle Antwort. Anbei ist eines von meinen Bildern.
Idealerweise wäre es nach der Entfernung von einzelnen px auch die euclidean distances zwischen den gebliebenen blauen Flecken zu finden, aber es ist nicht unbedingt. In erste Reihe steht doch die visuelle Analyse.
Die Bilder sind ganz einfach und brauchen keine spezielle Packages, um die auszulesen, wenn ich richtig deine Frage verstanden habe. Ich denke, for-Schleifen würde reichen.
Das im Gimp zu machen, habe ich nicht probiert, weiß aber nicht, ob es wirklich eine gute Lösung wäre. Ich habe ziemlich viele Bilder und dachte, dass mit R kann ich vllt dann eine Schleife definieren, die nach angegebenen Parametern das für alle Bilder berechnet.
Dateianhänge
3k_lat_10cm40mm_klassifiziert.jpg
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Image prozessing/Clustering vom Bild

Beitrag von EDi »

schau dir mal das imager paket an.. Würde zuest blau rausstellen (easy bei dem Bild) und dann vielleicht mit watershed drüber...
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Antworten