Analysera kornstorlek i Python med Watershed
Table of Contents:
- Introduktion
- Vad är grain size distribution analysis?
- Tillämpningar av grain size distribution analysis
3.1 Metallurgi och materialvetenskap
3.2 Geologi
3.3 Biologi
- Importera bilder och konvertera till gråskala
- Definiera konverteringsförhållande pixel till mikron
- Tröskelvärde bildsegmentering
- Använda morfologiska operationer för att förbättra bildsegmenteringen
7.1 Erosion
7.2 Dilation
7.3 Öppning
- Skapa etikettbild för att identifiera individuella korn
- Användning av regionprops-funktionen för att mäta kornens egenskaper
9.1 Area
9.2 Diameter
9.3 Orientering
9.4 Intensiteter
- Exportera resultaten till en CSV-fil
- Konceptet Watershed-segmentering för bättre kornsegmentering
11.1 Vad är Watershed-segmentering?
11.2 Tillämpning av Watershed-segmentering i Python
- Avslutning
- Referenser
Introduktion
Välkommen till denna handledning om analys av kornstorleksfördelning med hjälp av Python. I den här handledningen kommer vi att lära oss hur man analyserar och mäter kornstorlekar i ett provmaterial genom att använda digital bildbehandlingstekniker. Vi kommer att gå igenom allt från att importera bilder till att exportera resultatet till en CSV-fil. Dessutom kommer vi att utforska konceptet watershed-segmentering för att förbättra kornsegmenteringen och få mer exakta mätresultat.
Vad är grain size distribution analysis?
Analys av kornstorleksfördelning är en viktig process inom olika vetenskapliga discipliner, som metallurgi, geologi och biologi. Det innebär att studera och karakterisera fördelningen av kornstorlekar i ett materialprov. Genom att mäta kornstorlekar och analysera deras fördelning kan vi dra slutsatser om materialens struktur, egenskaper och bearbetningsmöjligheter.
Tillämpningar av grain size distribution analysis
3.1 Metallurgi och materialvetenskap
I metallurgi och materialvetenskap används analys av kornstorleksfördelning för att utvärdera mikrostrukturen hos metalliska material. Genom att studera kornstorleksfördelningen kan metallurgister och materialforskare dra slutsatser om mekaniska egenskaper, korrosionsbeständighet och bearbetbarhet hos olika typer av metaller och legeringar. Detta information är värdefullt vid utvecklingen av nya material och tillverkningsprocesser.
3.2 Geologi
Inom geologi används analys av kornstorleksfördelning för att studera sedimentära bergarter och jordprover. Genom att analysera kornstorlekar kan geologer bestämma den geologiska formationen av ett område, bedöma transportprocesser och bedöma sedimentens ursprung och utsättningsmiljö. Detta information kan vara till nytta för att förstå jordens geologiska historia och förutsättningarna för naturresurser.
3.3 Biologi
Inom biologi kan analys av kornstorleksfördelning tillämpas för att studera celler och andra biologiska strukturer. Genom att mäta kornstorlekar och fördelningen av dem kan biologer analysera cellstrukturer, växtmönster och andra biologiska fenomen. Detta kan vara till hjälp vid studiet av cellbiologi, växtfysiologi och mikroskopisk biologi.
Importera bilder och konvertera till gråskala
För att kunna analysera kornstorleksfördelning i Python måste vi först importera bilderna och konvertera dem till gråskala. Detta kan göras med hjälp av biblioteket OpenCV. Gråskalabilder är enklare att hantera och innehåller endast en gråskala eller intensitetskanal istället för tre färgkanaler.
import cv2
# Importera bilden som färgbild
image = cv2.imread("bild.jpg")
# Konvertera bilden till gråskala
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Definiera konverteringsförhållande pixel till mikron
För att kunna rapportera kornstorlekar och andra mätvärden i mikron istället för pixlar måste vi definiera en omvandlingsfaktor för konvertering av pixelstorlekar till mikronstorlekar. Denna omvandlingsfaktor kan vara specifik för varje bild eller kan vara en genomsnittlig faktor baserad på kameraupplösningen eller mikroskopets förstoring.
pixels_to_micron = 0.5
Tröskelvärde bildsegmentering
För att separera kornen från bakgrunden måste vi använda tröskelvärde bildsegmenteringstekniker. Detta innebär att vi väljer en tröskelvärdesnivå och tilldelar allt under tröskelvärdet till bakgrunden och allt över tröskelvärdet till kornen. Detta kan göras med hjälp av OpenCV-funktionen cv2.threshold()
.
_, thresholded_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
Använda morfologiska operationer för att förbättra bildsegmenteringen
För att förbättra resultatet av bildsegmenteringen kan vi använda olika morfologiska operationer såsom erosion, dilation och öppna.
7.1 Erosion
Erosion är en morfologisk operation som minskar storleken på objektet genom att ta bort pixlar i objektets gränser. Detta kan vara användbart för att ta bort små brusobjekt eller anslutande pixlar mellan kornen.
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
eroded_image = cv2.erode(thresholded_image, kernel, iterations=1)
7.2 Dilation
Dilation är en morfologisk operation som ökar storleken på objektet genom att lägga till pixlar till objektets gränser. Detta kan användas för att öka storleken på kornen eller fylla i små hålrum mellan dem.
dilated_image = cv2.dilate(eroded_image, kernel, iterations=1)
7.3 Öppning
Öppning är en kombination av erosion och dilation som kan användas för att ta bort små objekt samtidigt som de bibehåller formen på större objekt. Detta kan användas för att förbättra kornsegmenteringen och ta bort brusobjekt eller små områden som inte är av intresse.
opened_image = cv2.morphologyEx(thresholded_image, cv2.MORPH_OPEN, kernel)
Skapa etikettbild för att identifiera individuella korn
För att kunna utföra mätningar på individuella korn måste vi skapa en etikettbild där varje korn är tilldelat en unik etikett. Detta kan göras med hjälp av OpenCV-funktionen cv2.connectedComponents()
.
_, labels = cv2.connectedComponents(dilated_image)
Användning av regionprops-funktionen för att mäta kornens egenskaper
För att mäta kornens egenskaper, som area, diameter, orientering och intensiteter, kan vi använda OpenCV-funktionen cv2.regionprops()
. Denna funktion returnerar en lista med objekt som representerar individuella korn och deras egenskaper.
grain_properties = cv2.regionprops(labels)
for grain in grain_properties:
area = grain.area * pixels_to_micron ** 2
diameter = grain.equivalent_diameter * pixels_to_micron
orientation = grain.orientation * 57.2958
intensities = grain.intensity_image
# Perform measurements and analysis
Exportera resultaten till en CSV-fil
För att spara mätresultaten kan vi exportera dem till en CSV-fil. Vi kan öppna en fil i skrivläge och skriva ut mätvärdena rad för rad i filen. Därefter kan filen importeras till programvara för dataanalys eller visualisering.
import csv
with open("measurements.csv", "w", newline="") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(["Grain Number", "Area", "Diameter", "Orientation", "Intensities"])
for i, grain in enumerate(grain_properties, start=1):
area = grain.area * pixels_to_micron ** 2
diameter = grain.equivalent_diameter * pixels_to_micron
orientation = grain.orientation * 57.2958
intensities = grain.intensity_image.mean()
writer.writerow([i, area, diameter, orientation, intensities])
Konceptet Watershed-segmentering för bättre kornsegmentering
11.1 Vad är Watershed-segmentering?
Watershed-segmentering är en avancerad bildsegmenteringsteknik som används för att separera objekt eller regioner med otydliga eller sammanhängande gränser. Det är baserat på konceptet av vattenavskiljning i geografiska områden där vatten flyter ner till olika platser beroende på topografin och landskapet. På liknande sätt kan Watershed-segmentering användas för att skapa ett markant och tydligt gränsområde mellan olika objekt eller regioner i en bild.
11.2 Tillämpning av Watershed-segmentering i Python
För att implementera Watershed-segmentering i Python kan vi använda OpenCV-funktionen cv2.watershed()
. Först måste vi skapa en markeringsbild där vi markerar de områden som vi vill separera och definiera som vattenavdelningar. Markeringsbilderna kan ha olika värden för olika regioner, till exempel kan vi tilldela -1 för gränser mellan regioner, 0 för bakgrund och positiva värden för individuella regioner. Därefter kan vi använda Watershed-segmentering för att tilldela en unik vattenavdelning till varje region och separera dem tydligt.
import numpy as np
# Skapa en markeringsbild
marker_image = np.zeros_like(gray_image, dtype=np.int32)
marker_image[dilated_image == 255] = -1
# Kör Watershed-segmentering
markers = cv2.watershed(image, marker_image)
# Skapa en färgkodad bild av segmenteringen
from matplotlib import pyplot as plt
segmented_image = np.zeros_like(image)
segmented_image[markers == -1] = [0, 255, 255] # Gul färg för gränser
segmented_image[markers != -1] = [255, 255, 255] # Vit färg för korn
plt.imshow(segmented_image)
plt.axis('off')
plt.show()
Avslutning
I denna handledning har vi lärt oss grunderna i analys av kornstorleksfördelning med hjälp av Python och OpenCV. Vi har täckt steg-för-steg processen för att importera bilder, konvertera till gråskala, utföra bildsegmentering, mäta kornens egenskaper och exportera resultatet till en CSV-fil. Vi har också introducerat konceptet watershed-segmentering för att förbättra kornsegmenteringen och skapa tydliga gränser mellan regioner. Förhoppningsvis har denna handledning gett dig en grundläggande förståelse för att utföra kornstorleksanalys i Python och öppnat upp möjligheter för ytterligare utforskning och tillämpningar.
Referenser
- OpenCV Documentation: https://docs.opencv.org/
- Python Documentation: https://docs.python.org/
- Trini's Python Tutorial Videos: Youtube Channel
- Watershed Segmentation: Wikipedia
- Scipy: https://www.scipy.org/