Aufgrund meiner Arbeit mache ich oft Bilder von Zellen, deshalb habe ich die Zellenbilder mit der Python-Version von OpenCV analysiert.
Mit einer Gedenkbedeutung.
Dieses Mal finden wir das Verhältnis von kultivierten Zellen, die die adhäsive Oberfläche des Kulturgefäßes bedecken (Zellbelegungsverhältnis oder Konfluenz), die sogenannte "Zellkonfluenz".
Kurz gesagt wird die Belegungsrate von Zellen im mikroskopischen Bild durch Bildanalyse quantifiziert.
Bitte kommentieren Sie, wenn Sie eine Meinung haben oder mehr davon tun möchten.
Eine mikroskopische Aufnahme von Zellen, die als mesenchymale Stammzellen (MSCs) bezeichnet werden.
Auf den ersten Blick beträgt die Konfluenz (Belegungsrate der Zellen im Bild) etwa 30-40%.
Laden Sie die ** OpenCV ** -Bibliothek für die Bildanalyse mit Python.
Laden Sie auch ** NumPy **.
#Bibliothek
import cv2
import numpy as np
Die Funktion ** imread () ** liest die Bilddaten in Farbe und die Funktion ** cvtColor () ** skaliert sie in Graustufen.
** cvtColor () ** Das erste Argument der Funktion ist das Eingabebild (Farbbild).
Da die von der Funktion ** imread () ** erfassten Daten im BGR-Format vorliegen, geben Sie als zweites Argument cv2.COLOR_BGR2GRAY
an.
#Farbbilder laden
img = cv2.imread('cell.jpg', 1)
#Graustufen
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Binarisieren Sie das Bild.
Das heißt, wenn der Pixelwert größer als der Schwellenwert ist, wird ein bestimmter Wert (weiß) zugewiesen, und wenn nicht, wird ein anderer Wert (schwarz) zugewiesen.
Es scheint verschiedene Methoden für die Binarisierung zu geben, aber ich habe versucht, die mit dem Namen "Otsus Binarisierung" zu verwenden.
Verwenden Sie die Funktion ** Schwelle () ** zum Binärisieren.
** Schwelle () ** Das erste Argument der Funktion muss ein Eingabebild und ein Graustufenbild sein. Das zweite Argument ist der Schwellenwert, mit dem der Pixelwert identifiziert wird. Das dritte Argument ist der Maximalwert, der Pixeln mit einem Wert größer oder gleich dem Schwellenwert zugewiesen wird. Wie oben erwähnt, verfügt OpenCV über mehrere Schwellenwertverarbeitungsmethoden, die durch das 4. Argument angegeben werden. Dieses Mal werden wir die Methode der "Binärisierung von Otsu" verwenden, also werden wir "cv2.THRESH_BINARY + cv2.THRESH_OTSU" verwenden.
#Binarisierung von Otsu
ret,th = cv2.threshold(img_gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
Die Funktion ** Schwelle () ** gibt zwei Rückgabewerte zurück.
Der zweite Rückgabewert th
ist ein ** binärisiertes Bild **.
Die Morphologiekonvertierung (Erweiterung) wird durchgeführt, um Bildrauschen zu entfernen.
Abhängig von der Größe des Kernels (diesmal 5x5) ändern sich alle Pixel nahe der Objektgrenze von Schwarz (0) zu Weiß (1) und verschwinden. Wenn auch nur ein Pixel mit einem Pixelwert von "1" im Kernel enthalten ist, ist der Pixelwert des Aufmerksamkeitspixels des Ausgabebildes "1".
#Kernel-Einstellungen
kernel = np.ones((5,5),np.uint8)
#Morphologiekonvertierung (Erweiterung)
th_dilation = cv2.dilate(th,kernel,iterations = 1)
Vor der Morphologiekonvertierung (** th **)
Nach der Morphologiekonvertierung (** th_dilation **)
Der schwarze Bereich innerhalb der Zelle könnte in einen weißen Bereich umgewandelt werden.
Die Kontur wird basierend auf dem Bild extrahiert, aus dem durch Morphologiekonvertierung Rauschen entfernt wurde.
Verwenden Sie die Funktion ** findContours () **, um Konturen zu extrahieren.
** findContours () ** Das erste Argument der Funktion ist das Bild, das für die Konturextraktion verwendet wird. Das zweite Argument gibt den Extraktionsmodus an, und das dritte Argument gibt die Konturnäherungsmethode an.
** findContours () ** Der Rückgabewert der Funktion contours
enthält die Koordinatendaten jeder Kontur im Numpy-Array-Format.
Verwenden Sie Konturen
, um mit der Funktion ** drawContours () ** Konturen auf dem Originalbild zu zeichnen.
Geben Sie beim Zeichnen des gesamten Umrisses das dritte Argument der Funktion ** drawContours () ** auf -1
an.
[Gliederung: Erster Schritt](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_contours/py_contours_begin/py_contours_begin.html#contours-getting- gestartet)
#Konturextraktion
contours, hierarchy = cv2.findContours(th_dilation,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_NONE)
#Zeichnen Sie eine Kontur auf das Originalbild
img_contour = cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
Holen Sie sich die Gesamtzahl der Pixel mit .size
.
Ermitteln Sie die Anzahl der Pixel im weißen Bereich, dh im Zellenbereich, mit der Funktion ** countNonZero () **.
Gesamtzahl der Pixel - Berechnen Sie den weißen Bereich und ermitteln Sie die Anzahl der Pixel im schwarzen Bereich (andere Bereiche als Zellen).
Schließlich wird jedes Verhältnis angezeigt.
#Gesamtzahl der Pixel
whole_area = th_dilation.size
#Anzahl der Pixel im weißen Teil
white_area = cv2.countNonZero(th_dilation)
#Anzahl der Pixel im schwarzen Teil
black_area = whole_area - white_area
#Zeigen Sie jeden Prozentsatz an
print('White_Area =' + str(white_area / whole_area * 100) + ' %')
print('Black_Area =' + str(black_area / whole_area * 100) + ' %')
Ergebnis
White_Area =26.266264121542658 %
Black_Area =73.73373587845734 %
Das Ergebnis war, dass die Zellkonfluenz etwa 30% betrug.
Schließlich werden das Originalbild mit der hinzugefügten Kontur und das für die Konturextraktion verwendete Bild angezeigt.
#Bildschirm
cv2.imshow('img', img)
cv2.imshow('th_dilation', th_dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ergebnis
Originalbild + Kontur (** img **)
Bild zur Konturextraktion (** th_dilation **)
#Bibliothek
import cv2
import numpy as np
#Farbbilder laden
img = cv2.imread('cell.jpg', 1)
#Graustufen
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Binarisierung von Otsu
ret,th = cv2.threshold(img_gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#Kernel-Einstellungen
kernel = np.ones((5,5),np.uint8)
#Morphologiekonvertierung (Erweiterung)
th_dilation = cv2.dilate(th,kernel,iterations = 1)
#Konturextraktion
contours, hierarchy = cv2.findContours(th_dilation,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_NONE)
#Zeichnen Sie eine Kontur auf das Originalbild
img_contour = cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
#Gesamtzahl der Pixel
whole_area = th_dilation.size
#Anzahl der Pixel im weißen Bereich
white_area = cv2.countNonZero(th_dilation)
#Anzahl der Pixel im schwarzen Bereich
black_area = whole_area - white_area
#Zeigen Sie jeden Prozentsatz an
print('White_Area =' + str(white_area / whole_area * 100) + ' %')
print('Black_Area =' + str(black_area / whole_area * 100) + ' %')
#Bildschirm
cv2.imshow('img', img)
cv2.imshow('th_dilation', th_dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()
Recommended Posts