Add re_serie_7
This commit is contained in:
parent
727fe01b7c
commit
f8e933cbdc
164
re_serie_7.py
Normal file
164
re_serie_7.py
Normal file
@ -0,0 +1,164 @@
|
||||
import umage as um
|
||||
from math import sqrt, atan2
|
||||
|
||||
def greyscale(mat_img):
|
||||
gray_img = []
|
||||
for ligne in mat_img:
|
||||
lig = []
|
||||
for r,g,b in ligne:
|
||||
v = int(r*0.2125 + g*0.7154 + b*0.0721)
|
||||
lig.append((v,)*3)
|
||||
gray_img.append(lig)
|
||||
return gray_img
|
||||
|
||||
def convolution(mat_img, mat):
|
||||
return_img = []
|
||||
for j in range(len(mat_img)):
|
||||
ligne = []
|
||||
for i in range(len(mat_img[0])):
|
||||
val = appliquer_convolution(mat_img, mat, i, j)
|
||||
ligne.append((val,)*3)
|
||||
return_img.append(ligne)
|
||||
return return_img
|
||||
|
||||
def filtre_sobel(img):
|
||||
|
||||
def calcul_norme(pixel1, pixel2):
|
||||
valeur = pixel1[0]**2 + pixel2[0]**2
|
||||
norm = round(sqrt(valeur))
|
||||
norm = int(min(norm, 255))
|
||||
return norm
|
||||
|
||||
def application_norme(im_x, im_y):
|
||||
result_image = []
|
||||
for j in range(len(im_x)):
|
||||
ligne = []
|
||||
for i in range(len(im_x[0])):
|
||||
pixel1 = im_x[j][i]
|
||||
pixel2 = im_y[j][i]
|
||||
norme = calcul_norme(pixel1, pixel2)
|
||||
ligne.append((norme,)*3)
|
||||
result_image.append(ligne)
|
||||
return result_image
|
||||
|
||||
if not is_greyscale(img):
|
||||
img = greyscale(img)
|
||||
|
||||
mat_x = [[-1,0,1],[-2,0,2],[-1,0,1]]
|
||||
mat_y = [[-1,-2,-1],[0,0,0],[1,2,1]]
|
||||
Gx = convolution(img, mat_x)
|
||||
Gy = convolution(img, mat_y)
|
||||
|
||||
filtred_image = application_norme(Gx,Gy)
|
||||
return filtred_image
|
||||
|
||||
|
||||
|
||||
#########################################################################
|
||||
########################Exercices Supplémentaires########################
|
||||
#########################################################################
|
||||
|
||||
def is_greyscale(img):
|
||||
_greyscale = True
|
||||
for ligne in img:
|
||||
for r,g,b in ligne:
|
||||
if not (r==g and g==b):
|
||||
_greyscale = False
|
||||
break
|
||||
if not _greyscale:
|
||||
break
|
||||
return _greyscale
|
||||
|
||||
def invert(img):
|
||||
result_image = []
|
||||
for ligne in img:
|
||||
result_ligne = []
|
||||
for r,g,b in ligne:
|
||||
result_ligne.append((255-r, 255-g, 255-b))
|
||||
result_image.append(result_ligne)
|
||||
return result_image
|
||||
|
||||
def pixel(img, i, j, default=(0,0,0)):
|
||||
#i la colone et j la ligne
|
||||
if 0 <= i < len(img[0]) and 0 <= j < len(img):
|
||||
return img[j][i]
|
||||
else:
|
||||
return default
|
||||
|
||||
def appliquer_convolution(img, mat, i, j):
|
||||
somme = 0
|
||||
for y in range(len(mat)):
|
||||
for x in range(len(mat[0])):
|
||||
pixel_i = i - (len(mat[0]) // 2) + x
|
||||
pixel_j = j - (len(mat) // 2) + y
|
||||
pix = pixel(img, pixel_i, pixel_j)
|
||||
somme += pix[0]*mat[y][x]
|
||||
return min(max(somme,0), 255)
|
||||
|
||||
|
||||
|
||||
######################################################################
|
||||
########################Exercices personnelles########################
|
||||
######################################################################
|
||||
def convolution_gauss(mat_img, mat):
|
||||
return_img = []
|
||||
for j in range(len(mat_img)):
|
||||
ligne = []
|
||||
for i in range(len(mat_img[0])):
|
||||
val = reduction_bruit(mat_img, mat, i, j)
|
||||
ligne.append((val,)*3)
|
||||
return_img.append(ligne)
|
||||
return return_img
|
||||
|
||||
def reduction_bruit(img, mat, i, j):
|
||||
somme = 0
|
||||
for y in range(len(mat)):
|
||||
for x in range(len(mat[0])):
|
||||
pixel_i = i - (len(mat[0]) // 2) + x
|
||||
pixel_j = j - (len(mat) // 2) + y
|
||||
pix = pixel(img, pixel_i, pixel_j)
|
||||
somme += pix[0]*mat[y][x]
|
||||
normalise = int(round(somme / (1/159)))
|
||||
return min(max(normalise,0), 255)
|
||||
|
||||
def filtre_canny(img):
|
||||
|
||||
def norme_gradient(pixel1, pixel2):
|
||||
color_x = pixel1[0]
|
||||
color_y = pixel2[0]
|
||||
|
||||
norm = round(sqrt(color_x**2 + color_y**2))
|
||||
norm = int(min(norm, 255))
|
||||
|
||||
grad = atan2(color_y, color_x)
|
||||
return norm, grad
|
||||
|
||||
def liste_normGrad(im1, im2):
|
||||
liste = []
|
||||
for j in range(len(im1)):
|
||||
ligne = []
|
||||
for i in range(len(im1[0])):
|
||||
normGrad = norme_gradient(im1[j][i], im2[j][i])
|
||||
ligne.append(normGrad)
|
||||
liste.append(ligne)
|
||||
return liste
|
||||
|
||||
if not is_greyscale(img):
|
||||
img = greyscale(img)
|
||||
|
||||
mat_gauss = [
|
||||
[2, 4, 5, 4,2],
|
||||
[4, 9,12, 9,4],
|
||||
[5,12,15,12,5],
|
||||
[4, 9,12, 9,4],
|
||||
[2, 4, 5, 4,2]
|
||||
]
|
||||
mat_x = [[-1,0,1]]
|
||||
mat_y = [[1],[0],[-1]]
|
||||
|
||||
#lissage
|
||||
img = convolution_gauss(img, mat_gauss)
|
||||
Jx = convolution(img, mat_x)
|
||||
Jy = convolution(img, mat_y)
|
||||
normGrad = liste_normGrad(Jx, Jy)
|
||||
|
Loading…
Reference in New Issue
Block a user