112 lines
3.2 KiB
Python
112 lines
3.2 KiB
Python
from umage import load, save, show_image
|
|
from math import atan2, cos
|
|
|
|
def grayscale(img_mat):
|
|
"""Transform an image into gray
|
|
|
|
:img_mat: image en entree
|
|
:returns: grayscale de limage em entree
|
|
|
|
"""
|
|
new_matrix = list()
|
|
for row in range(len(img_mat)):
|
|
new_matrix.append(list())
|
|
for column in img_mat[row]:
|
|
_r, _g, _b = column
|
|
gray = round(0.2125 * _r + 0.7154 * _g + 0.0721 * _b)
|
|
new_matrix[row].append((gray, gray, gray))
|
|
|
|
return new_matrix
|
|
|
|
def convolution(img_mat, mat):
|
|
"""effectue le passage d'une matrice de convolution sur une image grise
|
|
TODO: image de couleurs
|
|
|
|
:img_mat: image en entree
|
|
:mat: matrice de convolution
|
|
:returns: image retouchee
|
|
|
|
"""
|
|
|
|
new_matrix = list()
|
|
for row in range(len(img_mat)):
|
|
new_matrix.append(list())
|
|
for column in range(len(img_mat[row])):
|
|
# _gray = img_mat[row][column][0]
|
|
_sum = 0
|
|
for mat_row in range(len(mat)):
|
|
for mat_column in range(len(mat[mat_row])):
|
|
diff_row = mat_row - len(mat)//2
|
|
diff_col = mat_column - len(mat[mat_column])//2
|
|
if dans_image(img_mat, row+diff_row, column+ diff_col):
|
|
_sum += mat[mat_row][mat_column] * img_mat[row + diff_row][column + diff_col][0]
|
|
new_matrix[row].append((_sum, _sum, _sum))
|
|
return new_matrix
|
|
|
|
def dans_image(img_mat, row, col):
|
|
if row < len(img_mat)-1 and row > 0 and col < len(img_mat[0])-1 and col > 0:
|
|
return True
|
|
return False
|
|
|
|
def calculate_direction(img1, img2):
|
|
"""Calculate the image direction of 2 image that has been trough gx and gy of phobels formula
|
|
|
|
:img1: x image of fobel
|
|
:img2: y image of fobel
|
|
:returns: matrix of direction
|
|
|
|
"""
|
|
res = list()
|
|
for row in range(len(img1)):
|
|
res.append(list())
|
|
for col in range(len(img1[row])):
|
|
res[row].append(atan2(img2[row][col][0], img1[row][col][0]))
|
|
return res
|
|
|
|
|
|
def dir_mat_to_img(mat):
|
|
"""take a matrix with direction and transform it in image with direction hue """
|
|
res = list()
|
|
for row in range(len(mat)):
|
|
res.append(list())
|
|
for col in range(len(mat[row])):
|
|
res[row].append((round(256*cos(mat[row][col])), round(256*cos(mat[row][col] + 120)), round(256*cos(mat[row][col] - 120))))
|
|
return res
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unit = [
|
|
[0, 1, 0],
|
|
[0, 0, 0],
|
|
[0, 0, 0]]
|
|
convolution1 = [
|
|
[-1, -1, -1],
|
|
[-1, 8, -1],
|
|
[-1, -1, -1]]
|
|
convolution2 = [
|
|
[-1, -1, -1],
|
|
[-1, 9, -1],
|
|
[-1, -1, -1]]
|
|
convolution3 = [
|
|
[-2, 0, 0],
|
|
[ 0, 1, 0],
|
|
[ 0, 0, 2]]
|
|
|
|
phobel1 = [
|
|
[ 1, 0, -1],
|
|
[ 2, 1, -2],
|
|
[ 1, 0, -1]]
|
|
phobel2 = [
|
|
[ 1, 2, 1],
|
|
[ 0, 0, 0],
|
|
[ -1, -2, -1]]
|
|
|
|
img = load('./myimg.jpg')
|
|
new_image = grayscale(img)
|
|
convolution(new_image, convolution2)
|
|
phob1_img = convolution(new_image, phobel1)
|
|
phob2_img = convolution(new_image, phobel2)
|
|
final = dir_mat_to_img(calculate_direction(phob2_img, phob1_img))
|
|
save(final, 'final2')
|