Analyse des Röntgenmikrotomographiebildes durch Python

Einführung

In diesem Artikel werde ich erklären, wie das durch Röntgenmikrotomographie mit Python erhaltene Querschnittsbild analysiert wird. (Keine Rekonstruktion aus einem übertragenen Bild)

Speziell auf das μ-CT-Querschnittsbild von Carbonatgestein abzielen, wie unten gezeigt ezgif.com-optimize.gif

Führen Sie die Segmentierung unter Berücksichtigung der dreidimensionalen Konnektivität wie unten gezeigt durch. stk_0001_labbeled_rock.gif

Schließlich erhalten wir ein solches dreidimensionales Bild. Volume_Viewer_1.png

Was ist Röntgenmikrotomographie?

Wahrscheinlich kennen 99% der Leute, die Qiita beobachten, diese Methode nicht, deshalb werde ich sie kurz erklären. Sie alle kennen die folgenden Geräte.

636863294260796061IE.png (Das Bild stammt von https://jp.medical.canon/general/CT_Comparison)

Dieses Gerät wird üblicherweise als CT bezeichnet. CT ist eine Abkürzung für Computertomographie, ein Gerät, das den menschlichen Körper mit Röntgenstrahlen bestrahlt, um ein Querschnittsbild zu erhalten. Dies ist sehr praktisch, da Sie ein Bild erhalten können, das wie ein Stück des menschlichen Körpers aussieht, und die innere Struktur sehen können, die von außen nicht sichtbar ist.

1280px-Computed_tomography_of_human_brain_-_large-1.png (Bild von https://en.wikipedia.org/wiki/CT_scan)

Natürlich gibt es eine andere Nachfrage als den menschlichen Körper nach diesem "das Innere sehen wollen". Beispielsweise ist von außen nicht bekannt, wie viele Hohlräume (Nester) sich im Gussstück befinden, aber die Hohlräume wirken sich stark auf die Eigenschaften der Gussteile aus, sodass diese Inspektionsmethode nützlich ist.

In industriellen Anwendungen müssen im Gegensatz zu medizinischen Anwendungen Strahlenschäden nicht berücksichtigt werden, und leistungsstarke Röntgenstrahlen können konvergiert und verwendet werden, sodass hochauflösende Querschnittsbilder erhalten werden können. Eine solche Technik wird als Röntgenmikrotomographie bezeichnet.

Die Röntgentomographie ist eine sehr bequeme Technik. Grundsätzlich erhalten Sie jedoch eine Reihe von Querschnittsbildern, wie oben gezeigt. Wenn Sie beispielsweise die dreidimensionale Struktur eines Hohlraums analysieren möchten, müssen Sie von hier aus eine spezielle Software verwenden oder ein eigenes Programm schreiben. Dieses Mal werde ich dies in Python tun.

Analysedaten herunterladen

Dieses Mal werden wir den Datensatz von Röntgentomographiebildern von Carbonatgesteinen verwenden, der in den folgenden Abhandlungen veröffentlicht wurde.

Pak, T., Archilha, N., Mantovani, I. et al. An X-ray computed micro-tomography dataset for oil removal from carbonate porous media. Sci Data 6, 190004 (2019). https://doi.org/10.1038/sdata.2019.4

Da die Menge der frei verfügbaren Röntgentomographiedaten überraschend gering ist, bin ich sehr dankbar, dass sie in einem Open-Access-Journal wie diesem veröffentlicht werden. Bilddaten können von der folgenden Site heruntergeladen werden.

Pak, Tannaz; Archilha, Nathaly Lopes; Mantovani, Iara Frangiotti; Moreira, Anderson Camargo; Butler, Ian B. (2019): X-ray computed micro-tomography dataset for nanoparticle-based oil removal from porous media. figshare. Collection. https://doi.org/10.6084/m9.figshare.c.4190738.v1

Dieses Mal habe ich "Rock-Reconstructed.raw", das auf der obigen Site veröffentlicht wurde, zur Analyse verwendet. Es ist ungefähr 845 MB (leichter als CT-Bilddaten).

Ich denke, die Erweiterung ".raw" ist eine unbekannte Erweiterung, aber wenn Sie ImageJ verwenden, können Sie sie als Bildsequenz importieren. Wählen Sie eine Datei mit Datei => Importieren => Roh und stellen Sie sie wie folgt ein. (Details werden in diesem Artikel erläutert. Überprüfen Sie daher, ob Sie ein anderes Bild verwenden möchten.)

コメント 2020-02-27 225010.png

Hoffentlich kann das Bild wie folgt gelesen werden.

コメント 2020-02-27 225158.png

Speichern Sie es anschließend in einem geeigneten Ordner mit Datei => Speichern unter => Bildsequenz.

Bildanalyse mit OpenCV

Die durch Röntgenmikrotomographie erhaltenen Daten können jetzt als eine Reihe von Bildern gespeichert werden. Als nächstes werden wir OpenCV verwenden, um Rauschen zu entfernen und zu binarisieren.

Dieses Mal werde ich nur die Bildmitte analysieren.

import numpy as np
import matplotlib.pyplot as plt
import cv2
import glob

#Bildpfad laden
path = glob.glob('./Rock-reconstructed/*.tif')

#Bilder laden
images = []
for n,i in enumerate(path):
    img = cv2.imread(i,0)
    images.append(img[100:400,100:400])

Ein Beispiel für das geladene Bild ist unten dargestellt. ダウンロード (9).png

Um ehrlich zu sein, es ist ein ziemlich schönes Bild, also brauche ich es nicht, aber ich werde versuchen, Rauschen zu entfernen. OpenCV verwenden Nicht lokal bedeutet Entrauschen.

# Non-Geräuschentfernung mit lokalen Mitteln
test = images[200]
dn_test = cv2.fastNlMeansDenoising(test,None,10,7,21)

Nachfolgend finden Sie einen Vergleich mit und ohne Rauschunterdrückung. ダウンロード (11)-1.png

Die Binarisierung mit OpenCV erfolgt wie folgt. Verwenden Sie die automatische Binärisierung von Otsu.

#Binarisieren Sie das Originalbild nach Otsus Methode
th,th_test = cv2.threshold(test,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

Der Vergleich mit und ohne Rauschunterdrückung sieht so aus. ダウンロード (11)-2.png

Da die kleinen Löcher verschwunden sind, frage ich mich, ob die Geräuschentfernung überflüssig ist ... Lass uns auf diese Zeit verzichten.

Wenden Sie diesen Vorgang gleichzeitig auf eine Reihe von Bildern an. Extrahieren Sie dann den Bereich mit cv2.findContours und schließen Sie die Hohlräume unter 10 Pixel aus.


th_denoised = [] #Fügen Sie Bilder in diese Liste ein

for i in images:

    #Geräuschreduzierung(Diesmal keine)
    #dn = cv2.fastNlMeansDenoising(i,None,10,7,21)
    #Binarisierung
    __,th_dn = cv2.threshold(i,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
    #Hohlraumbereichserkennung
    i__,cnts,__ = cv2.findContours(th_dn,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    #Extrahieren Sie nur den Hohlraumbereich von 25px oder mehr
    img = np.zeros_like(i).astype(np.uint8)
    for cnt in cnts:
        if(cv2.contourArea(cnt) > 10):
            img = cv2.drawContours(img, [cnt], 0, 255, -1)

    #Zur Liste hinzufügen
    th_denoised.append(img)

Beschriften des verketteten Bereichs mit cc3d

Sie haben jetzt einen hohlen Bereich im Querschnitt. Als nächstes werden wir die durchgehenden Hohlräume unter Berücksichtigung der dreidimensionalen Verbindungsstruktur kennzeichnen. Hierfür wird eine Bibliothek namens Connected-Components-3d verwendet.

connected-components-3d

Auf der obigen Seite finden Sie detaillierte Algorithmen. Sie können es mit pip wie folgt installieren.

pip install connected-components-3d

Die Beschriftung ist sehr einfach. Und es ist schnell.

import cc3d

connectivity = 6
th_denoised = np.array(th_denoised)
labels_out = cc3d.connected_components(th_denoised,connectivity=connectivity)

Die Konnektivität gibt die Anzahl der Proximity-Boxel an, die als derselbe Bereich betrachtet werden müssen. Zum Beispiel bezieht sich 6 auf ± 1 benachbarte Boxen in jeder der Richtungen x, y und z. Neben 6 können anscheinend 18, 26 ausgewählt werden (siehe Dokument).

Für jedes Pixel im Bild wird die Nummer, die der Bereichsbezeichnung entspricht, von 1 zugewiesen. (0 ist der Hintergrund) Daher kann zum Beispiel die Anzahl von Bereichen wie folgt erhalten werden.

#Geben Sie die Anzahl der Bereiche aus
numbers = np.max(labels_out) - 1
print(numbers)
>> 10001

Betrachten wir nun die Verteilung der Hohlraumgrößen. Es kann wie folgt analysiert werden.

#Berechnung des Hohlraumvolumens
areas = []
for num in range(np.max(labels_out)):
    count = np.count_nonzero(labels_out == num)
    areas.append(count)

#Anzeige der Verteilung
fig = plt.figure(figsize=(7,4),dpi=100,facecolor='white')
plt.hist(areas[1:], bins=np.logspace(0, 6, 20),rwidth=0.8)
plt.xscale('log')
plt.xlabel('size of vacancy (px)',fontsize=12)
plt.ylabel('Amounts',fontsize=12)
plt.show()

Das Ergebnis sieht so aus. Die X-Achse ist logarithmisch. ダウンロード (13).png

Offensichtlich kann die Verteilung des Hohlraumvolumens (Anzahl der Pixel) durch eine logarithmische Normalverteilung dargestellt werden. Um es in einer konkreten Größe darzustellen, benötigen Sie den Bildmaßstab und die Schnittbreitenwerte in z-Richtung.

Färben Sie den Hohlraumbereich mit RGB

Auf diese Weise erleichtert cc3d das Trennen und Analysieren von Hohlraumbereichen. Wenn Sie es jedoch als Bild betrachten, ist es einfacher, es zu sehen, indem Sie jeden Bereich mit RGB farblich kennzeichnen.

Hier ist ein Programm, das dies tut:

import random

##Wählen Sie zufällig die RGB-Farbe aus, die jedem Etikett entspricht
param_list = np.linspace(0,np.max(labels_out),np.max(labels_out)+1,dtype=np.uint16)
color_list = {}
for i in param_list:
    if(i != 0):
        color_list[str(i)] = [random.randint(0,255),
                                 random.randint(0,255),
                                 random.randint(0,255)]
    else:
        color_list[str(i)] = [0,0,0]

##Färben Sie jeden Hohlraumbereich
void_colored = []
for img in labels_out:
    h,w = img.shape
    img_flat = img.flatten()
    img_colored = np.zeros((img_flat.shape[0],3),dtype=np.uint8)
    non_zero_idx = np.where(img_flat != 0)
    for n in non_zero_idx[0]:
        img_colored[n] = color_list[str(img_flat[n])]
    void_colored.append(img_colored)
void_colored = np.array(void_colored)
void_colored = void_colored.reshape(void_colored.shape[0],h,w,3)

##Stellen Sie sicher, dass die Hohlräume richtig gefärbt sind
fig = plt.figure(figsize=(5,5),dpi=100,facecolor='white')
plt.imshow(void_colored[0])
plt.show()

#Bild speichern
for num,img in enumerate(void_colored):
    name = str(num).zfill(4)
    cv2.imwrite('./labbeled_rock/'+str(name)+'.png',img)

Die auf diese Weise gefärbten Bereiche sind wie folgt. ダウンロード (14).png

3D-Anzeige von ImageJ

Ich möchte Python für die 3D-Anzeige verwenden, finde aber keine gute Methode. Daher verwende ich ImageJ.

Importieren Sie das Bild des zuvor gespeicherten Farbbereichs mit ImageJ => File => Import => Image Sequence. Sie können 3D mit Plugins => Volume Viewer im geladenen Zustand anzeigen.

Da ich die Schnittbreite in Z-Richtung nicht kenne, ist das Ergebnis der 3D-Anzeige nach entsprechender Anpassung des Maßstabs wie folgt. Volume_Viewer_1.png

Auf den ersten Blick sehen Sie, dass die gut verbundenen Hohlraumbereiche mit derselben Farbe beschriftet sind. Es funktioniert!

Schließlich

In meiner Nähe befand sich eine Person, die eine Röntgentomographie-Analyse durchführte, und ich half ein wenig, also schrieb ich ein Memorandum darüber. Dieser Artikel ist ernsthaft wie ein Materialforscher.

Es ist so eine Nische, dass es nicht an Qiitas Leserschaft zu hängen scheint ... Wir freuen uns, Ihnen zu helfen!

Recommended Posts

Analyse des Röntgenmikrotomographiebildes durch Python
Graustufen durch Matrix-Reinventor der Python-Bildverarbeitung-
Beispiel einer dreidimensionalen Skelettanalyse von Python
Bildverarbeitung durch Matrix Basics & Contents-Reinventor der Python-Bildverarbeitung-
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Statische Analyse von Python-Programmen
Bildverarbeitung mit Python (Pillow)
Bilderfassung von Firefox mit Python
Erweiterung des Python-Wörterbuchs um Argumente
Verhalten von Python3 durch Sakuras Server
Einführung in die Bildanalyse opencv python
Geschichte der Potenznäherung von Python
Lineares Zeichnen mit einer Matrix-Originalforschung von einem Neuerfinder der Python-Bildverarbeitung-
Bildverarbeitung mit Python 100 Knock # 4 Otsu-Binarisierung (Diskriminierungsanalyse-Methode)
Erklärung des Produktionsoptimierungsmodells durch Python
Grundlagen der binärisierten Bildverarbeitung durch Python
Python: Grundlagen der Bilderkennung mit CNN
[Lernnotiz] Grundlagen des Unterrichts mit Python
Bedingte Verzweigung von Python mit Chemoinfomatik gelernt
Python: Anwendung der Bilderkennung mit CNN
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Zeichnen mit Matrix-Reinventor von Python Image Processing-
[Bildklassifizierung] Hundegesichtsanalyse
Faltungsfilterung durch Matrix-Reinventor der Python-Bildverarbeitung-
Zeitvariationsanalyse von Schwarzen Löchern mit Python
Python-Bildverarbeitung
Extrahieren Sie die dominante Bildfarbe durch k-Mittel-Clustering
Datenanalyse Python
[Verschiedene Bildanalysen mit Plotly] Dynamische Visualisierung mit Plotly [Python, Bild]
[Python] Vergleich der Theorie und Implementierung der Hauptkomponentenanalyse durch Python (PCA, Kernel PCA, 2DPCA)
Memorandum der Extraktion durch Python BS4-Anfrage
Affin-Konvertierung durch Matrix (Vergrößerung / Verkleinerung / Drehung / Scherung / Bewegung) - Erfinder der Python-Bildverarbeitung -
Python-Grundlagen ①
Bildverarbeitung? Die Geschichte, Python für zu starten
Richter Yosakoi Naruko nach Bildklassifikation von Tensorflow.
Super (kurze) Zusammenfassung der Bildklassifizierung durch ArcFace
Gründlicher Vergleich von drei morphologischen Python-Analysebibliotheken
Kopie von Python
Analyse der gemeinsamen Raumnutzung durch maschinelles Lernen
Emotionale Analyse umfangreicher Tweet-Daten durch NLTK
Bildverarbeitung mit Python 100 Knock # 11 Glättungsfilter (Durchschnittsfilter)
Statische Analyse von Python-Code mit GitLab CI
Aufgezeichnete Umgebung für die Datenanalyse mit Python
Bild der Schließung
[Python + OpenCV] Malen Sie den transparenten Teil des Bildes weiß
Einführung von Python
[Sprachverarbeitung 100 Schläge 2020] Zusammenfassung der Antwortbeispiele von Python
Extrahieren Sie die Tabelle der Bilddateien mit OneDrive & Python
Analyse von Finanzdaten durch Pandas und deren Visualisierung (2)
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 2
[Python] [Word] [python-docx] Einfache Analyse von Diff-Daten mit Python
Liste der Beiträge zur Optimierung durch Python to Docker
Zusammenfassung der Python-Artikel des Pharmaunternehmens Yukiya
[Python] Geben Sie den Bereich des Bildes durch Ziehen der Maus an
Holen Sie sich das Bild von "Suzu Hirose" von Google Bildersuche.
Fordern Sie die Hauptkomponentenanalyse von Textdaten mit Python heraus
Geschichte der Bildanalyse von PDF-Dateien und Datenextraktion
Liste des Python-Codes, der bei der Big-Data-Analyse verwendet wird