| 
									
										
										
										
											2022-11-03 16:27:48 +01:00
										 |  |  | from umage import load, save, show_image | 
					
						
							| 
									
										
										
										
											2022-11-04 16:50:09 +01:00
										 |  |  | from math import atan2, cos  | 
					
						
							| 
									
										
										
										
											2022-11-03 16:27:48 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-04 16:50:09 +01:00
										 |  |  | 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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 16:27:48 +01:00
										 |  |  | 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]] | 
					
						
							| 
									
										
										
										
											2022-11-04 16:50:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     phobel1 = [ | 
					
						
							|  |  |  |             [ 1, 0, -1], | 
					
						
							|  |  |  |             [ 2, 1, -2], | 
					
						
							|  |  |  |             [ 1, 0, -1]] | 
					
						
							|  |  |  |     phobel2 = [ | 
					
						
							|  |  |  |             [ 1, 2, 1], | 
					
						
							|  |  |  |             [ 0, 0, 0], | 
					
						
							|  |  |  |             [ -1, -2, -1]] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 16:27:48 +01:00
										 |  |  |     img = load('./myimg.jpg') | 
					
						
							|  |  |  |     new_image = grayscale(img) | 
					
						
							|  |  |  |     convolution(new_image, convolution2) | 
					
						
							| 
									
										
										
										
											2022-11-04 16:50:09 +01:00
										 |  |  |     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') |