2016-03-24 8 views
1

Ich habe eine große Anzahl von Graustufenbildern, die helle "Fasern" auf einem dunkleren Hintergrund zeigen. Ich versuche die "Menge" an Fasern zu quantifizieren. Da sie sich fast überall überlappen, wird es unmöglich sein, die Anzahl der Fasern zu zählen. Stattdessen möchte ich einfach berechnen, wie groß der Flächenanteil der weißen Fasern im Vergleich zum Gesamtbild ist (zB 55% weiß, ein anderes) eine mit weniger Fasern ist nur 43% weiß, usw.). Mit anderen Worten, ich möchte die Dichte der Fasern im Bild quantifizieren.Finden Sie "Bruchteil der hellen Pixel" im Bild (Schwellenwert?)

Beispielbilder:

hohe Dichte: https://dl.dropboxusercontent.com/u/14309718/f1.jpg

geringere Dichte: https://dl.dropboxusercontent.com/u/14309718/f2.jpg

dachte ich, einen einfache (adaptive) Schwellwertfilter den Job gut durch nur das Umwandeln des Bildes rein schwarz täte/Weiß und dann den Bruchteil der weißen Pixel zählen. Meine Antwort scheint jedoch fast vollständig und nur von dem von mir gewählten Schwellenwert abhängig zu sein. Ich habe ein paar schnelle Experimente gemacht, indem ich eine große Anzahl verschiedener Schwellenwerte genommen habe, und festgestellt, dass in allen Bildern der Anteil der weißen Pixel fast genau eine lineare Funktion des Schwellenwertes ist. Mit anderen Worten - ich kann jede gewünschte Antwort zwischen ungefähr 10% und 90% erhalten, abhängig von der gewählten Schwelle.

Dies ist offensichtlich kein guter Ansatz, da meine Ergebnisse extrem voreingenommen sind mit wie ich den Schwellenwert wählen und daher völlig nutzlos. Außerdem habe ich ungefähr 100 dieser Bilder und ich freue mich nicht darauf, die "richtige" Schwelle für alle manuell zu wählen.

Wie kann ich diese Methode verbessern?

Antwort

2

Da die Bilder komplex sind und die Umrisse der Fasern unscharf sind, gibt es wenig Hoffnung auf eine "exakte" Messung.

Es kommt also darauf an, die Wiederholbarkeit zu erreichen, d. H. Sicherzustellen, dass der gleichen Faserdichte immer die gleiche Messung zugeordnet wird, selbst wenn die Lichtverhältnisse unterschiedlich sind, und unterschiedliche Dichten werden unterschiedlichen Messungen zugeordnet.

Dies schließt menschliches Eingreifen bei der Anpassung eines Schwellenwerts aus.

Mein bester Rat ist, sich auf Otsu Thresholding zu verlassen, das sehr gut darin ist, bedeutungsvolle Hintergrund- und Vordergrundintensitäten zu finden, und ziemlich lichtunabhängig ist.

Eine Verbesserung der Kontraste vor Otsu sollte vermieden werden, da die Binarisierung mit Kontrastverstärkung pendelt (so dass es keinen wirklichen Vorteil gibt), aber die Kontrastverstärkung kann das Bild durch Sättigung an Stellen verschlechtern.

+0

Danke. Ich denke, dass die Unschärfe der Umrisse genau das Problem ist, das ich habe, weil die Erhöhung der Schwelle einfach darin resultiert, mehr Faser zu berücksichtigen (zB wird mehr von der verschwommenen Kante gezählt), also macht es Sinn, dass es so ist abhängig von der Schwelle. Gibt es nichts, was dieses Problem spezifisch angeht? Die Unschärfe sollte in allen Bildern sehr ähnlich sein, also vielleicht ein Algorithmus, der den Gradienten von Schwarz zu Weiß betrachtet und einen Zwischenwert als "Kante" wählt? Ich habe keine Ahnung, wie dies nur durch Brainstorming erreicht werden könnte. Ich werde in die Otsu-Schwelle schauen. –

+0

@NickThissen: Mach dir keine Sorgen über die unscharfen Kanten, benutze einfach eine empirische Messung. Wiederholbarkeit ist wichtiger als jede Art von "Korrektheit". –

0

Echo Nur @YvesDaoust Gedanken wirklich - und einige konkrete Beispiele bieten ...

Sie Histogramme Ihrer Bilder erzeugen kann, ImageMagick, die auf den meisten Linux-Distributionen installiert und ist für OSX und Windows verfügbar. Ich mache das nur an der Kommandozeile, aber es ist mächtig und einfach, einige Tests durchzuführen und zu sehen, wie der Vorschlag von Yves für Sie funktioniert.

# Make histograms for both images 
convert 1.jpg histogram:h1.png 
convert 2.jpg histogram:h2.png 

enter image description here

enter image description here

Ja, sie sind ziemlich bimodale - so Otsu Schwellwertbildung einen Schwellenwert, der die zwischen Klasse maximiert Varianz finden sollte. Verwenden Sie das Skript otsuthresh von Fred Weinhaus Website here

./otsuthresh 1.jpg 1.gif 
Thresholding Image At 44.7059% 

./otsuthresh 2.jpg 2.gif 
Thresholding Image At 42.7451% 

enter image description here

enter image description here

Count Prozentsatz der weißen Pixel in jedem Bild:

convert 1.gif -format "%[fx:int(mean*100)]" info: 
50 

convert 2.gif -format "%[fx:int(mean*100)]" info: 
48 

Nicht, dass brillant unterschieden! Mmmm ... Ich habe versucht, einen Medianfilter hinzuzufügen, um das Rauschen zu reduzieren, aber das hat nicht geholfen. Haben Sie Ihre Bilder als PNG verfügbar, um die unangenehmen Artefakte zu vermeiden?

Verwandte Themen