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)
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)
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)
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.
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 ))
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)
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