Bildverarbeitungssammlung in Python

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)

binalization.001.jpeg

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)

morphorogy2.001.jpeg

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. unko_img.002.png

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

unko_img.003.png

Das Ergebnis der Farbbeschriftung jedes Poop-Bereichs

unko_img.004.png

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)

interpolation.001.jpeg

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)

siftandsurf.001.jpeg

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)

presob.001.jpeg

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)

downhill.001.jpeg

Zusammenfassung

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.

Verweise

[1] Robinson, Kevin, and Paul F. Whelan. "Efficient morphological reconstruction: a downhill filter." Pattern Recognition Letters 25.15 (2004): 1759-1767.

Recommended Posts

Bildverarbeitungssammlung in Python
Python-Bildverarbeitung
Dateiverarbeitung in Python
Erste Python-Bildverarbeitung
Textverarbeitung mit Python
Bildformat in Python
Verarbeitung in Python beenden
Bildverarbeitung mit Python
Verarbeiten Sie Bilder in Python ganz einfach mit Pillow
Bildverarbeitung mit Python (Teil 2)
UTF8-Textverarbeitung mit Python
Asynchrone Verarbeitung (Threading) in Python
Bildverarbeitung mit Python (Teil 1)
Tweet mit Bild in Python
Bildverarbeitung mit Python (3)
Bildverarbeitung mit Python (Pillow)
Verwenden des Python-Modus in der Verarbeitung
[Python] Bildverarbeitung mit Scicit-Image
Signalverarbeitung in Python (1): Fourier-Transformation
Scala-ähnliche Erfassungsoperation in Python
Persönliche Notizen für die Python-Bildverarbeitung
Die Bildverarbeitung mit Python 100 klopft an die Binärisierung Nr. 3
100 Bildverarbeitung mit Python Knock # 2 Graustufen
[Bildverarbeitung] Posterisierung
Generieren Sie eine erstklassige Sammlung in Python
Quadtree in Python --2
Grundlagen der binärisierten Bildverarbeitung durch Python
Bildverarbeitung mit Python 100 Knock # 10 Medianfilter
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Bildverarbeitung durch Python 100 Knock # 1 Kanalersatz
Metaanalyse in Python
Unittest in Python
100 Bildverarbeitung mit Python Knock # 8 Max Pooling
Epoche in Python
Zwietracht in Python
Bildersammelmethode
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
Graustufen durch Matrix-Reinventor der Python-Bildverarbeitung-
Bildverarbeitung mit Python & OpenCV [Tonkurve]
Bildverarbeitung mit Python 100 Knock # 12 Bewegungsfilter
Bildverarbeitung mit Python 100 Knock # 6 Farbreduktionsverarbeitung
Plink in Python
Konstante in Python
FizzBuzz in Python
So passen Sie den Bildkontrast in Python an
SQLite in Python
Schritt AIC in Python
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Wissenschaftliche Programmierung Petit Tech Collection in Python
LINE-Bot [0] in Python
Bildverarbeitung 100 Schläge ①