[Python] Verwenden von OpenCV mit Python (Kantenerkennung)

laplacian cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])

img = cv2.imread('./data/SIDBA/Lenna.bmp')
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
imgYUV = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
imgY = imgYUV[:,:,0]


result = cv2.Laplacian(imgY, cv2.CV_64F)

image

fig, axes = plt.subplots(ncols=2, figsize=(10,5))
axes[0].imshow(imgY, cmap=cm.Greys_r, vmin=0, vmax=255)
axes[0].set_title('Y')
axes[0].get_xaxis().set_visible(False)
axes[0].get_yaxis().set_visible(False)   
axes[1].imshow(result, cmap=cm.Greys_r, vmin=-128, vmax=128)
axes[1].set_title('Laplacian')
axes[1].get_xaxis().set_visible(False)
axes[1].get_yaxis().set_visible(False)   

Sobel cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])

dx = cv2.Sobel(imgY, cv2.CV_64F, 1, 0, ksize=3)
dy = cv2.Sobel(imgY, cv2.CV_64F, 0, 1, ksize=3)
grad = np.sqrt(dx ** 2 + dy ** 2)

image

fig, axes = plt.subplots(ncols=4, figsize=(20,5))
axes[0].imshow(imgY, cmap=cm.Greys_r, vmin=0, vmax=255)
axes[0].set_title('Y')
axes[0].get_xaxis().set_visible(False)
axes[0].get_yaxis().set_visible(False)   
axes[1].imshow(dx, cmap=cm.Greys_r, vmin=-128, vmax=128)
axes[1].set_title('dx')
axes[1].get_xaxis().set_visible(False)
axes[1].get_yaxis().set_visible(False)   
axes[2].imshow(dy, cmap=cm.Greys_r, vmin=-128, vmax=128)
axes[2].set_title('dy')
axes[2].get_xaxis().set_visible(False)
axes[2].get_yaxis().set_visible(False)   
axes[3].imshow(grad, cmap=cm.Greys_r, vmin=0, vmax=255)
axes[3].set_title('gradient')
axes[3].get_xaxis().set_visible(False)
axes[3].get_yaxis().set_visible(False)   

Canny cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])

Canny-Funktionen ** Nicht maximale Unterdrückung ** und ** Hystereseschwelle **. ** Nicht maximale Unterdrückung **, wobei nur der Maximalwert in der Gradientenrichtung belassen wird und der Rest gelöscht wird, wodurch die Linie dünner wird. Wenn Sie bei der Verarbeitung 3 Pixel in Verlaufsrichtung betrachten und der Mittelpunkt der Maximalwert ist, bleibt dieser übrig.

** Hystereseschwelle ** verwendet ** High Threshold ** und ** Low Threshold **. Hoher Schwellenwert und höher sollte Edge ohne Beanstandung sein. Unterhalb des unteren Schwellenwerts auf Nicht-Kante einstellen. Es handelt sich um ein Bild zwischen hohem und niedrigem Schwellenwert. Wenn es jedoch mit dem als Kantenpixel beurteilten Bild verbunden ist, wird es auf Rand gesetzt. Linien, die zwischen dem hohen und dem niedrigen Schwellenwert wandern und unterbrochen werden, werden nicht zu Kanten, aber Linien, die von Kantenpixeln über dem hohen Schwellenwert verbunden sind und zwischen dem hohen Schwellenwert und dem niedrigen Schwellenwert wandern, werden zu Kanten. Ich werde.

http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_canny/py_canny.html

result = cv2.Canny(imgY, 100, 200)

image

fig, axes = plt.subplots(ncols=2, figsize=(10,5))
axes[0].imshow(imgY, cmap=cm.Greys_r, vmin=0, vmax=255)
axes[0].set_title('Y')
axes[0].get_xaxis().set_visible(False)
axes[0].get_yaxis().set_visible(False)   
axes[1].imshow(result, cmap=cm.Greys_r, vmin=0, vmax=255)
axes[1].set_title('Canny')
axes[1].get_xaxis().set_visible(False)
axes[1].get_yaxis().set_visible(False)  

Hysteresis Thresholding Ich mache ein gerades Linienbild von 1 horizontalen Linie, ändere den Schwellenwert und sehe das Ergebnis. Hier verwenden wir ein 100x100-Bild mit einer geraden Linie mit einem Wert von 30 in der Mitte.

** Zuerst von links: ** Originalbild ** Zweiter von links: ** Niedriger / hoher Schwellenwert auf 119 eingestellt ** Dritter von links: ** Niedriger Schwellenwert auf 119 und hoher Schwellenwert auf 120 eingestellt ** 4. von links: ** Das mittlere Bild ist auf 31 und der niedrige Schwellenwert auf 119 und der hohe Schwellenwert auf 120 eingestellt. ** Fünfter von links: ** 29 Pixel pro 1/4 von links, niedriger Schwellenwert auf 119, hoher Schwellenwert auf 120 eingestellt

