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