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