1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| #!/usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
def segmentation(img, debug=False):
"""
Segmentation d'une image avec filtre canny
"""
try:
img = cv2.imread(img,0)
edges = cv2.Canny(img,250,200)# réduction des fausses detection de contours
except:
print("probleme d'ouverture d'image")
edges=[]
if debug == True:
print np.transpose(np.nonzero(edges))[0]
return edges, img
def display(img, edges, DEBUG):
"""
Fonction d'affichage au format matplotlib
"""
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray') ##localisation précise des contours
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show() #discontinuité des contours?
cv2.waitKey(30)
cv2.destroyAllWindows()
def squeletisation(edges, debug):
"""
Fonction de squeletisation
"""
size = np.size(edges)
skel = np.zeros(edges.shape,np.uint8)
ret,edges = cv2.threshold(edges,127,255,0)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
done = False
while( not done):
eroded = cv2.erode(edges,element)
temp = cv2.dilate(eroded,element)
temp = cv2.subtract(edges,temp)
skel = cv2.bitwise_or(skel,temp)
edges = eroded.copy()
zeros = size - cv2.countNonZero(edges)
if zeros==size:
done = True
cv2.imshow("skel",skel)
cv2.waitKey(0)
cv2.destroyAllWindows()
def pixel_list(img, edges, DEBUG):
"""
Fonction gerant l'enregistrement des contours
Edges est une matrice
La taille de chaque ligne de la matrice correspond à la largeur
de image. Le nombre de ligne de la matrice correspond à la hauteur
de l'image.
donc chaque entrée edges[x][y] correspond à la valeur d'un pixel,
0 pour le noir et 255 pour blanc, avec x correspond à chaque pixel
différent de 0, donc 255 puisque j'ai une image binaire
"""
if debug == True:
print edges[200] #Affiche la ligne 200 de l'image
print len (edges) #affiche le nombre de ligne
#Ouverture du fichier
fichier = open("data.txt", 'w')
#Ecriture de l'entete
fichier.write("coordonnees des contours de l'image analysees: \n\n")
#Parcours des lignes
for i in range(len(edges)):
#parcours des colonnes pour chaque ligne
for j in range(len(edges[i])):
if edges[i][j] == 255:
#Si detection d'un pixel blanc, on enregistre ses coordonnees
fichier.write("[%s,%s]\n"%(i,j))
if __name__ == "__main__":
"""
Fonction principale
"""
DEBUG = True
rtr_canny, rtr_img = segmentation('fenetre.jpg', DEBUG)
display(rtr_img, rtr_canny, DEBUG)
squeletisation(rtr_canny, DEBUG)
pixel_list(rtr_img, rtr_canny, DEBUG) |