[Python] Utilisation d'OpenCV avec Python (détection des bords)

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

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

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]]]

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

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] Utilisation d'OpenCV avec Python (détection des bords)
Essayez la détection des bords avec OpenCV
[Python] Utilisation d'OpenCV avec Python (basique)
Détection des bords en temps réel avec OpenCV
Détection de visage avec Python + OpenCV
Utiliser OpenCV avec Python @Mac
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
Détection de visage avec Python + OpenCV (rotation invariante)
Binarisation avec OpenCV / Python
[Traitement d'image] Poo-san est nu par détection de bord en utilisant Python et OpenCV!
Dessinez une illusion d'aquarelle avec détection des contours en Python3 et openCV3
Hello World et détection de visage avec OpenCV 4.3 + Python
J'ai essayé la détection d'objets en utilisant Python et OpenCV
"Traitement Apple" avec OpenCV3 + Python3
[S3] CRUD avec S3 utilisant Python [Python]
Utilisation de Quaternion avec Python ~ numpy-quaternion ~
Édition d'image avec python OpenCV
Capture de caméra avec Python + OpenCV
Détection de caractéristiques à l'aide d'opencv (détection de coin)
Détection de visage avec Python + dlib
Détection de falsification de la blockchain avec Python
Envoyer en utilisant Python avec Gmail
Détection de visage d'anime avec OpenCV
Essayez de projeter la conversion d'image en utilisant OpenCV avec Python
Compléter python avec emacs en utilisant company-jedi
Briller la vie avec Python et OpenCV
Moyenne harmonique par Python (en utilisant SciPy)
Détection de visage avec YOLO Face (Windows10, Python3.6)
Réseau neuronal avec OpenCV 3 et Python 3
Utilisation de Rstan de Python avec PypeR
Détection de visage avec Lambda (Python) + Rekognition
Programmation facile Python + OpenCV avec Canopy
Essayez la reconnaissance faciale avec python + OpenCV
Découpez le visage avec Python + OpenCV
Reconnaissance faciale avec caméra avec opencv3 + python2.7
Détection des fonctionnalités OpenCV avec Google Colaboratory
Charger une image gif avec Python + OpenCV
Notes sur l'utilisation de rstrip avec python.
Détection de chat avec OpenCV (distribution de modèles)
Trouver la similitude d'image avec Python + OpenCV
Utiliser OpenCV avec Python 3 dans Window
Dessinez une illustration avec Python + OpenCV
Suivre les balles de baseball avec Python + OpenCV
Segmentation basée sur un graphique avec Python + OpenCV
Lors de l'utilisation de MeCab avec python dans virtualenv
Précautions lors de l'utilisation de six avec Python 2.5
Dessinez une flèche (vecteur) avec opencv / python
Etude de base d'OpenCV avec Python
Extraction d'objets dans l'image par correspondance de modèles en utilisant OpenCV avec Python
Remarques sur l'utilisation d'OpenCV avec Windows10 Python 3.8.3.
[AWS] Utilisation de fichiers ini avec Lambda [Python]
Exemple d'exécution de la détection d'objets blob avec OpenCV
[Python] Détection de visage par OpenCV (Haar Cascade)
Derrière le flyer: utiliser Docker avec Python
[Ubuntu] [Python] Détection d'organes faciaux à l'aide de dlib
Essayez d'utiliser l'appareil photo avec OpenCV de Python
Communication de socket en utilisant le serveur de socket avec python maintenant
Capturer des images avec Pupil, python et OpenCV
Essayez d'utiliser Python avec Google Cloud Functions
J'ai essayé le rendu non réaliste avec Python + opencv