Das zweite Bild von links wird erkannt, da Edge den Wert für den hohen Schwellenwert überschritten hat. Das dritte Bild von links wird nicht mehr erkannt, da der hohe Schwellenwert angehoben wurde. Das vierte Bild von links wird jetzt als Kante erkannt, da der Wert in der Mitte leicht erhöht wird, sodass er den hohen Schwellenwert überschreitet. Im fünften Bild von links wurde die Anzahl der Pixel pro 1/4 von links auf 29 eingestellt, sodass sie unter dem unteren Schwellenwert lag, sodass das erste 1/4 nicht mehr als Kante erkannt wurde.

Anhand dieses Experiments sollten Sie verstehen können, was der Hysterese-Schwellenwertprozess bewirkt.

image

L = np.tile(30, 100)
P = np.zeros((100,100), dtype=np.uint8)
P[50,:] = L

result_L119_H119 = cv2.Canny(P,119,119)
result_L119_H120 = cv2.Canny(P,119,120)
P[50, 50] = 31
result_L119_H120_new = cv2.Canny(P,119,120)
P[50, 25] = 29
result_L119_H120_new2 = cv2.Canny(P,119,120)

fig, axes = plt.subplots(ncols=5, figsize=(20,5))
axes[0].imshow(P, cmap=cm.Greys_r, vmin=0, vmax=32)
axes[0].set_title('Y')
axes[0].get_xaxis().set_visible(False)
axes[0].get_yaxis().set_visible(False)   
axes[1].imshow(result_H119_L119, cmap=cm.Greys_r, vmin=0, vmax=255)
axes[1].set_title('Canny L119,H119')
axes[1].get_xaxis().set_visible(False)
axes[1].get_yaxis().set_visible(False)  
axes[2].imshow(result_H120_L120, cmap=cm.Greys_r, vmin=0, vmax=255)
axes[2].set_title('Canny L119, H120')
axes[2].get_xaxis().set_visible(False)
axes[2].get_yaxis().set_visible(False)  
axes[3].imshow(result_H120_L120_new, cmap=cm.Greys_r, vmin=0, vmax=255)
axes[3].set_title('Canny L119, H120 new1')
axes[3].get_xaxis().set_visible(False)
axes[3].get_yaxis().set_visible(False)  
axes[4].imshow(result_H120_L120_new2, cmap=cm.Greys_r, vmin=0, vmax=255)
axes[4].set_title('Canny L119 H120 new2')
axes[4].get_xaxis().set_visible(False)
axes[4].get_yaxis().set_visible(False)  

Pyramid

