Automatischer Auswertung von Mikroskopaufnahmen.

Galaxy345

Lieutenant
Registriert
Mai 2008
Beiträge
604
Hallo liebe CB Coder.
Ich bin arbeite derzeit an einem wissenschaftlichen Projekt, in welchem Gefriertemperaturen von mikroskopischen Wassertropfen mithilfe von Webcamaufnahmen bestimmt werden.

Da dabei das Zählen und Zuordnen von Hand sehr langsam ist, habe ich mir überlegt mir und vielen Mitarbeitern die Arbeit zu vereinfachen.
Hier ist ein Beispiel wie diese Bilder aussehen:
http://imgur.com/a/s6Exa

Die beiden dunkleren Tropfen ohne Reflektion der Mikroskoplampe in der Mitte sind bereits gefroren.

Was ich gerne erreichen will ist ein Programm/Skript das folgendes tut:

1) Optimieren der Bilder
Hier gibt es riesiges Potential, mir fehlt dazu leider Wissen in Bildbearbeitung. Ausser Kontrast und Schärfe hab ich nichts sinnvolles hinbekommen.

2) Zuverlässiges Erkennen und Zuordnen aller Tropfen einer einstellbaren Größe in einem Array, mitsamt Koordinaten.
Mit meinem Matlab Skript funktioniert dies recht gut.

3) Speichern der Farbwerte der Pixel im Zentrum.
Am liebsten würde ich hier einen kleinen Bereich analysieren anstelle von einem Pixel, um Fehler zu vermindern.

4) Dies für bis zu 1000 Bilder pro Experiment wiederholen
Sollte mit einer Schleife kein Problem sein, da die Bildernamen einfach durchnummeriert sind. Vielleicht hat jemand einen Tipp wie man diese Zugriffe möglichst effizient gestaltet.

5) Tropfen als gefroren markieren wenn die Farbwertewerte stark abnehmen vgl zu der Startaufnahme.
Mit einem If einfach lösbar. Zusätzlich kann man bereits gefrorenen Tropfen eventuell aus der Schleife entfernen falls damit Rechenzeit gespart werden kann.

6) Exportieren einer Tabelle mit folgendem Format:
Tropfennummer | Bildnummer vom Beginn der Eisbildung



Dies kann in der nachfolgenden Auswertung in bereits vorhandenen Plot Templates verwendet werden.
Mit imfindcircles habe ich was funktionierendes in Matlab hinbekommen.
Da geht aber sicher deutlich eleganter.


Code:
%% Detect and Measure Circular Objects in an Image
% Copyright 2012-2014 The MathWorks, Inc.

%% Load Image

input = imread('2.png');
figure
imshow(input)
bw = rgb2gray(input);

%% Find large and small droplets

[Lcenters, Lradii] = imfindcircles(bw,[55 100], 'ObjectPolarity','dark', ...
          'Sensitivity',0.86,'EdgeThreshold',0.2);
[Scenters, Sradii] = imfindcircles(bw,[30 54], 'ObjectPolarity','dark', ...
          'Sensitivity',0.86,'EdgeThreshold',0.2);
Centers=[Lcenters;Scenters];
Radii=[Lradii;Sradii];
 
h = viscircles(Centers,Radii);


%% Count number of drops detected

nDrops = numel(Radii)

%% Store original greyscale value of the center reflection.

PixelColor = double.empty;
for K = 1:nDrops
P=impixel(bw, Centers(K,1),Centers(K,2));
PixelColor(K,3)=P(1,1);
PixelColor(K,1)= Centers(K,1);
PixelColor(K,2)= Centers(K,2);
end

%% Load next image

new  = rgb2gray(imread('3.png'));



%% Store new greyscale value of the center reflection.

for K = 1:nDrops
P=impixel(new, Centers(K,1),Centers(K,2));
PixelColor(K,4)=P(1,1);
end

%% Look for jumps in values.

nFrozen=0;

for K = 1:nDrops
    test=PixelColor(4,3)- PixelColor(4,4);
    if PixelColor(K,3)- PixelColor(K,4) > 30
    nFrozen=nFrozen+1;
    end
    
end



Ich habe grundlegende Programmiererfahrung in C++, Pascal, Matlab, Python, allerdings nichts weltbewegendes.
Vielleicht hat jemand eine bessere Idee, lasst sie hören. Es muss auch nicht Matlab sein, ich habe das nur als ersten Versuch probiert.


Danke im Voraus.
Galaxy
 
Oft wird für solche Sachen OpenCV benutzt. Für das, was du aufzählst, sollten dort hilfreiche Funktionen vorhanden sein. Hast du in die Richtung schon mal geschaut?
 
Nope das kam mir noch nicht unter die Lupe.
Danke ich schau mir das mal an.
 
Mit imfindcircles habe ich was funktionierendes in Matlab hinbekommen.
Da geht aber sicher deutlich eleganter.
Wenns schon läuft: Wieso dann neu machen? Ich hab Erfahrung in Bildverarbeitung und auch mit C++/Python/OpenCV aber Arbeit doppelt machen bringts ja nich, oder? Woran mangelt denn die aktuelle Lösung. Geschwindigkeit?
Viel weniger Zeilen wird das mit OpenCV und C++ bzw Python auch nicht werden.
Beliebig schwierig kann das ganze durch Punkt 2 und 4 werden: Sollen Parameter per GUI einstellbar sein? Oder reicht eine Konfigfile wie ne .ini? UI-Programmierung kostet halt Zeit und bringt dann auch ne Festlegung auf Programmiersprache und manchmal auch OS mit sich. Kannst du dazu nochmal was sagen?

Die Sinnvollste Herangehensweise wäre evtl. mit einem Studenten aus der Informatik/Mathematik zusammen zu arbeiten. Für den wäre das ein super Thema für eine Abschlussarbeit.
Wo ich gerade den Satz "Farbwertewerte stark abnehmen vgl zu der Startaufnahme" sehe: Das ist zwar auf den ersten Blick nur ein Schwellwert aber meistens sind solche einfachen Ansätze nicht gut genug und man muss plötzlich deutlich mehr Mathe benutzen als man denkt.. zB Clusteranalyse. Außerdem werden die Kreise in der Bildfolge wandern und auch Objekt-Tracking kann man beliebig kompliziert machen (Beispiel).
 
Zurück
Oben