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 propose ** Suppression non maximale ** et ** Seuil d'hystérésis **. ** Suppression non maximale **, ne laissant que la valeur maximale dans la direction du dégradé et effaçant le reste, ce qui rend la ligne plus fine. Quant au traitement, on a l'impression de regarder 3 pixels dans la direction du dégradé et de partir si le centre est la valeur maximale.
** Hysteresis Thresholding ** utilise ** High Threshold ** et ** Low Threshold **. Le seuil élevé et supérieur doit être Edge sans plainte. Défini sur non-bord en dessous du seuil bas. C'est une image entre le seuil haut et le seuil bas, mais si elle est connectée à l'image considérée comme pixel de bord, elle sera définie sur Bord. Les lignes qui errent entre le seuil haut et le seuil bas et qui sont interrompues ne deviennent pas Edge, mais les lignes qui sont connectées à partir des pixels de bord au-dessus du seuil haut et qui errent entre le seuil haut et le seuil bas deviennent Edge. Je vais.
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 Je fais une image en ligne droite d'une ligne horizontale, change le seuil et vois le résultat. Ici, nous utilisons une image 100x100 avec une ligne droite avec une valeur de 30 dessinée au centre.
** Premier à partir de la gauche: ** Image originale ** Deuxième à partir de la gauche: ** Seuil bas / haut réglé sur 119 ** Troisième à partir de la gauche: ** Seuil bas réglé sur 119 et Seuil haut réglé sur 120 ** 4ème à partir de la gauche: ** L'image du milieu est réglée sur 31 et le seuil bas est réglé sur 119 et le seuil haut est réglé sur 120. ** Cinquième à partir de la gauche: ** 29 pixels par 1/4 à partir de la gauche, seuil bas réglé sur 119, seuil haut réglé sur 120
La deuxième image à partir de la gauche est entièrement détectée car Edge a dépassé la valeur de seuil élevé. La troisième image à partir de la gauche n'est plus détectée car le seuil haut a été augmenté. La quatrième image en partant de la gauche est maintenant détectée comme un bord car la valeur au milieu est légèrement augmentée afin qu'elle dépasse le seuil haut. Dans la 5ème image à partir de la gauche, le nombre de pixels par 1/4 à partir de la gauche est défini sur 29 afin qu'il soit en dessous du seuil bas, de sorte que le premier 1/4 n'est plus détecté comme Bord.
À partir de cette expérience, vous devriez être en mesure de comprendre ce que fait le processus de seuil d'hystérésis.
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]]]
Utilisez la pyramide et la pyramide pour créer une image de pyramide. pyrUp est une expansion et pyrDown est une réduction. Les tailles sont respectivement $ \ times 2 et \ times \ frac {1} {2} $. Avec pyrUp et pyrDown, le filtre est convolutionné lorsque l'image est agrandie ou réduite. Le filtre est un filtre gaussien à 5 $ \ fois 5 $. La valeur du filtre est la suivante.
\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