cv2.pyrUp(src[, dst[, dstsize[, borderType]]] cv2.pyrDown(src[, dst[, dstsize[, borderType]]]

Verwenden Sie Pyramide und Pyramide, um ein Pyramidenbild zu erstellen. pyrUp ist Expansion und pyrDown ist Reduktion. Die Größen sind $ \ times 2 bzw. \ times \ frac {1} {2} $. Mit pyrUp und pyrDown wird der Filter gefaltet, wenn das Bild vergrößert oder verkleinert wird. Der Filter ist ein $ 5 \ mal 5 $ Gauß-Filter. Der Wert des Filters ist wie folgt.

\begin{equation}
\frac{1}{256}
\begin{bmatrix}
1 & 4 & 6 & 4 & 1 \\
4 & 16 & 24 & 16 & 4 \\
6 & 24 & 36 & 24 & 6 \\
4 & 16 & 24 & 16 & 4 \\
1 & 4 & 6 & 4 & 1 \\
\end{bmatrix}
\end{equation}
L = 3
tmp = imgY.copy()
pyImg = [tmp]
pyEdge = [cv2.Canny(tmp.astype(np.uint8),100,200 )]
for idx in xrange(L-1):
    tmp = cv2.pyrDown(tmp)
    pyImg.append(tmp)
    pyEdge.append(cv2.Canny(tmp.astype(np.uint8),100,200 ))

image

height = np.sum([img.shape[0] for img in pyImg])
width  = np.max([img.shape[1] for img in pyImg])
con_img = np.zeros((height, width), dtype=pyImg[0].dtype)
y = 0
for Y in pyImg:
    con_img[y:y+Y.shape[0],0:Y.shape[1]] = Y
    y += Y.shape[0]
    
fig,axes = plt.subplots(nrows=1, figsize=(8,8))
axes.imshow(con_img, cmap=cm.Greys_r, vmin=0, vmax=255)
axes.get_xaxis().set_visible(False)
axes.get_yaxis().set_visible(False)

image

python


fig, axes = plt.subplots(ncols = 3,nrows=2, figsize=(10,8))
for idx, (Y, E) in enumerate(zip(pyImg, pyEdge)):
    axes[0,idx].imshow(Y, cmap=cm.Greys_r, vmin=0, vmax=255)
    axes[0,idx].set_title('Level %d Image' % idx)
    axes[0,idx].get_xaxis().set_visible(False)
    axes[0,idx].get_yaxis().set_visible(False)  
    axes[1,idx].imshow(E, cmap=cm.Greys_r)
    axes[1,idx].set_title('Level %d Edge' % idx)
    axes[1,idx].get_xaxis().set_visible(False)
    axes[1,idx].get_yaxis().set_visible(False)  

Recommended Posts

[Python] Verwenden von OpenCV mit Python (Kantenerkennung)
Versuchen Sie die Kantenerkennung mit OpenCV
[Python] Verwenden von OpenCV mit Python (Basic)
Echtzeit-Kantenerkennung mit OpenCV
Gesichtserkennung mit Python + OpenCV
Verwenden von OpenCV mit Python @Mac
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
Gesichtserkennung mit Python + OpenCV (invariante Rotation)
Binarisierung mit OpenCV / Python
[Bildverarbeitung] Poo-san ist durch Kantenerkennung mit Python und OpenCV nackt!
Zeichnen Sie eine Aquarellillusion mit Kantenerkennung in Python3 und openCV3
Hallo Welt- und Gesichtserkennung mit OpenCV 4.3 + Python
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
"Apple-Verarbeitung" mit OpenCV3 + Python3
[S3] CRUD mit S3 unter Verwendung von Python [Python]
Verwenden von Quaternion mit Python ~ numpy-quaternion ~
Bildbearbeitung mit Python OpenCV
Kameraerfassung mit Python + OpenCV
Feature-Erkennung mit opencv (Eckenerkennung)
Gesichtserkennung mit Python + dlib
Erkennung von Blockchain-Manipulationen mit Python
Senden Sie mit Python mit Google Mail
Anime-Gesichtserkennung mit OpenCV
Versuchen Sie, die Bildkonvertierung mit OpenCV mit Python zu projizieren
Vervollständigung von Python mit Emacs mit Company-Jedi
Leuchtendes Leben mit Python und OpenCV
Harmonischer Mittelwert von Python (mit SciPy)
Gesichtserkennung mit YOLO Face (Windows10, Python3.6)
Neuronales Netzwerk mit OpenCV 3 und Python 3
Verwenden von Rstan aus Python mit PypeR
Gesichtserkennung mit Lambda (Python) + Erkennung
Einfache Python + OpenCV-Programmierung mit Canopy
Versuchen Sie die Gesichtserkennung mit Python + OpenCV
Schneiden Sie das Gesicht mit Python + OpenCV aus
Gesichtserkennung mit Kamera mit opencv3 + python2.7
OpenCV-Funktionserkennung mit Google Colaboratory
Laden Sie das GIF-Bild mit Python + OpenCV
Hinweise zur Verwendung von rstrip mit Python.
Katzenerkennung mit OpenCV (Modellverteilung)
Finden Sie Bildähnlichkeit mit Python + OpenCV
Verwenden Sie OpenCV mit Python 3 in Window
Zeichnen Sie eine Illustration mit Python + OpenCV
Verfolgen Sie Baseballbälle mit Python + OpenCV
Graphbasierte Segmentierung mit Python + OpenCV
Bei Verwendung von MeCab mit virtualenv python
Vorsichtsmaßnahmen bei Verwendung von sechs mit Python 2.5
Zeichnen Sie einen Pfeil (Vektor) mit opencv / python
Grundlegendes Studium von OpenCV mit Python
Objektextraktion im Bild durch Mustervergleich mit OpenCV mit Python
Hinweise zur Verwendung von OpenCV mit Windows 10 Python 3.8.3.
[AWS] Verwenden von INI-Dateien mit Lambda [Python]
Ausführungsbeispiel für die Blob-Erkennung mit OpenCV
[Python] Gesichtserkennung durch OpenCV (Haar Cascade)
Hinter dem Flyer: Docker mit Python verwenden
[Ubuntu] [Python] Gesichtsorganerkennung mit dlib
Versuchen Sie, die Kamera mit Pythons OpenCV zu verwenden
Socket-Kommunikation über Socket-Server mit Python jetzt
Bilder mit Pupil, Python und OpenCV aufnehmen
Versuchen Sie, Python mit Google Cloud-Funktionen zu verwenden
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern