[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren

Einführung

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.

Referenz-URL

Bild zu verwenden

MSC.jpg

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

Erforderliche Pakete

Laden Sie die ** OpenCV ** -Bibliothek für die Bildanalyse mit Python.

Laden Sie auch ** NumPy **.

#Bibliothek
import cv2
import numpy as np

Laden von Bildern und Graustufen

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

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.

Bildschwellenwertverarbeitung

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

Morphologiekonvertierung (Erweiterung)

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

Morphologische Konvertierung

#Kernel-Einstellungen
kernel = np.ones((5,5),np.uint8)

#Morphologiekonvertierung (Erweiterung)
th_dilation = cv2.dilate(th,kernel,iterations = 1)

Vor der Morphologiekonvertierung (** th **) th.jpg

Nach der Morphologiekonvertierung (** th_dilation **) th_dilation.jpg

Der schwarze Bereich innerhalb der Zelle könnte in einen weißen Bereich umgewandelt werden.

Konturextraktion

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)

Schwarz-Weiß-Flächenberechnung

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.

Bildschirm

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 **) img.jpg

Bild zur Konturextraktion (** th_dilation **) th_dilation.jpg

Endgültiges Skript

#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

[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
Ich habe versucht, Bilder von CIFAR-10 mit Keras-Bilderkennung zu erkennen.
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Bildbearbeitung mit Python OpenCV
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, GrabCut von OpenCV zu verwenden
Finden Sie Bildähnlichkeit mit Python + OpenCV
Einführung in die Bildanalyse opencv python
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Grundlegendes Studium von OpenCV mit Python
Ich habe versucht, Movidius NCS mit Python von Raspberry Pi3 auszuführen
Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren
[Python] Mit OpenCV können Sie problemlos Bilddateien mit Seriennummern lesen
Bildverarbeitung mit Python (ich habe versucht, es in 0 und 1 Mosaikkunst zu binarisieren)
Grundlagen der binärisierten Bildverarbeitung durch Python
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Ich habe eine multiple Regressionsanalyse mit Polypoly-Regression versucht
Ich habe versucht, Faktoren mit Titanic-Daten zu analysieren!
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Bildverarbeitung mit Python & OpenCV [Tonkurve]
Bildaufnahme von der Kamera mit Python + OpenCV
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Bildverarbeitung mit Python 100 Knock # 4 Otsu-Binarisierung (Diskriminierungsanalyse-Methode)
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Analyse des Röntgenmikrotomographiebildes durch Python
Ich habe mit Jupyter eine einfache Bilderkennung versucht
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Leichte Bildverarbeitung mit Python x OpenCV
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, fMRI-Daten mit Python zu analysieren (Einführung in die Dekodierung von Gehirninformationen)
Ich habe verschiedene Versionen der Python + OpenCV + FFmpeg-Umgebung auf dem Mac ausprobiert