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