Ein Memorandum von Funktionen der Bildverarbeitungsbibliothek, die häufig in Python verwendet werden. Wird von Zeit zu Zeit aktualisiert.
Es wird davon ausgegangen, dass die folgenden Bibliotheken importiert werden Library Version opencv @3.2.0_1+contrib+python27 scikit-image @0.12.3_2 scipy @0.19.0_0+gfortran
import numpy as np
import copy
import cv2 as cv
import skimage
import skimage.io as sk
import skimage.filters as fil
import skimage.filters.rank as rank
import skimage.morphology as mor
import skimage.transform as tr
import scipy.misc as sp
import scipy.ndimage as ndi
Read Image Vergleich nach Bibliothek zum Laden von Bildern
scikit-image
img = sk.imread(filename,as_grey=False,plugin=None,flatten=None)
OpenCV
img = cv.imread((filename[, flags])
SciPy
img = sp.imread(name, flatten=False, mode=None)
Binalization
Grundsätzlich wird nur Otsu zur Binärisierung von Bildern verwendet, aber je nach Verwendungszweck werden auch andere Methoden verwendet, also als Referenz.
scikit-image
#Finden Sie den Schwellenwert für jede Binärisierungsmethode
thrOtsu = fil.threshold_otsu(img)
thrli = fil.threshold_li(img)
thrIso = fil.threshold_isodata(img)
thrYen = fil.threshold_yen(img)
#Binarisierung
thrImg = ((thrOtsu < img) * 255).astype(np.uint8)
OpenCV
Wenn Sie es überhaupt nicht verwenden, aber OpenCV konsequent verwenden, z. B. Lesen.
thr, thrImg = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
Filtering
Es wird hauptsächlich zur Rauschentfernung verwendet, die als Vorverarbeitung der Bildverarbeitung durchgeführt wird. Zur Rauschunterdrückung müssen je nach Art des Rauschens und den Eigenschaften des Bildes verschiedene Filter verwendet werden. Daher wird die Konfiguration hier für jede Art der Filterung zusammengefasst, damit sie ordnungsgemäß verwendet werden kann.
Gaussian Fitering Falten Sie mit einem gewichteten Kernel, der einer Gaußschen Verteilung folgt. Wird zur allgemeinen Bildglättung verwendet.
#Verteilung der Normalverteilung
sigma = 1
#Kernelgröße
ksize = (3, 3)
# OpenCV
gauImg = cv.GaussianBlur(img, ksize=ksize, sigmaX=sigma)
# SciPy
gauImg = ndi.gaussian_filter(img, sigma=sigma)
# scikit-image
#Wenn img ein Float-Typ ist-1~Muss auf 1 normalisiert werden
gauImg = fil.gaussian_filter(img, sigma=sigma)
Mean Filtering
Mit einem Kernel mit durchschnittlichem Gewicht einklappen. Es wird verwendet, um feines Rauschen wie gleichmäßiges Rauschen zu entfernen.
#Kernelgröße
ksize = (5, 5)
#Gewichtskern mit einem Radius von 20 Pixel
selem = disk(20)
# OpenCV
meanImg = cv.blur(img, ksize=ksize)
# scikit-image
#Wenn img ein Float-Typ ist-1~Muss auf 1 normalisiert werden
meanImg = rank.mean(img, selem=selem)
Median Filtering
Medianfilterung. Es wird verwendet, um spitzenartige Geräusche wie Sesamsalzgeräusche zu entfernen.
#Kernelgröße
ksize = 3
#Gewichtskern mit einem Radius von 20 Pixel
selem = disk(20)
# OpenCV
medImg = cv.medianBlur(img, ksize=ksize)
# scikit-learn
#Wenn img ein Float-Typ ist-1~Muss auf 1 normalisiert werden
medImg = rank.median(img, selem=selem)
Bilateral Filtering
Da die Gaußsche Filterung sogar charakteristische Pixel wie Kanten glättet, wird dies in Abhängigkeit von der nachfolgenden Bildverarbeitung zu einem Problem. Daher kann die bilaterale Filterung eine Glättung durchführen, während die Kanten erhalten bleiben. Der entscheidende Unterschied zur Gaußschen Filterung ist nicht nur die Gaußsche Verteilung bezüglich der Abstandsdifferenz von der Mitte des Kernels, sondern auch der gewichtete Kernel gemäß der Gaußschen Verteilung bezüglich der Helligkeitsdifferenz vom mittleren Helligkeitswert.
#Kernelgröße
d = 5
#Streuung des Helligkeitswertes Gaußsche Verteilung
sigmaColor = 1
#Streuung der Distanzdifferenz Gaußsche Verteilung
sigmaSpace = 1
# OpenCV
biImage = cv.bilateralFilter(img, d=d, sigmaColor=sigmaColor, sigmaSpace=sigmaSpace)
Morphological Operation
Es führt hauptsächlich eine Verarbeitung durch, die die nachfolgende Bildverarbeitung stark beeinflusst, z. B. das Entfernen von Binärbildern durch Graustufen und Rauschhintergrund sowie das Extrahieren von Merkmalen. In diesem Abschnitt werden auch die einzelnen Morphologie-Arithmetikprozesse zusammengefasst. Persönlich denke ich, dass es besser wäre, nur Dilatation und Erosion aus der Bibliothek auszuleihen und Öffnungs- und Schließfunktionen auf verschiedene Arten aufzubauen.
Dilation
Der Prozess des Erweiterns eines Objekts in einem Binärbild.
#Kernelgröße
kernel = np.ones((3,3),np.uint8)
#Anzahl von Versuchen
iterations = 2
# OpenCV
dilImg = cv.dilate(thrImg, kernel=kernel, iterations=iterations)
# scikit-image
dilImg = mor.dilation(thrImg, selem=kernel)
Erosion
Der Vorgang des Verkleinerns eines binären Bildobjekts.
# OpenCV
eroImg = cv.erode(thrImg, kernel=kernel, iterations=iterations)
# scikit-image
eroImg = mor.erosion(thrImg, selem=kernel)
Opening
Es wird verwendet, wenn Sie kleine Geräusche entfernen möchten. Die Dilatation wird nach mehreren Erosionen gleich oft durchgeführt. Zu diesem Zeitpunkt hängt die Häufigkeit jeder Verarbeitung von der Größe des zu entfernenden Rauschens ab.
# OpenCV
openImg = cv.morphologyEx(thrImg, cv.MORPH_OPEN, kernel=kernel, iterations=iterations)
# scikit-image
openImg = mor.opening(thrImg, selem=kernel)
Closing
Es wird verwendet, um Löcher zu füllen, die auftreten, wenn ein Objekt aufgrund des Einflusses von Rauschen und der Art des Bildes nicht sauber binärisiert werden kann. Die Erosion wird nach mehreren Dilatationen gleich oft durchgeführt. Zu diesem Zeitpunkt hängt die Anzahl der Verarbeitungen von der Größe des zu füllenden Lochs ab.
# OpenCV
closeImg = cv.morphologyEx(thrImg, cv.MORPH_CLOSE, kernel=kernel, iterations=iterations)
# scikit-image
closeImg = mor.closing(thrImg)
White Top-Hat
Es wird verwendet, um kleine Merkmalsmuster zu extrahieren, die im Hintergrund vorhanden waren, indem der Unterschied zwischen dem geöffneten Bild und dem Originalbild extrahiert wird.
# OpenCV
wthImg = cv.morphologyEx(thrImg, cv.MORPH_TOPHAT, kernel=kernel, iterations=iterations)
# scikit-image
wthImg = mor.white_tophat(thrImg)
Black Top-Hat
Es wird verwendet, um kleine Merkmalsmuster zu extrahieren, die im Objekt vorhanden waren, indem die Differenz zwischen dem geschlossenen Bild und dem Originalbild berechnet wird.
# OpenCV
bthImg = cv.morphologyEx(thrImg, cv.MORPH_BLACKHAT, kernel=kernel, iterations=iterations)
# scikit-image
bthImg = mor.black_tophat(thrImg)
Labeling
binär Ein Prozess zum Beschriften jedes Segmentbereichs in einem Bild. Es wird hauptsächlich zur quantitativen Analyse nach der Binarisierung (Suchbereich, Schwerpunktkoordinaten usw.) verwendet. Es werden nur zweidimensionale Bilder unterstützt, aber ich habe versucht, es zu verwenden, da OpenCV eine praktische Funktion bietet.
#Anzahl der Etiketten(nlabel)Und Beschriftung Bild(labImg)nur
nlabel, labImg = cv.connectedComponents(img)
#Begrenzungsrahmen zusätzlich zur Oberseite+Bereich(stats)Und Schwerpunktkoordinaten(centroids)Auch bekommen
nlabel, labImg, stats, centroids = cv.connectedComponentsWithStats(img)
Statistiken: Liste [x, y, Breite, Höhe, Fläche] für jedes Etikett Schwerpunkt: Speichert auch die Schwerpunktkoordinaten [x, y] in einer Liste, die der Beschriftung entspricht
Das Ergebnis der tatsächlichen Verwendung für die folgenden Bilder wird angezeigt.
img = sk.imread('unko.png')
gimg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
thrOtsu = fil.threshold_otsu(gimg)
thrImg = ((thrOtsu > img) * 255).astype(np.uint8)
nlabel, labelImg, stats, centroids = cv.connectedComponentsWithStats(thrImg)
colors = []
for n in range(1, nlabel):
#Ernten Sie jede Kacke
tmpImg = img[stats[n][1]:stats[n][1]+stats[n][3], stats[n][0]:stats[n][0]+stats[n][2]] sk.imsave('unko' + str(n) + '.png', tmpImg)
color.append(np.array([random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)]))
leny, lenx = labelImg.shape
colorImg = np.zeros((leny, lenx, 3)).astype(np.uint8)
for x in range(lenx):
for y in range(leny):
for n in range(1, nlabel):
#Gefärbt nach dem Etikett jedes Poop-Bereichs
if labelImg[y][x] == n:
colorImg[y][x] = color[n-1]
sk.imsave('unko_color.png', colorImg)
Das Ergebnis des Zuschneidens und Speicherns jedes Poops aus den Statistiken, die durch die Beschriftungsfunktion erhalten wurden
Das Ergebnis der Farbbeschriftung jedes Poop-Bereichs
Das ist praktisch! Mit Scheiße bedeckt!
Rotation of Image
Zusammenfassung der Funktionen zum Drehen von Bildern. Dieses Mal werde ich nur den Fall einer Drehung von der Bildmitte zusammenfassen.
#Drehwinkel(Gegen den Uhrzeigersinn)
angle = 90
# Scipy
rotImg = ndi.interpolation.rotate(img, angle=angle)
# OpenCV
imsize = img.shape
rotMat = cv.getRotationMatrix2D(tuple(np.array(imsize)/2), angle, scale=1.0)
rotImg = cv.warpAffine(img, rotMat, imsize)
Es gibt auch eine Funktion, die das Bild umdreht.
flipCode = 0
# OpenCV
flipImg = cv.flip(img, flipCode=flipCode)
Das Argument flipCode ist ein Parameter, der die Flip-Richtung steuert.
Interpolation
Eine Zusammenfassung der Funktionen, die eine Bildinterpolation durchführen. Es gibt Nearest, Bilinear, Bicubic usw. als Bildinterpolationsmethoden, und sie werden je nach Bild und Zweck richtig verwendet.
#Interpolationsgröße
ipsize = (200, 200)
# OpneCV
#Interpolationsmethode
cv.INTER_NEAREST # Nearest
cv.INTER_LINEAR # Bilinear
cv.INTER_CUBIC # Bicubic
ipImg = cv.resize(img, ipsize, metLinear)
# scikit-image
#Interpolationsmethode(Biquintic etc. sind ebenfalls erhältlich)
order = 0 # Nearest
order = 1 # Bilinear (default)
order = 3 # Bicubic
#bewahren, wenn img float ist_Bereich muss auf True gesetzt sein
ipImg = tr.resize(img, ipsize, order = 3, preserve_range = True)
Extract Feature
Extrahieren Sie Features wie Kanten im Bild. Neben SIFT, einem Merkmalsextraktionsalgorithmus, wird in diesem Abschnitt auch die Kantenextraktion mit einem Differentialfilter zusammengefasst.
SIFT
SIFT (Scale-Invariant Feature Transform) ist einer der am häufigsten verwendeten Algorithmen zur Merkmalsextraktion und extrahiert Merkmale, die robust gegenüber Skalierungs- und Positionsänderungen sind. Es wird auch hauptsächlich im Bereich der Bilderkennung bei der Mustererkennung und beim maschinellen Lernen eingesetzt.
Die von OpenCV bereitgestellten Funktionen sind seit 3.0 im Contrib-Modul gespeichert und müssen daher bei der Installation zur Variante hinzugefügt werden. Es gibt eine andere Möglichkeit, dies in Versionen bis 2.4 zu tun. Dieses Mal werden wir es jedoch unter der Annahme zusammenfassen, dass es sich um OpenCV 3.0 oder höher handelt.
#Merkmalsextraktion
det = cv.xfeatures2d.SIFT_create()
kp = det.detect(img) #img ist Lebenslauf_8U(uint8)
#Zum Bild hinzufügen
siftImg = cv.drawKeypoints(img, kp, None)
SURF
SURF (Speeded-Up Robust Features) ist ein Algorithmus, der die Verarbeitungsgeschwindigkeit erhöht, anstatt die Anzahl der Dimensionen des Vektors zu verringern, der die Merkmalsmenge im SIFT-Algorithmus darstellt.
#Merkmalsextraktion
det = cv.xfeatures2d.SURF_create()
kp = det.detect(img) #img ist Lebenslauf_8U(uint8)
#Zum Bild hinzufügen
surfImg = cv.drawKeypoints(img, kp, None)
Prewitt Filtering
Eine Filtertechnik zum Erfassen des Helligkeitsgradienten in einem Bild. Das Konzept des Prewitt-Filters besteht darin, dass bei der Berechnung des Gradienten in einer bestimmten Richtung im Kernel eine Glättung in dieser Richtung und in horizontaler Richtung durchgeführt wird und anschließend eine Differenzierung durchgeführt wird.
# SciPy
preImg = ndi.filters.prewitt(img)
Sobel Filtering
Es ist fast das gleiche Differentialfilter wie das Prewitt-Filter, außer dass es in der Mitte des Kernels gewichtet wird. Persönlich hat der Sobel-Filter den Eindruck, dass die Kanten sauber entfernt werden können.
# SciPy
sobImg = ndi.filters.sobel(img)
Others
Downhill Filtering
Der Algorithmus zum Entfernen des Hintergrunds (BG). Den Inhalt finden Sie im Originalpapier [1].
# seed (Kriterien für Werte, die als BG betrachtet werden)Schaffung
seed = copy.deepcopy(img)
seed[1:-1, 1:-1] = img.min()
dilatedImg = mor.reconstruction(seed, img, method='dilation')
dhImg = copy.deepcopy(img - dilated)
Unabhängig davon, welche Bibliothek Sie in der Bildverarbeitung verwenden, ist es gefährlich, sie zu verwenden, ohne den Algorithmus zu verstehen. Daher halte ich es für wichtig, konsistent mit einer vertrauten Bibliothek zu codieren, die mit dem Inhalt vertraut ist. Da die von mir durchgeführte Bildanalyse hauptsächlich auf Graustufenbilder abzielt, bin ich nicht gut in der Bildverarbeitung in RGB-Bildern und konnte sie im Inhalt dieser Zeit nicht wiedergeben. In Zukunft möchte ich die Mehrkanal-Bildverarbeitung mit Blick auf RGB-Bilder lernen. Der Inhalt wird von Zeit zu Zeit aktualisiert.
[1] Robinson, Kevin, and Paul F. Whelan. "Efficient morphological reconstruction: a downhill filter." Pattern Recognition Letters 25.15 (2004): 1759-1767.
Recommended Posts