├── Assignment21 ├── README.md ├── code │ ├── R.I.P.py │ ├── chess_board.py │ ├── gradient.py │ ├── name.py │ ├── negative_image.py │ ├── rotatation.py │ └── wolf.py └── result │ ├── chessboard.jpg │ ├── female.jpg │ ├── gradient.jpg │ ├── male.jpg │ ├── name.jpg │ ├── result1.jpg │ ├── rip.jpg │ ├── rotation.jpg │ └── wolf.jpg ├── Assignment22 ├── README.md ├── code │ ├── board.py │ ├── hidden_word.py │ ├── highway(car_elimination).py │ ├── merge_face.py │ ├── noisy_picture.py │ ├── paint.py │ └── space.py └── result │ ├── board.jpg │ ├── girl.jpg │ ├── hidden_word.jpg │ ├── highway(car_elimination).jpg │ ├── highway.jpg │ ├── merge_face1.jpg │ ├── merge_face2.jpg │ ├── nature.jpg │ ├── noisy_picture.jpg │ ├── paint.jpg │ ├── paris.jpg │ ├── parisa.jpg │ └── space.jpg ├── Assignment23 ├── README.md ├── Result │ ├── README.md │ ├── eyes_lips.png │ ├── face_emoji.png │ ├── flip.jpg │ └── pixelate.png ├── code │ └── FaceDetection.py └── files │ ├── images │ ├── eye6.png │ ├── face5.png │ └── lips8.jpg │ └── xml │ ├── haarcascade_eye.xml │ ├── haarcascade_frontalface_default.xml │ └── mouth.xml ├── Assignment24 ├── README.md ├── RFB-320.tflite ├── TFLiteFaceAlignment.py ├── TFLiteFaceDetector.py ├── coor_2d106.tflite └── result │ ├── 1 │ └── result.mp4 ├── Assignment25 ├── README.md ├── building.py ├── dynamic_filter.py ├── flower.py ├── lion.py ├── result │ ├── 15x15 filter.jpg │ ├── 3x3 filter.jpg │ ├── 5x5 filter.jpg │ ├── 7x7 filter.jpg │ ├── flower.jpg │ ├── horizontal_filter_building_output.jpg │ ├── lion_output.jpg │ ├── paris_gray.jpg │ └── vertical_filter_building_output.jpg └── shades_of_gray.py ├── Assignment26-2 ├── README.md ├── face_rotation_detection.ipynb ├── mnsit.py ├── result │ ├── 1.png │ ├── 3.png │ ├── 9.png │ └── folders.png └── snowfall.py ├── Assignment26 ├── FaceDetection_blurface.py ├── README.md ├── high_contrast.py ├── high_contrast_image.ipynb ├── result │ ├── high_contrast.jpg │ └── low_contrast.jpg ├── shades_of_gray_highContrast.py └── sodoku.ipynb ├── Assignment27 ├── Dice_Recognition.ipynb ├── README.md ├── object_detection.ipynb └── result │ ├── 0.jpg │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── hat.jpg │ ├── hat_detected.jpg │ ├── img0.jpg │ ├── img1.jpg │ ├── img2.jpg │ └── img3.jpg ├── Assignment28 └── a ├── Assignment29 ├── README.md ├── Rubic.ipynb ├── carrot.ipynb ├── color_detecting.py ├── microsoft_logo.ipynb └── result │ ├── Carrot.jpg │ ├── carrot.jpg │ ├── logo_result.jpg │ ├── rubic.jpg │ └── rubix.png ├── Assignment30 ├── README.md ├── blue_screeen_technique.ipynb ├── result │ ├── image.jpg │ ├── img_result.jpg │ ├── skin_dection.jpg │ └── space2.jpg └── skin_detection.py └── README.md /Assignment21/README.md: -------------------------------------------------------------------------------- 1 | # Chess board 2 | 3 | 4 | 5 | # Negative Picture 6 | 7 | 8 | 9 | 10 | # Rotation 11 | 12 | ![Alt text](https://github.com/Parisa-Bagherzadeh/Image_processing/blob/main/Assignment21/result/rotation.jpg " Optional title") 13 | 14 | 15 | # Wolf 16 | 17 | ![Alt text](https://github.com/Parisa-Bagherzadeh/Image_processing/blob/main/Assignment21/result/wolf.jpg " Optional title") 18 | 19 | 20 | # R.I.P 21 | 22 | ![Alt text](https://github.com/Parisa-Bagherzadeh/Image_processing/blob/main/Assignment21/result/rip.jpg " Optional title") 23 | 24 | # Gradient 25 | 26 | ![Alt text](https://github.com/Parisa-Bagherzadeh/Image_processing/blob/main/Assignment21/result/gradient.jpg " Optional title") 27 | 28 | # Name 29 | 30 | ![Alt text](https://github.com/Parisa-Bagherzadeh/Image_processing/blob/main/Assignment21/result/name.jpg " Optional title") 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /Assignment21/code/R.I.P.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | 3 | img=cv2.imread('paris.jpg',0) 4 | 5 | height,width=img.shape 6 | print(height,width) 7 | 8 | item=120 9 | for i in range(145): 10 | for j in range(100-i,145-i): 11 | if(j>=0): 12 | img[i,j]=0 13 | 14 | 15 | 16 | 17 | 18 | cv2.imshow('Paris',img) 19 | img=cv2.resize(img,(400,400)) 20 | cv2.imwrite('rip.jpg',img) 21 | cv2.waitKey() -------------------------------------------------------------------------------- /Assignment21/code/chess_board.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | img=np.ones([800,800]) 4 | height,width=img.shape 5 | for r in range(0,20,1): 6 | if r%2==1: 7 | for i in range(0,height,200): 8 | for j in range(0,width,200): 9 | img[i:i+100,j:j+100]=0 10 | 11 | elif r%2==0: 12 | for i in range(100,height,200): 13 | for j in range(100,width,200): 14 | img[i:i+100,j:j+100]=0 15 | 16 | cv2.imwrite('chessboard.jpg',255*img) 17 | cv2.imshow('chessboard',img) 18 | cv2.waitKey() -------------------------------------------------------------------------------- /Assignment21/code/gradient.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | img=np.ones([255,255],dtype=np.uint8) 4 | height,width=img.shape 5 | 6 | print('height=',height,'width=',width) 7 | for i in range(height): 8 | for j in range(width): 9 | img[i,j]=255-i 10 | cv2.imshow('Image',img) 11 | cv2.imwrite('result1.jpg',img) 12 | cv2.waitKey() -------------------------------------------------------------------------------- /Assignment21/code/name.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | img=np.ones([250,250]) 4 | height,width=img.shape 5 | 6 | print(height,width) 7 | 8 | img[35:210,25:50]=0 9 | img[35:55,50:115]=0 10 | img[56:96,116:136]=0 11 | img[97:117,50:115]=0 12 | cv2.imshow('Image',img) 13 | cv2.imwrite('result2.jpg',255*img) 14 | cv2.waitKey() 15 | 16 | -------------------------------------------------------------------------------- /Assignment21/code/negative_image.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | img1=cv2.imread('1.jpg',0) 3 | img2=cv2.imread('2.jpg',0) 4 | img1=255-img1 5 | img2=255-img2 6 | 7 | cv2.imshow('Image1',img1) 8 | cv2.imshow('Image2',img2) 9 | cv2.imwrite('female.jpg',img1) 10 | cv2.imwrite('male.jpg',img2) 11 | cv2.waitKey() 12 | -------------------------------------------------------------------------------- /Assignment21/code/rotatation.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | 4 | img=cv2.imread('3.jpg',0) 5 | height,width=img.shape 6 | d_img=np.zeros([height,width],dtype=np.uint8) 7 | 8 | for i in range(height): 9 | for j in range(width): 10 | d_img[i,j]=img[height-i-1,width-j-1] 11 | d_img=d_img[0:height,0:width] 12 | 13 | cv2.imshow('Image',d_img) 14 | cv2.imwrite('result5.jpg',d_img) 15 | cv2.waitKey() 16 | -------------------------------------------------------------------------------- /Assignment21/code/wolf.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | 4 | img=cv2.imread('4.jpg',0) 5 | 6 | height,width=img.shape 7 | for i in range(height): 8 | for j in range(width): 9 | if img[i,j]<=130: 10 | img[i,j]=0 11 | cv2.imwrite('result6.jpg',img) 12 | cv2.waitKey() 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Assignment21/result/chessboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment21/result/chessboard.jpg -------------------------------------------------------------------------------- /Assignment21/result/female.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment21/result/female.jpg -------------------------------------------------------------------------------- /Assignment21/result/gradient.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment21/result/gradient.jpg -------------------------------------------------------------------------------- /Assignment21/result/male.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment21/result/male.jpg -------------------------------------------------------------------------------- /Assignment21/result/name.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment21/result/name.jpg -------------------------------------------------------------------------------- /Assignment21/result/result1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment21/result/result1.jpg -------------------------------------------------------------------------------- /Assignment21/result/rip.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment21/result/rip.jpg -------------------------------------------------------------------------------- /Assignment21/result/rotation.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment21/result/rotation.jpg -------------------------------------------------------------------------------- /Assignment21/result/wolf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment21/result/wolf.jpg -------------------------------------------------------------------------------- /Assignment22/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Hidden word 3 | 4 | 5 | 6 | # Black hole 7 | 8 | 9 | # Testing board 10 | 11 | 12 | # Highway(car elimination) 13 | 14 | 15 | 16 | # Paint 17 |

18 | 19 | 20 |

21 | 22 | # Merge faces 23 |

24 | 25 | 26 | 27 | 28 |

29 | 30 | # Noisy picture 31 | 32 |

33 | 34 | 35 |

36 | -------------------------------------------------------------------------------- /Assignment22/code/board.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | 3 | test=cv2.imread('test.bmp',0) 4 | origin=cv2.imread('origin.bmp',0) 5 | flip_test=cv2.flip(test,1) 6 | result=cv2.subtract(flip_test,origin) 7 | 8 | height,width=result.shape 9 | 10 | 11 | 12 | 13 | 14 | cv2.imwrite('board.jpg',result) 15 | -------------------------------------------------------------------------------- /Assignment22/code/hidden_word.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | img1=cv2.imread('a.tif',0) 3 | img2=cv2.imread('b.tif',0) 4 | 5 | img3=img2-img1 6 | cv2.imwrite('result2.jpg',img3) 7 | cv2.imshow('image',img3) 8 | cv2.waitKey() -------------------------------------------------------------------------------- /Assignment22/code/highway(car_elimination).py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | 4 | images=[] 5 | 6 | for i in range(14): 7 | print(i) 8 | img=cv2.imread(f'h{i}.jpg',0) 9 | images.append(img) 10 | #$print(i) 11 | rows,cols=img.shape 12 | 13 | result=np.zeros((rows,cols),dtype='uint8') 14 | 15 | for image in images: 16 | result+=image//14 17 | 18 | cv2.imwrite('highway.jpg',result) -------------------------------------------------------------------------------- /Assignment22/code/merge_face.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | 3 | img1=cv2.imread('pp.jpg',0) 4 | img2=cv2.imread('paris.jpg',0) 5 | img1=cv2.resize(img1,(300,300)) 6 | img2=cv2.resize(img2,(300,300)) 7 | 8 | 9 | 10 | img1_1=img1 11 | img2_1=img2//4 12 | result1=img1_1+img2_1 13 | result1=cv2.resize(result1,(400,400)) 14 | cv2.imwrite('merge_face1.jpg',result1) 15 | 16 | 17 | img1_2=img1//2 18 | img2_2=img2//2 19 | result2=img1_2+img2_2 20 | result2=cv2.resize(result2,(400,400)) 21 | cv2.imwrite('merge_face2.jpg',result2) 22 | -------------------------------------------------------------------------------- /Assignment22/code/noisy_picture.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import random 3 | 4 | 5 | img=cv2.imread('girl.jpg',0) 6 | height,width=img.shape 7 | print(height,width) 8 | 9 | for i in range(0,height,3): 10 | h=random.randint(0,height) 11 | r1=random.randint(1,10) 12 | #for j in range(width): 13 | for k in range(r1): 14 | r2=random.randint(0,width-1) 15 | img[h,r2]=random.randint(0,255) 16 | 17 | 18 | cv2.imwrite('noisy_picture.jpg',img) 19 | cv2.waitKey() -------------------------------------------------------------------------------- /Assignment22/code/paint.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | 3 | img=cv2.imread('nature.jpg',0) 4 | img=cv2.resize(img,(300,300)) 5 | inverted=255-img 6 | blurred=cv2.GaussianBlur(inverted,(21,21),0) 7 | inverted_blurred=255-blurred 8 | sketch=img/inverted_blurred 9 | sketch=sketch*230 10 | sketch=cv2.resize(sketch,(300,300)) 11 | cv2.imwrite('paint.jpg',sketch) -------------------------------------------------------------------------------- /Assignment22/code/space.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | from matplotlib import pyplot as plt 4 | fig = plt.figure(figsize=(10, 7)) 5 | images1=[] 6 | images2=[] 7 | images3=[] 8 | images4=[] 9 | for i in range(1,6): 10 | img=cv2.imread(f'{i}.jpg',0) 11 | images1.append(img) 12 | rows,cols=img.shape 13 | 14 | result1=np.zeros((rows,cols),dtype='uint8') 15 | 16 | for image in images1: 17 | result1+=image//5 18 | 19 | cv2.imwrite('Image1.jpg',result1) 20 | 21 | for i in range(6,11): 22 | img=cv2.imread(f'{i}.jpg',0) 23 | images2.append(img) 24 | rows,cols=img.shape 25 | 26 | result2=np.zeros((rows,cols),dtype='uint8') 27 | 28 | for image in images2: 29 | result2+=image//5 30 | 31 | cv2.imwrite('Image2.jpg',result2) 32 | 33 | 34 | for i in range(11,16): 35 | img=cv2.imread(f'{i}.jpg',0) 36 | images3.append(img) 37 | rows,cols=img.shape 38 | 39 | result3=np.zeros((rows,cols),dtype='uint8') 40 | 41 | for image in images3: 42 | result3+=image//5 43 | 44 | cv2.imwrite('Image3.jpg',result3) 45 | 46 | 47 | for i in range(16,21): 48 | img=cv2.imread(f'{i}.jpg',0) 49 | images4.append(img) 50 | rows,cols=img.shape 51 | 52 | result4=np.zeros((rows,cols),dtype='uint8') 53 | 54 | for image in images4: 55 | result4+=image//5 56 | 57 | cv2.imwrite('Image4.jpg',result4) 58 | 59 | img1=cv2.imread('Image1.jpg',0) 60 | img2=cv2.imread('Image2.jpg',0) 61 | img3=cv2.imread('Image3.jpg',0) 62 | img4=cv2.imread('Image4.jpg',0) 63 | 64 | x1,y1=img1.shape 65 | x2,y2=img2.shape 66 | x3,y3=img3.shape 67 | x4,y4=img4.shape 68 | 69 | imgh1=cv2.hconcat([img1,img2]) 70 | imgh2=cv2.hconcat([img3,img4]) 71 | imgv=cv2.vconcat([imgh1,imgh2]) 72 | cv2.imwrite('Result.jpg',imgv) 73 | cv2.waitKey() -------------------------------------------------------------------------------- /Assignment22/result/board.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/board.jpg -------------------------------------------------------------------------------- /Assignment22/result/girl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/girl.jpg -------------------------------------------------------------------------------- /Assignment22/result/hidden_word.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/hidden_word.jpg -------------------------------------------------------------------------------- /Assignment22/result/highway(car_elimination).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/highway(car_elimination).jpg -------------------------------------------------------------------------------- /Assignment22/result/highway.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/highway.jpg -------------------------------------------------------------------------------- /Assignment22/result/merge_face1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/merge_face1.jpg -------------------------------------------------------------------------------- /Assignment22/result/merge_face2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/merge_face2.jpg -------------------------------------------------------------------------------- /Assignment22/result/nature.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/nature.jpg -------------------------------------------------------------------------------- /Assignment22/result/noisy_picture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/noisy_picture.jpg -------------------------------------------------------------------------------- /Assignment22/result/paint.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/paint.jpg -------------------------------------------------------------------------------- /Assignment22/result/paris.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/paris.jpg -------------------------------------------------------------------------------- /Assignment22/result/parisa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/parisa.jpg -------------------------------------------------------------------------------- /Assignment22/result/space.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment22/result/space.jpg -------------------------------------------------------------------------------- /Assignment23/README.md: -------------------------------------------------------------------------------- 1 | # Face emoji 2 | 3 | 4 | # Eyes , lips 5 | 6 | 7 | 8 | 9 | # Pixelate 10 | 11 | 12 | 13 | 14 | # Flip 15 | 16 | 17 | -------------------------------------------------------------------------------- /Assignment23/Result/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Assignment23/Result/eyes_lips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment23/Result/eyes_lips.png -------------------------------------------------------------------------------- /Assignment23/Result/face_emoji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment23/Result/face_emoji.png -------------------------------------------------------------------------------- /Assignment23/Result/flip.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment23/Result/flip.jpg -------------------------------------------------------------------------------- /Assignment23/Result/pixelate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment23/Result/pixelate.png -------------------------------------------------------------------------------- /Assignment23/code/FaceDetection.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | 4 | 5 | file_face = 'haarcascade_frontalface_default.xml' 6 | face_detector = cv2.CascadeClassifier(file_face) 7 | 8 | file_eye = 'haarcascade_eye.xml' 9 | eye_detector = cv2.CascadeClassifier(file_eye) 10 | 11 | file_mouth = 'mouth.xml' 12 | mouth_detector = cv2.CascadeClassifier(file_mouth) 13 | 14 | emoji_face = cv2.imread('face5.png',0) 15 | emoji_eye = cv2.imread('eye6.png',0) 16 | emoji_mouth = cv2.imread('lips8.jpg',0) 17 | 18 | 19 | 20 | vid = cv2.VideoCapture(0) 21 | 22 | flag_face = False 23 | 24 | while (True): 25 | 26 | ret, frame = vid.read() 27 | 28 | 29 | if ret == False: 30 | break 31 | 32 | 33 | 34 | frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 35 | cv2.imshow('frame', frame_gray) 36 | f=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY) 37 | 38 | faces = face_detector.detectMultiScale(frame_gray, 1.3) 39 | eyes = eye_detector.detectMultiScale(frame_gray, 1.1) 40 | mouth = mouth_detector.detectMultiScale(frame_gray, 1.1) 41 | 42 | if cv2.waitKey(1) & 0xFF == ord('1'): 43 | 44 | 45 | for (x, y, w, h) in faces: 46 | emoji_face_resized = cv2.resize(emoji_face, (w, h)) 47 | frame_gray[y:y+h,x:x+w]=emoji_face_resized 48 | for i in range(y,y+h): 49 | for j in range(x,x+w): 50 | if frame_gray[i,j]>=246 and frame_gray[i,j]<=255: 51 | frame_gray[i,j]=f[i,j] 52 | 53 | 54 | 55 | if cv2.waitKey(1) & 0xFF == ord('2'): 56 | for (ex, ey, ew, eh) in eyes: 57 | emoji_eye_resized = cv2.resize(emoji_eye, (ew, eh)) 58 | frame_gray[ey:ey+eh, ex:ex+ew] = emoji_eye_resized 59 | for i in range(ey,ey+eh): 60 | for j in range(ex,ex+ew): 61 | if frame_gray[i,j]==0: 62 | frame_gray[i,j]=f[i,j] 63 | 64 | 65 | 66 | 67 | for (mx, my, mw, mh) in mouth: 68 | emoji_mouth_resized = cv2.resize(emoji_mouth, (mw, mh)) 69 | frame_gray[my:my + mh, mx:mx + mw] = emoji_mouth_resized 70 | for i in range(my,my+mh): 71 | for j in range(mx,mx+mw): 72 | if frame_gray[i,j]==255: 73 | frame_gray[i,j]=f[i,j] 74 | 75 | cv2.imshow('frame', frame_gray) 76 | 77 | if cv2.waitKey(1) & 0xFF == ord('3'): 78 | for (x, y, w, h) in faces: 79 | temp=cv2.resize(frame_gray[y:y+h,x:x+w],(16,16),interpolation=cv2.INTER_LINEAR) 80 | frame_gray[y:y+h,x:x+w]=cv2.resize(temp,(w,h),interpolation=cv2.INTER_NEAREST) 81 | 82 | cv2.imshow('frame',frame_gray) 83 | 84 | if cv2.waitKey(1) & 0xFF == ord('4'): 85 | for (x,y,w,h) in faces: 86 | frame_gray[y:y+h,x:x+w]= cv2.rotate(frame_gray[y:y+h,x:x+w],cv2.ROTATE_90_CLOCKWISE) 87 | 88 | cv2.imshow('frame',frame_gray) 89 | 90 | cv2.imshow('frame', frame_gray) 91 | 92 | 93 | if cv2.waitKey(1) & 0xFF == ord('q'): 94 | break 95 | 96 | vid.release() 97 | cv2.destroyAllWindows() 98 | 99 | 100 | -------------------------------------------------------------------------------- /Assignment23/files/images/eye6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment23/files/images/eye6.png -------------------------------------------------------------------------------- /Assignment23/files/images/face5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment23/files/images/face5.png -------------------------------------------------------------------------------- /Assignment23/files/images/lips8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment23/files/images/lips8.jpg -------------------------------------------------------------------------------- /Assignment24/README.md: -------------------------------------------------------------------------------- 1 | # Filter on face 2 | 3 | 4 | 5 | https://user-images.githubusercontent.com/71878421/143221749-c3642920-6abb-433e-8db8-200b4428fdbd.mp4 6 | 7 | -------------------------------------------------------------------------------- /Assignment24/RFB-320.tflite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment24/RFB-320.tflite -------------------------------------------------------------------------------- /Assignment24/TFLiteFaceAlignment.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- coding:utf-8 -*- 3 | 4 | import numpy as np 5 | import cv2 6 | import tensorflow as tf 7 | from functools import partial 8 | import time 9 | from TFLiteFaceDetector import UltraLightFaceDetecion 10 | import sys 11 | 12 | class CoordinateAlignmentModel(): 13 | def __init__(self, filepath, marker_nums=106, input_size=(192, 192)): 14 | self._marker_nums = marker_nums 15 | self._input_shape = input_size 16 | self._trans_distance = self._input_shape[-1] / 2.0 17 | 18 | self.eye_bound = ([35, 41, 40, 42, 39, 37, 33, 36], 19 | [89, 95, 94, 96, 93, 91, 87, 90]) 20 | 21 | # tflite model init 22 | self._interpreter = tf.lite.Interpreter(model_path=filepath) 23 | self._interpreter.allocate_tensors() 24 | 25 | # model details 26 | input_details = self._interpreter.get_input_details() 27 | output_details = self._interpreter.get_output_details() 28 | 29 | # inference helper 30 | self._set_input_tensor = partial(self._interpreter.set_tensor, 31 | input_details[0]["index"]) 32 | self._get_output_tensor = partial(self._interpreter.get_tensor, 33 | output_details[0]["index"]) 34 | 35 | self.pre_landmarks = None 36 | 37 | def _calibrate(self, pred, thd, skip=6): 38 | if self.pre_landmarks is not None: 39 | for i in range(pred.shape[0]): 40 | if abs(self.pre_landmarks[i, 0] - pred[i, 0]) > skip: 41 | self.pre_landmarks[i, 0] = pred[i, 0] 42 | elif abs(self.pre_landmarks[i, 0] - pred[i, 0]) > thd: 43 | self.pre_landmarks[i, 0] += pred[i, 0] 44 | self.pre_landmarks[i, 0] /= 2 45 | 46 | if abs(self.pre_landmarks[i, 1] - pred[i, 1]) > skip: 47 | self.pre_landmarks[i, 1] = pred[i, 1] 48 | elif abs(self.pre_landmarks[i, 1] - pred[i, 1]) > thd: 49 | self.pre_landmarks[i, 1] += pred[i, 1] 50 | self.pre_landmarks[i, 1] /= 2 51 | else: 52 | self.pre_landmarks = pred 53 | 54 | def _preprocessing(self, img, bbox, factor=3.0): 55 | """Pre-processing of the BGR image. Adopting warp affine for face corp. 56 | 57 | Arguments 58 | ---------- 59 | img {numpy.array} : the raw BGR image. 60 | bbox {numpy.array} : bounding box with format: {x1, y1, x2, y2, score}. 61 | 62 | Keyword Arguments 63 | ---------- 64 | factor : max edge scale factor for bounding box cropping. 65 | 66 | Returns 67 | ---------- 68 | inp : input tensor with NHWC format. 69 | M : warp affine matrix. 70 | """ 71 | 72 | maximum_edge = max(bbox[2:4] - bbox[:2]) * factor 73 | scale = self._trans_distance * 4.0 / maximum_edge 74 | center = (bbox[2:4] + bbox[:2]) / 2.0 75 | cx, cy = self._trans_distance - scale * center 76 | 77 | M = np.array([[scale, 0, cx], [0, scale, cy]]) 78 | 79 | cropped = cv2.warpAffine(img, M, self._input_shape, borderValue=0.0) 80 | inp = cropped[..., ::-1].astype(np.float32) 81 | 82 | return inp[None, ...], M 83 | 84 | def _inference(self, input_tensor): 85 | self._set_input_tensor(input_tensor) 86 | self._interpreter.invoke() 87 | 88 | return self._get_output_tensor()[0] 89 | 90 | def _postprocessing(self, out, M): 91 | iM = cv2.invertAffineTransform(M) 92 | col = np.ones((self._marker_nums, 1)) 93 | 94 | out = out.reshape((self._marker_nums, 2)) 95 | 96 | out += 1 97 | out *= self._trans_distance 98 | 99 | out = np.concatenate((out, col), axis=1) 100 | 101 | return out @ iM.T # dot product 102 | 103 | def get_landmarks(self, image, detected_faces=None): 104 | """Predict the landmarks for each face present in the image. 105 | 106 | This function predicts a set of 68 2D or 3D images, one for each image present. 107 | If detect_faces is None the method will also run a face detector. 108 | 109 | Arguments 110 | ---------- 111 | image {numpy.array} : The input image. 112 | 113 | Keyword Arguments 114 | ---------- 115 | detected_faces {list of numpy.array} : list of bounding boxes, one for each 116 | face found in the image (default: {None}, format: {x1, y1, x2, y2, score}) 117 | """ 118 | 119 | for box in detected_faces: 120 | inp, M = self._preprocessing(image, box) 121 | out = self._inference(inp) 122 | pred = self._postprocessing(out, M) 123 | 124 | # self._calibrate(pred, 1, skip=6) 125 | # yield self.pre_landmarks 126 | 127 | yield pred 128 | 129 | 130 | def zoom_effect(frame,landmarks): 131 | #print('landmarks',landmarks) 132 | x,y,w,h=cv2.boundingRect(landmarks) 133 | rows,cols,_=frame.shape 134 | mask=np.zeros((rows,cols,3),dtype='uint8') 135 | cv2.drawContours(mask,[landmarks],-1,(255,255,255),-1) 136 | frame_2x=cv2.resize(frame,None,fx=2,fy=2) 137 | mask_2x=cv2.resize(mask,None,fx=2,fy=2) 138 | 139 | frame_2x=frame_2x/255 140 | mask_2x=mask_2x/255 141 | 142 | frame_target=frame[int(y-(h*0.5)):int(y+h+(h*0.5)),int(x-(w*0.5)):int(x+w+(w*0.5))] 143 | frame_target=frame_target/255 144 | 145 | foreground=cv2.multiply(mask_2x,frame_2x) 146 | background=cv2.multiply(frame_target,1-mask_2x[y*2:(y+h)*2,x*2:(x+w)*2]) 147 | res=cv2.add(background,foreground[y*2:(y+h)*2,x*2:(x+w)*2]) 148 | frame[int(y-(0.5*h)):int(y+h+(0.5*h)),int(x-(0.5*w)):int(x+w+(0.5*w))]=res*255 149 | return frame 150 | 151 | 152 | if __name__ == '__main__': 153 | 154 | #fd:face detector 155 | #fa:face alignment 156 | fd = UltraLightFaceDetecion("RFB-320.tflite",conf_threshold=0.88) 157 | fa = CoordinateAlignmentModel("coor_2d106.tflite") 158 | 159 | cap=cv2.VideoCapture(0) 160 | 161 | while True: 162 | ret,frame=cap.read() 163 | if not ret: 164 | break 165 | #left_eye:35-36-33-37-39-42-40-41 166 | #right_eye:81-90-89-87-91-93-96-94-95 167 | #mouth:52-55-56-53-59-58-69-68-67-71 168 | 169 | #frame=cv2.imread('input/paris.jpg') 170 | #image=cv2.resize(image,(0,0),fx=0.5,fy=0.5) 171 | 172 | rows=frame.shape[0] 173 | cols=frame.shape[1] 174 | 175 | 176 | 177 | color = (125, 255, 125) 178 | boxes, scores = fd.inference(frame) 179 | 180 | for pred in fa.get_landmarks(frame, boxes):#for loop for any person in image 181 | pred_int=np.round(pred).astype(np.int) 182 | #print('pred_int',pred_int) 183 | 184 | landmarks_left_eye=[] 185 | for i in[35,36,33,37,39,42,40,41]: 186 | landmarks_left_eye.append(tuple(pred_int[i])) 187 | 188 | landmarks_right_eye=[] 189 | for i in[81,90,89,87,91,93,96,94,95]: 190 | landmarks_right_eye.append(tuple(pred_int[i])) 191 | 192 | landmarks_mouth=[] 193 | for i in[52,55,59,58,69,68,67,71,63,64]: 194 | landmarks_mouth.append(tuple(pred_int[i])) 195 | 196 | 197 | #landmarks_left_eye=np.array([[tuple(pred_int[i]) for i in range(len(pred_int)) if i in[35,36,33,37,39,42,40,41]]]) 198 | #landmarks_right_eye=[tuple(pred_int[i]) for i in range(len(pred_int)) if i in[81,90,89,87,91,93,96,94,95]] 199 | #landmarks_mouth=[tuple(pred_int[i]) for i in range(len(pred_int)) if i in[52,55,56,53,59,58,69,68,67,71]] 200 | 201 | landmarks_left_eye=np.array([landmarks_left_eye]) 202 | landmarks_right_eye=np.array([landmarks_right_eye]) 203 | landmarks_mouth=np.array([landmarks_mouth]) 204 | 205 | frame=zoom_effect(frame,landmarks_left_eye) 206 | #print('lefteye_landmark',landmarks_left_eye) 207 | frame=zoom_effect(frame,landmarks_right_eye) 208 | frame=zoom_effect(frame,landmarks_mouth) 209 | 210 | 211 | 212 | # cv2.drawContours(mask,[landmarks_left_eye],-1,(255,255,255),-1) 213 | # cv2.drawContours(mask,[landmarks_right_eye],-1,(255,255,255),-1) 214 | # cv2.drawContours(mask,[landmarks_mouth],-1,(255,255,255),-1) 215 | # for index,p in enumerate(landmarks_left_eye,landmarks_right_eye,landmarks_mouth): 216 | # #p=coordinate of landmark 217 | # cv2.circle(image, tuple(p), 1, color,1, cv2.LINE_AA) 218 | # cv2.putText(image,str(index),p,cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255),1) 219 | 220 | #mask=mask / 255 221 | #result=image*mask 222 | # frame=zoom_effect(frame,landmarks_mouth) 223 | #cv2.imwrite('output/result.jpg',frame) 224 | cv2.imshow("result",frame) 225 | if cv2.waitKey(1)==ord('q'): 226 | break 227 | 228 | cap.release() 229 | cv2.destroyAllWindows() 230 | 231 | 232 | 233 | 234 | 235 | -------------------------------------------------------------------------------- /Assignment24/TFLiteFaceDetector.py: -------------------------------------------------------------------------------- 1 | from functools import partial 2 | import cv2 3 | import tensorflow as tf 4 | import numpy as np 5 | 6 | 7 | class UltraLightFaceDetecion(): 8 | def __init__(self, filepath, input_size=(320, 240), conf_threshold=0.6, 9 | center_variance=0.1, size_variance=0.2, 10 | nms_max_output_size=200, nms_iou_threshold=0.3) -> None: 11 | 12 | self._feature_maps = np.array([[40, 30], [20, 15], [10, 8], [5, 4]]) 13 | self._min_boxes = [[10, 16, 24], [32, 48], [64, 96], [128, 192, 256]] 14 | 15 | self._resize = partial(cv2.resize, dsize=input_size) 16 | self._input_size = np.array(input_size)[:, None] 17 | 18 | self._anchors_xy, self._anchors_wh = self._generate_anchors() 19 | self._conf_threshold = conf_threshold 20 | self._center_variance = center_variance 21 | self._size_variance = size_variance 22 | self._nms = partial(tf.image.non_max_suppression, 23 | max_output_size=nms_max_output_size, 24 | iou_threshold=nms_iou_threshold) 25 | 26 | # tflite model init 27 | self._interpreter = tf.lite.Interpreter(model_path=filepath) 28 | self._interpreter.allocate_tensors() 29 | 30 | # model details 31 | input_details = self._interpreter.get_input_details() 32 | output_details = self._interpreter.get_output_details() 33 | 34 | # inference helper 35 | self._set_input_tensor = partial(self._interpreter.set_tensor, 36 | input_details[0]["index"]) 37 | self._get_boxes_tensor = partial(self._interpreter.get_tensor, 38 | output_details[0]["index"]) 39 | self._get_scores_tensor = partial(self._interpreter.get_tensor, 40 | output_details[1]["index"]) 41 | 42 | def _generate_anchors(self): 43 | anchors = [] 44 | for feature_map_w_h, min_box in zip(self._feature_maps, self._min_boxes): 45 | 46 | wh_grid = min_box / self._input_size 47 | wh_grid = np.tile(wh_grid.T, (np.prod(feature_map_w_h), 1)) 48 | 49 | xy_grid = np.meshgrid(range(feature_map_w_h[0]), 50 | range(feature_map_w_h[1])) 51 | xy_grid = np.add(xy_grid, 0.5) 52 | 53 | xy_grid /= feature_map_w_h[..., None, None] 54 | 55 | xy_grid = np.stack(xy_grid, axis=-1) 56 | xy_grid = np.tile(xy_grid, [1, 1, len(min_box)]) 57 | xy_grid = xy_grid.reshape(-1, 2) 58 | 59 | prior = np.concatenate((xy_grid, wh_grid), axis=-1) 60 | anchors.append(prior) 61 | 62 | anchors = np.concatenate(anchors, axis=0) 63 | anchors = np.clip(anchors, 0.0, 1.0) 64 | 65 | return anchors[:, :2], anchors[:, 2:] 66 | 67 | def _pre_processing(self, img): 68 | resized = self._resize(img) 69 | image_rgb = resized[..., ::-1] 70 | image_norm = image_rgb.astype(np.float32) 71 | cv2.normalize(image_norm, image_norm, 72 | alpha=-1, beta=1, norm_type=cv2.NORM_MINMAX) 73 | return image_norm[None, ...] 74 | 75 | def inference(self, img): 76 | # BGR image to tensor 77 | input_tensor = self._pre_processing(img) 78 | 79 | # set tensor and invoke 80 | self._set_input_tensor(input_tensor) 81 | self._interpreter.invoke() 82 | 83 | # get results 84 | boxes = self._get_boxes_tensor()[0] 85 | scores = self._get_scores_tensor()[0] 86 | 87 | # decode boxes to corner format 88 | boxes, scores = self._post_processing(boxes, scores) 89 | boxes *= np.tile(img.shape[1::-1], 2) 90 | 91 | return boxes, scores 92 | 93 | def _post_processing(self, boxes, scores): 94 | # bounding box regression 95 | boxes = self._decode_regression(boxes) 96 | scores = scores[:, 1] 97 | 98 | # confidence threshold filter 99 | conf_mask = self._conf_threshold < scores 100 | boxes, scores = boxes[conf_mask], scores[conf_mask] 101 | 102 | # non-maximum suppression 103 | nms_mask = self._nms(boxes=boxes, scores=scores) 104 | boxes = np.take(boxes, nms_mask, axis=0) 105 | 106 | return boxes, scores 107 | 108 | def _decode_regression(self, reg): 109 | # bounding box regression 110 | center_xy = reg[:, :2] * self._center_variance * \ 111 | self._anchors_wh + self._anchors_xy 112 | center_wh = np.exp( 113 | reg[:, 2:] * self._size_variance) * self._anchors_wh / 2 114 | 115 | # center to corner 116 | start_xy = center_xy - center_wh 117 | end_xy = center_xy + center_wh 118 | 119 | boxes = np.concatenate((start_xy, end_xy), axis=-1) 120 | boxes = np.clip(boxes, 0.0, 1.0) 121 | 122 | return boxes 123 | 124 | 125 | if __name__ == '__main__': 126 | import sys 127 | import time 128 | 129 | fd = UltraLightFaceDetecion("RFB-320.tflite", 130 | conf_threshold=0.88) 131 | 132 | cap = cv2.VideoCapture(sys.argv[1]) 133 | color = (125, 255, 125) 134 | 135 | while True: 136 | ret, frame = cap.read() 137 | 138 | if not ret: 139 | break 140 | 141 | start_time = time.perf_counter() 142 | boxes, scores = fd.inference(frame) 143 | print(time.perf_counter() - start_time) 144 | 145 | for det in boxes.astype(np.int32): 146 | cv2.rectangle(frame, (det[0], det[1]), 147 | (det[2], det[3]), (2, 255, 0), 1) 148 | 149 | cv2.imshow("result", frame) 150 | if cv2.waitKey(1) == ord('q'): 151 | break 152 | -------------------------------------------------------------------------------- /Assignment24/coor_2d106.tflite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment24/coor_2d106.tflite -------------------------------------------------------------------------------- /Assignment24/result/1: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Assignment24/result/result.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment24/result/result.mp4 -------------------------------------------------------------------------------- /Assignment25/README.md: -------------------------------------------------------------------------------- 1 | # Blur filter 2 | 3 | 4 | # Edge detection 5 | 6 | 7 | # Horizontal edge detection 8 | 9 | 10 | 11 | # Vertical edge detection 12 | 13 | 14 | # Dynamic filter 15 | 16 |

17 | 18 | 19 | 20 | 21 | 22 | 23 |

24 | 25 | 26 | 27 | 28 | https://user-images.githubusercontent.com/71878421/143680653-92f41cb0-9d48-4ad4-9484-7b289eb0cbc3.mp4 29 | 30 | -------------------------------------------------------------------------------- /Assignment25/building.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | 4 | img_building=cv2.imread('building.tif') 5 | img_building=cv2.cvtColor(img_building,cv2.COLOR_BGR2GRAY) 6 | vertical_filter=np.array([[-1,0,1], 7 | [-1,0,1], 8 | [-1,0,1]]) 9 | 10 | 11 | horizontal_filter=np.array([[-1,-1,-1], 12 | [0,0,0], 13 | [1,1,1]]) 14 | 15 | result_vertical=np.zeros(img_building.shape) 16 | 17 | result_horizontal=np.zeros(img_building.shape) 18 | rows,cols=img_building.shape 19 | 20 | for i in range(1,rows-1): 21 | for j in range(1,cols-1): 22 | small_img=img_building[i-1:i+2,j-1:j+2] 23 | result_vertical[i,j]=np.sum(small_img*vertical_filter) 24 | result_horizontal[i,j]=np.sum(small_img*horizontal_filter) 25 | 26 | 27 | 28 | 29 | 30 | #print(result) 31 | cv2.imwrite('vertical_filter_building_output.jpg',result_vertical) 32 | cv2.imwrite('horizontal_filter_building_output.jpg',result_horizontal) 33 | cv2.waitKey() -------------------------------------------------------------------------------- /Assignment25/dynamic_filter.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | 4 | filter_size=int(input('filter size:')) 5 | img=cv2.imread('paris.jpg',0) 6 | cv2.imwrite('paris_gray.jpg',img) 7 | rows,cols=img.shape 8 | result=np.zeros(img.shape) 9 | 10 | 11 | 12 | 13 | def filter(filter_size): 14 | 15 | filter=np.ones((filter_size,filter_size))/(filter_size*filter_size) 16 | 17 | 18 | if filter_size==3: 19 | for i in range(1,rows-1): 20 | for j in range(1,cols-1): 21 | small_img=img[i-1:i+2,j-1:j+2] 22 | result[i,j]=np.sum(small_img*filter) 23 | 24 | return result 25 | 26 | elif filter_size==5: 27 | for i in range(2,rows-2): 28 | for j in range(2,cols-2): 29 | small_img=img[i-2:i+3,j-2:j+3] 30 | result[i,j]=np.sum(small_img*filter) 31 | 32 | return result 33 | 34 | elif filter_size==7: 35 | for i in range(3,rows-3): 36 | for j in range(3,cols-3): 37 | small_img=img[i-3:i+4,j-3:j+4] 38 | result[i,j]=np.sum(small_img*filter) 39 | 40 | return result 41 | 42 | elif filter_size==15: 43 | for i in range(7,rows-7): 44 | for j in range(7,cols-7): 45 | small_img=img[i-7:i+8,j-7:j+8] 46 | result[i,j]=np.sum(small_img*filter) 47 | 48 | return result 49 | 50 | 51 | img_result=filter(filter_size) 52 | 53 | cv2.imwrite(f'{filter_size}x{filter_size} filter.jpg',img_result) 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /Assignment25/flower.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | 4 | img_flower_input=cv2.imread('flower_input.jpg') 5 | img_flower_input=cv2.cvtColor(img_flower_input,cv2.COLOR_BGR2GRAY) 6 | mask=np.ones((25,25))/625.0 7 | result=np.zeros((img_flower_input.shape)) 8 | 9 | rows,cols=img_flower_input.shape 10 | 11 | for i in range(12,rows-12): 12 | for j in range(12,cols-12): 13 | small_img=img_flower_input[i-12:i+13,j-12:j+13] 14 | if np.all(small_img[0:11,0:11]>=0) and np.all(small_img[0:11,0:11]<=150): 15 | img_flower_input[i,j]=np.sum(small_img*mask) 16 | result=img_flower_input 17 | cv2.imwrite('flower.jpg',result) 18 | 19 | 20 | -------------------------------------------------------------------------------- /Assignment25/lion.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | 4 | mask=np.array([[0,-1,0], 5 | [-1,4,-1], 6 | [0,-1,0]]) 7 | 8 | img_lion=cv2.imread('lion.png',0) 9 | result=np.zeros(img_lion.shape) 10 | 11 | rows,cols=img_lion.shape 12 | 13 | for i in range(1,rows-1): 14 | for j in range(1,cols-1): 15 | small_img=img_lion[i-1:i+2,j-1:j+2] 16 | result[i,j]=np.sum(small_img*mask) 17 | 18 | 19 | cv2.imwrite('lion_output.jpg',result) 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Assignment25/result/15x15 filter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment25/result/15x15 filter.jpg -------------------------------------------------------------------------------- /Assignment25/result/3x3 filter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment25/result/3x3 filter.jpg -------------------------------------------------------------------------------- /Assignment25/result/5x5 filter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment25/result/5x5 filter.jpg -------------------------------------------------------------------------------- /Assignment25/result/7x7 filter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment25/result/7x7 filter.jpg -------------------------------------------------------------------------------- /Assignment25/result/flower.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment25/result/flower.jpg -------------------------------------------------------------------------------- /Assignment25/result/horizontal_filter_building_output.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment25/result/horizontal_filter_building_output.jpg -------------------------------------------------------------------------------- /Assignment25/result/lion_output.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment25/result/lion_output.jpg -------------------------------------------------------------------------------- /Assignment25/result/paris_gray.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment25/result/paris_gray.jpg -------------------------------------------------------------------------------- /Assignment25/result/vertical_filter_building_output.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment25/result/vertical_filter_building_output.jpg -------------------------------------------------------------------------------- /Assignment25/shades_of_gray.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | 4 | 5 | video=cv2.VideoCapture(0) 6 | filter=np.ones((15,15))/125 7 | upper_left = (50, 50) 8 | bottom_right = (300, 300) 9 | 10 | 11 | while(True): 12 | 13 | ret,frame=video.read() 14 | 15 | if ret==False: 16 | break 17 | 18 | frame_gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) 19 | border=frame_gray[150:250,250:350] 20 | 21 | frame_gray=cv2.filter2D(frame_gray,0,kernel=filter) 22 | 23 | ii=-1 24 | jj=-1 25 | 26 | for i in range(150,250): 27 | ii=ii+1 28 | for j in range(250,350): 29 | jj=jj+1 30 | frame_gray[i,j]=border[ii-1,jj-1] 31 | jj=-1 32 | 33 | avg_border=np.average(border) 34 | if avg_border>=0 and avg_border<=70: 35 | cv2.putText(frame_gray,'Black',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 36 | elif avg_border>=71 and avg_border<=180: 37 | cv2.putText(frame_gray,'Gray',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 38 | elif avg_border>=181 and avg_border<=255: 39 | cv2.putText(frame_gray,'White',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 40 | 41 | cv2.imshow('frame',frame_gray) 42 | 43 | if cv2.waitKey(1) & 0xFF == ord('q'): 44 | break 45 | video.release() 46 | cv2.destroyAllWindows() 47 | 48 | 49 | -------------------------------------------------------------------------------- /Assignment26-2/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Folders 3 | 4 | 5 | # 1 6 | 7 | 8 | # 3 9 | 10 | 11 | # 9 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | # snowfall 21 | 22 | 23 | -------------------------------------------------------------------------------- /Assignment26-2/mnsit.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import os 3 | img=cv2.imread('mnist.png',0) 4 | rows=img.shape[0] 5 | cols=img.shape[1] 6 | height=rows//(10*5) 7 | width=cols//100 8 | counter=0 9 | folder_counter=-1 10 | 11 | for i in range(10): 12 | os.makedirs(f'mnist_images/{i}') 13 | 14 | for k in range(0,rows,height*5): 15 | folder_counter+=1 16 | for i in range(k,k+(height*5),height): 17 | for j in range(0,cols,width): 18 | small_img=img[i:i+height,j:j+width] 19 | cv2.imwrite(f'mnist_images/{folder_counter}/{counter}.jpg',small_img) 20 | counter+=1 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Assignment26-2/result/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment26-2/result/1.png -------------------------------------------------------------------------------- /Assignment26-2/result/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment26-2/result/3.png -------------------------------------------------------------------------------- /Assignment26-2/result/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment26-2/result/9.png -------------------------------------------------------------------------------- /Assignment26-2/result/folders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment26-2/result/folders.png -------------------------------------------------------------------------------- /Assignment26-2/snowfall.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import glob 3 | import random 4 | import os 5 | import imageio 6 | 7 | def make_snow(): 8 | image_winter=cv2.imread('winter.jpg',0) 9 | rows=image_winter.shape[0] 10 | cols=image_winter.shape[1] 11 | file_counter=0 12 | step=0 13 | 14 | list_len=3 15 | snow_x=[] 16 | snow_y=[] 17 | snow_r=[] 18 | r_move=[] 19 | counter=0 20 | 21 | for i in range(0,rows,3): 22 | step+=1 23 | for j in range(list_len): 24 | x=random.randint(4,cols) 25 | y=random.randint(0,5) 26 | r=random.randint(3,4) 27 | snow_x.append(x) 28 | snow_y.append(y) 29 | snow_r.append(r) 30 | 31 | for k in range(list_len*step): 32 | 33 | image=cv2.circle(image_winter,(snow_x[k],snow_y[k]),snow_r[k],(200,210,215),-1) 34 | if k%4==0: 35 | snow_y[k]+=4 36 | elif k%3==0: 37 | snow_x[k]+=3 38 | snow_y[k]+=3 39 | else: 40 | snow_x[k]-=4 41 | snow_y[k]+=3 42 | 43 | cv2.imwrite(f'images/{counter}.jpg',image) 44 | counter+=1 45 | image_winter=cv2.imread('winter.jpg',0) 46 | 47 | return counter 48 | 49 | counter=make_snow() 50 | 51 | def read_frames(): 52 | frame_array=[] 53 | #print(counter) 54 | images=[] 55 | # for i in range(counter): 56 | # for filename in glob.glob(f'images/{i}.jpg'): 57 | # if filename.endswith('.jpg'): 58 | # file_path=os.path.join(filename) 59 | # images.append(imageio.imread(file_path)) 60 | # imageio.mimsave('images/snowfall.gif',images) 61 | 62 | for i in range(counter): 63 | for filename in glob.glob(f'images/{i}.jpg'): 64 | frame=cv2.imread(filename,0) 65 | height,width=frame.shape 66 | size=(width,height) 67 | frame_array.append(frame) 68 | out=cv2.VideoWriter('snowfall.avi',cv2.VideoWriter_fourcc(*'DIVX'),20, size,0) 69 | for i in range(len(frame_array)): 70 | out.write(frame_array[i]) 71 | 72 | out.release() 73 | 74 | read_frames() 75 | -------------------------------------------------------------------------------- /Assignment26/FaceDetection_blurface.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | 4 | 5 | file_face = 'haarcascade_frontalface_default.xml' 6 | face_detector = cv2.CascadeClassifier(file_face) 7 | 8 | file_eye = 'haarcascade_eye.xml' 9 | eye_detector = cv2.CascadeClassifier(file_eye) 10 | 11 | file_mouth = 'mouth.xml' 12 | mouth_detector = cv2.CascadeClassifier(file_mouth) 13 | 14 | emoji_face = cv2.imread('face5.png',0) 15 | emoji_eye = cv2.imread('eye6.png',0) 16 | emoji_mouth = cv2.imread('lips8.jpg',0) 17 | 18 | 19 | 20 | vid = cv2.VideoCapture(0) 21 | 22 | flag_face = False 23 | 24 | while (True): 25 | 26 | ret, frame = vid.read() 27 | 28 | 29 | if ret == False: 30 | break 31 | 32 | 33 | filter=np.ones((7,7))/49 34 | 35 | 36 | frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 37 | cv2.imshow('frame', frame_gray) 38 | f=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY) 39 | 40 | faces = face_detector.detectMultiScale(frame_gray, 1.3) 41 | eyes = eye_detector.detectMultiScale(frame_gray, 1.1) 42 | mouth = mouth_detector.detectMultiScale(frame_gray, 1.1) 43 | 44 | 45 | 46 | if cv2.waitKey(1) & 0xFF == ord('1'): 47 | 48 | 49 | for (x, y, w, h) in faces: 50 | emoji_face_resized = cv2.resize(emoji_face, (w, h)) 51 | frame_gray[y:y+h,x:x+w]=emoji_face_resized 52 | for i in range(y,y+h): 53 | for j in range(x,x+w): 54 | if frame_gray[i,j]>=246 and frame_gray[i,j]<=255: 55 | frame_gray[i,j]=f[i,j] 56 | 57 | 58 | 59 | if cv2.waitKey(1) & 0xFF == ord('2'): 60 | 61 | for (ex, ey, ew, eh) in eyes: 62 | emoji_eye_resized = cv2.resize(emoji_eye, (ew, eh)) 63 | frame_gray[ey:ey+eh, ex:ex+ew] = emoji_eye_resized 64 | for i in range(ey,ey+eh): 65 | for j in range(ex,ex+ew): 66 | if frame_gray[i,j]==0: 67 | frame_gray[i,j]=f[i,j] 68 | 69 | 70 | 71 | 72 | for (mx, my, mw, mh) in mouth: 73 | emoji_mouth_resized = cv2.resize(emoji_mouth, (mw, mh)) 74 | frame_gray[my:my + mh, mx:mx + mw] = emoji_mouth_resized 75 | for i in range(my,my+mh): 76 | for j in range(mx,mx+mw): 77 | if frame_gray[i,j]==255: 78 | frame_gray[i,j]=f[i,j] 79 | 80 | cv2.imshow('frame', frame_gray) 81 | 82 | if cv2.waitKey(1) & 0xFF == ord('3'): 83 | for (x, y, w, h) in faces: 84 | temp=cv2.resize(frame_gray[y:y+h,x:x+w],(16,16),interpolation=cv2.INTER_LINEAR) 85 | frame_gray[y:y+h,x:x+w]=cv2.resize(temp,(w,h),interpolation=cv2.INTER_NEAREST) 86 | 87 | cv2.imshow('frame',frame_gray) 88 | 89 | if cv2.waitKey(1) & 0xFF == ord('4'): 90 | for (x,y,w,h) in faces: 91 | frame_gray[y:y+h,x:x+w]= cv2.rotate(frame_gray[y:y+h,x:x+w],cv2.ROTATE_90_CLOCKWISE) 92 | 93 | cv2.imshow('frame',frame_gray) 94 | 95 | if cv2.waitKey(1) & 0xFF==ord('5'): 96 | for (x,y,w,h)in faces: 97 | face=cv2.rectangle(frame_gray,(x,y),(x+w,y+h),(0,255,0),1) 98 | face[y:y+h,x:x+w]=cv2.medianBlur(face[y:y+h,x:x+w],35) 99 | cv2.imshow('frame',frame_gray) 100 | 101 | 102 | 103 | cv2.imshow('frame', frame_gray) 104 | 105 | 106 | if cv2.waitKey(1) & 0xFF == ord('q'): 107 | break 108 | 109 | vid.release() 110 | cv2.destroyAllWindows() 111 | 112 | 113 | -------------------------------------------------------------------------------- /Assignment26/README.md: -------------------------------------------------------------------------------- 1 | # low contrast image 2 | 3 | 4 | 5 | # high contrast image 6 | 7 | 8 | -------------------------------------------------------------------------------- /Assignment26/high_contrast.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | 3 | image=cv2.imread('low_contrast.jpg',0) 4 | high_contrast_image=cv2.normalize(image,image,0,255,cv2.NORM_MINMAX) 5 | cv2.imshow('image',image) 6 | cv2.imshow('image',image) 7 | cv2.imwrite('high_contast.jpg',high_contrast_image) 8 | cv2.waitKey(0) -------------------------------------------------------------------------------- /Assignment26/result/high_contrast.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment26/result/high_contrast.jpg -------------------------------------------------------------------------------- /Assignment26/result/low_contrast.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment26/result/low_contrast.jpg -------------------------------------------------------------------------------- /Assignment26/shades_of_gray_highContrast.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | from numpy.lib import average 4 | 5 | 6 | video=cv2.VideoCapture(0) 7 | 8 | frame_width=int(video.get(3)) 9 | frame_height=int(video.get(4)) 10 | size=(frame_width,frame_height) 11 | result=cv2.VideoWriter('output.avi',cv2.VideoWriter_fourcc(*"MJPG"),30,size,0) 12 | filter=np.ones((15,15))/125 13 | upper_left = (50, 50) 14 | bottom_right = (300, 300) 15 | 16 | 17 | while(True): 18 | 19 | ret,frame=video.read() 20 | 21 | if ret==False: 22 | break 23 | 24 | frame_gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) 25 | border=frame_gray[150:250,250:350] 26 | 27 | frame_gray=cv2.filter2D(frame_gray,0,kernel=filter) 28 | 29 | 30 | ii=-1 31 | jj=-1 32 | 33 | for i in range(150,250): 34 | ii=ii+1 35 | for j in range(250,350): 36 | jj=jj+1 37 | frame_gray[i,j]=border[ii-1,jj-1] 38 | jj=-1 39 | 40 | high_contrast_border=cv2.normalize(border,border,0,255,cv2.NORM_MINMAX) 41 | frame_gray[150:250,250:350]=high_contrast_border 42 | avg_border=np.average(border) 43 | 44 | if avg_border>=0 and avg_border<=70: 45 | cv2.putText(frame_gray,'Black',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 46 | elif avg_border>=71 and avg_border<190: 47 | cv2.putText(frame_gray,'Gray',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 48 | elif avg_border>=191 and avg_border<=255: 49 | cv2.putText(frame_gray,'White',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 50 | 51 | 52 | result.write(frame_gray) 53 | cv2.imshow('frame',frame_gray) 54 | 55 | 56 | if cv2.waitKey(1) & 0xFF == ord('q'): 57 | break 58 | video.release() 59 | cv2.destroyAllWindows() 60 | 61 | 62 | -------------------------------------------------------------------------------- /Assignment27/README.md: -------------------------------------------------------------------------------- 1 | # Object detection from scratch 2 | 3 |

4 | 5 | 6 |

7 | 8 | 9 | # Dice detection 10 | 11 |

12 | 13 | 14 |

15 | 16 |

17 | 18 | 19 |

20 | 21 |

22 | 23 | 24 |

25 | 26 |

27 | 28 | 29 |

30 | 31 | 32 | -------------------------------------------------------------------------------- /Assignment27/result/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment27/result/0.jpg -------------------------------------------------------------------------------- /Assignment27/result/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment27/result/1.jpg -------------------------------------------------------------------------------- /Assignment27/result/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment27/result/2.jpg -------------------------------------------------------------------------------- /Assignment27/result/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment27/result/3.jpg -------------------------------------------------------------------------------- /Assignment27/result/hat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment27/result/hat.jpg -------------------------------------------------------------------------------- /Assignment27/result/hat_detected.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment27/result/hat_detected.jpg -------------------------------------------------------------------------------- /Assignment27/result/img0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment27/result/img0.jpg -------------------------------------------------------------------------------- /Assignment27/result/img1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment27/result/img1.jpg -------------------------------------------------------------------------------- /Assignment27/result/img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment27/result/img2.jpg -------------------------------------------------------------------------------- /Assignment27/result/img3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment27/result/img3.jpg -------------------------------------------------------------------------------- /Assignment28/a: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Assignment29/README.md: -------------------------------------------------------------------------------- 1 | # Rubik's cube Solved! 2 | 3 |

4 | 5 | 6 |

7 | 8 | 9 | # Change Color 10 | 11 |

12 | 13 | 14 |

15 | 16 | 17 | # Microsoft logo 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Assignment29/Rubic.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 46, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import matplotlib.pyplot as plt\n", 10 | "import cv2\n" 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": 47, 16 | "metadata": {}, 17 | "outputs": [ 18 | { 19 | "data": { 20 | "text/plain": [ 21 | "" 22 | ] 23 | }, 24 | "execution_count": 47, 25 | "metadata": {}, 26 | "output_type": "execute_result" 27 | }, 28 | { 29 | "data": { 30 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQYAAAD8CAYAAACVSwr3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABm9ElEQVR4nO2dd5wUZba/n7dCp+lJzJCziAFFUVDMGZUkqIAYEMOa1s1R9+5v797dvXfvhrvu6q6rGFZlVUwgIihBwIwKiAEURVCipGFipwrn90f3DD3TMzDDdA8zUg+fZrqrq6ve6q761jnnPe95lYjg4eHhkY52sBvg4eHR/vCEwcPDIwNPGDw8PDLwhMHDwyMDTxg8PDwy8ITBw8Mjg5wIg1LqYqXUWqXUOqXUHbnYh4eHR+5Q2c5jUErpwGfACGAz8B5wpYisyeqOPDw8ckYuLIaTgXUisl5EEsAMYFwO9uPh4ZEjjBxssyewKe31ZmD4vj5QWloq/fr1y0FTPDw8almxYsUuEencnHVzIQzNQil1M3AzQJ8+fVi+fPnBaoqHxyGBUuqr5q6bC1diC9A77XWv1LJ6iMg0ERkmIsM6d26WiHl4eLQRuRCG94CBSqn+SikfMBl4IQf78fDwyBFZdyVExFZKfQeYD+jAwyKyOtv78fDwyB05iTGIyDxgXi627eHhkXu8zEcPD48MPGHw8PDIwBMGDw+PDDxh8PDwyMATBg8Pjww8YfDw8MjAEwYPD48MPGHw8PDIwBMGDw+PDDxh8PDwyMATBg8Pjww8YfDw8MjAEwYPD48MPGHw8PDIwBMGDw+PDDxh8PDwyMATBg8Pjww8YfDw8MjAEwYPD48MDtq8Eh7fDEQE27ZRSqHrOkqpg90kjyzgCYNHi6id69R1XcrKyli9ejVz584FgUsvu5QhQ4YQCARQSnki0YHxhMFjv9SKgYgQjUZZvnw5L730EosXL2b16tVEo1EAHnzoQYYPH87ll1/O6NGj6dq1K5qW9FY9kehYZH226wNh2LBh4k1R1z5xHIdIJMLaT9ey9NWlzJo1i9WrV1NZWUlT547P5+Pwww9n8uTJjB49miOPPJJQKOSJw0FGKbVCRIY1a11PGDxqqbMMACuR4LPPPmPRwkXMe2ke77//PuXl5TiOk/E5lfpMQzRNo6SkhDPOPJOp117LKaecQufOnesEwhOKtsUTBo8WISKICPF4nM8//5ylS5fy8ssvs3z5cnbv3o3ruhmfMRR0NnVOMXQu8hlUCrxg2bwft6lxMtf3+Xwcc8wxTJo0iZEjR3LkkUfi9/s9cWhDPGHw2C/pYrDxq6947fXXmTNnDsuXL2fnzp3Ytp3xGU1BiaFzUsBkkq5xZsyih+Xgd1xEQZWhsyro40GEhVGLnbaD2+D00nWdLl26cOGFFzJlyhQGDx5MaWlpXSzCI3d4wuDRKOk9Cl9//TULFizg5Zdf5u233+brr7/GsqxGP1dk6pziNxijaZztuvSP24SspEvR8H4vQELX+CJgMk/XeMpy+CBuYTVQCKUUeXl5HDt4MBMnTGDChAn07NnTC1bmEE8YPBpFRHj//ff5xz/+wRtvvMH6DRuwGxEDTUGhrnGcz2CsaXC+ZTPIcjCbEING95X6W+4zeDNg8m/XZUncZpfl0NDR0DSNww47jBEjRjBhwgROOukk8vLyPCsiy3jC4FGXeLRjxw62bN1KOC+PkpISLr/8ct56661GexTydY2jAibjDY2RlsMAyyFsOyhpnhg02RYgrmus9xs84zOYEbf4ImZjSaYVUVhYyEknncSkSZOYPHkyeXl5nvWQJVoiDF4ewzeE9FyDsrIyVq5cyZw5c3j11VfZsGEDRUVFnHDCCaxataqeKJia4ji/wQWGzsUCxydsCiPxVotBOgoIOC5HRxL8Mmpxk99gSdjPs66wNGFTnrJERITy8nIWLlzI66+/zvr16/nVr36F3+9HRLzejDbEE4YOjojgOA67d+9m9erVzJs3j1deeYW1a9fWJR4BVFdXs3nz5ozPH5vn5zFd44jKKHoqDpCry04BugjdYxZXxSwm6hofB0xmhPzMTlh8HrXqXJBYLMa0adM4+uij2bRpM9u2beWYY47hoosuonfv3l76dY7xXIkOSG2PQiQS4aOPPuL5559n8eLFfPbZZ1RVVWW4CUopdNPAsW2kQRDQUDAwYHKZz+BKy2FA3MbvuDkTh4xjAaKmzoLCEFOrYlTG68c8gsEgiUQCx3EwTZMBAwYwatQorrjiCgYPHlyXfu2xf7wYwzeMdDchHo/z4YcfsnjxYhYtWsTKlSupqKjIjBko8AWDFA89hsBFF+I//mjia9YRfX4Oe95fjRWLN1ydUlPnLL/BJKU4P27TKWHXez8rx5L66yrF1wGD13SNuUrxatxmS8JuNFGqIUopOnXqxLnnnsuVV17JqaeeSteuXT1XYz94wvANodYyqKmpYcOGDSxatIh58+axcuVKysvLGxUDMxSk6MjDyL/wXPRLx7B70DAqQ0U4SkMXl8LqMrq8s4TqB6az+7VlRHeWIQ0SmExNcYzf5CpTZ4ztcFjcwudIqwOQjqYoMw1WmDov6hoL4xbr4zZOI+egpmsEOpcQHnw0Eo9T+cEaEpVVNFzV7/dz9NFHM2XKFEaNGkW/fv28xKkmyKowKKUeBsYAO0Tk2NSyTsBTQD/gS2CSiOxRyV/jb8AoIAJcJyIr99cITxj2kp54tGHDBubPn8+CBQtYsWIFZWVljaYkGz4fhQP7kjfyQswxF1N+zAlUF3cmoZmIgvr3e0ETIS9eTeEXn6HPeYHI089R9tFnOA2SmjQFXQydiwImU4CTYxbhFnZZ1iY+vRcweV4pliZs1idsog0zn1IEivIJDT2ewGXjiJ83gnifvuA45H28CmPmc1Q+M5vqjdsyRNEwDHr06MGICy9k6rXXMnToUG+UZwOyLQxnAdXAY2nC8EegTET+Vyl1B1AsIj9XSo0CvktSGIYDfxOR4ftrxKEuDLW/QSwW47PPPuO1115j4cKFvPPOO+zevbtRMdB9JkUD+xI88wyMsRcTOel09pR0w1J6coXmXAwiGOLSafdWwovnE5/xLGVL3yZaUUXDW3NI1zjRZzApZUX0jlnobqYVUfupap/OBz6TuZpiccLmI8sh2kiqtFIKf2EeoSGDCY25kPjZ51Fz7IlE/SEElToOAQHDdSjc+BmB+fOIzXyBqrdXkKiOZGyzsLCQM848k0vHj+fCCy+kR48eaJp2yAtES4Sh7g61rwdJy+DjtNdrge6p592Btann9wNXNrbevh5Dhw6VQxXHceSrr76S+++/Xy655BLp1q2b6LoupG646Q/d75OCfr2l77euksGvPCWdd26SgB0X5bqC6+7/h2zq4bqiuY4UxKqk/6rX5LCfflsKD+8numlktEFTSF+/KT8oDMp7eX6pMjRxFeIopMrQ5KOQT/5cGJTT8vySb2iNHgcKMcIhKTlpsPT/rx9Ljw9el1CkQpTr7P84XFeU60goUiE9310kPW66WvJ6dBVNz9yXaZoyaNAg+c///E/5+OOPJRKJiOu6bfr7tieA5dLMU+JAhaE87bmqfQ28CJyR9t4rwLAmtnkzsBxY3qdPnzb4Wg4+ruuK67riOE7dY8mSJTJ48GDx+XyNXkRKKSno2U16TZ0o/Z95RLp8uVZCiZqkGEgrxKDRhyvKdSVgxaTzl2ul38P3SI+RZ4s/L5TZLpBOhiYj8vzyp4Kg/HdhUEbk+aWzqYumGhEDEMM0pPCYgdLtR7dJl8UvScGuLaI71oGLmuuKLx6Rkk9XSbe//V5Kzz5ZDH/m96jrunTv3l2uueYaeemll6S6uvqQFIiWCEOzgo9KqX7Ai7LXlSgXkaK09/eISLFS6kXgf0XkjdTyV4Cfi8g+/YRvuishksw12LxlC6+9+irrPv+cLl27MnDgQH7xi1+wcmX9MIym64S6lFBw6lBC40cTPe0syvsOpEb3J1doC5NYBA2hKFZBp3ffJPHEU5S/vJjKjVszVq1tTWNnkm4ahPt0J3jGqeiTLiNy6llUFHbBVal052wciwgKIVy9h/w3l+D++wmqXnmdyI7dGd2zoVCIESNG8Lvf/Y5jjjnmkHIvPFeiHeC6riQSCdm8ebPMmTNHrr/+ehlw+OF1loGu65Kfny+aVt8E7ty9uwyb9mfp9vmHkh+vFs11cmAZtOyhua4UxqrkjCcek1Ao03po6lFcXCwDHr9fijZ9Ib5ELGXl5Li9riv+eERKP/9Aev/+P6TwmCNEb2BFKKXkxz/+scRiMUkkEhKLxSQWi4lt299oS4IWWAwHmvn4AjAV+N/U39lpy7+jlJpBMvhYISLbDnAfHQZpYHVt27aNVatWMWfOnLrU3vQsREhWRqqqqsrYlmEYOCU9sHv1otoMNatfP/skg30a0ClRQf6aD9HnzuOT5+ZlHMe+sKwE8Y1bMbBxDCN1LELucisBpYj7gsQPH4z+s0EU3HALfe+fxuZf/56Euzf1evbs2di2zZ49e6isrETTNI4//njGjhnLoGMG4fP50jZ56FgVdexPOYAngW2ABWwGbgRKSMYPPgcWAZ1S6yrgH8AXwEc0EV9o+OioFkNtzMC2bdm+fbssWrRIfvjDH8rgwYMlEAg0eSf1KU36+EPSzRcQXamM9/3hkPQZd74MmP1v6VS2TXTHbl1wsbkP1xXddSQ/WiE9Vy+Xgf/8g/S8+EzJKy4QGmmnppBOfk1OLjalX54hhpZ5rJqmSdGR/aTXnd+V0lcXSDBSmaP4SIPjsC0p3rFRuj/7qPQcd6FojbS/sbaWlJTIFVdcIS+++KJs27btG2VFkO0YQ67paDEGEcF1XWpqavjggw+YM2cOixYtYt26dVRXV2dYEACm0uhmmIzwBRgHHG8niKOYa/r5l53g03gUS+p35xlBPwXHHEnhzddRPWY8FV16kdCMLMcYknkNwUSM/K1fUbB0AeWPz6T64zWNJj8pBfmG4vh8k3EBjQssoU/cocLQeC2o82jM4Z0Kixo78zvwFYQpOv0k9Buuo+bs86jp1A1H07MWZ9DFxV9dSd5HK/A9+zSVL71CZMMmnETm0PKQpuhialQ6wh7bzbDMQqEQAwcOZMKECVx66aUcdthhBAKB1HfQMS0IL/Mxy6R/R5FIhDVr1vDSSy/x2muvsXz58iYLo2pKo4fp5yzTxyiEMx2H7okohuvW1UkUpdhpBphj+pjuOrwTjxJ36+ctaKZB8VEDKJo0HnvyZLYfNoiYMpNvtvgkTboJCgiIRaftmwi9voTI7JeoenMZNVt34FiZ1ZuCpmJw2GBUUOd8F46rsQnX2Cg3LfioQVWewRv5Bs+5MK/SYnvEybjoDL+P8JGHEbp8HPYVV1Bx+CDimq+FxyN10U6fa1H82UeYs5+n5uVXqHn/QxKVNRmf0BT08xlc5NMZqRRDHJetumI2itkJh8/iNnaD31HXdTp36cKICy5g8uTJDB06tK5uZUcTCE8YskStWRWJRFi3bh0LFy5kwYIFvPfee02Kga4UpYaP4aafy3SDs604PRMxDLfpjMHarVQbPpb4Q0wTlzfiUSqc+nc6pRQFfbrT+arxxMZPovy4E6nxhxvJbmz0aFACppOgcPd28t59E+bNo2rx6+xZvxnXzkyiCuiKw/N0zgkZXKorhlbZ5NfYKEf2eyy2X2NdvsncgMYz1TYfVdlEnfrfl1KKcLcSCi46B3vCFdSccTaR/BJcTe3neATDtsjftRX/W6/D87OoXvAaNTvKMn4TDSgyNE7yGUzy6Vxgu/SIJtDT2uJqit0BgwV+g38nHJbFLCodyRC0YDDIoEGDuOKKK7j00kvp27cvhmF0GIHwhKEV1IpBLBZj48aNzJs3jwULFvD++++za9euRgujKhQlhslp/iCjUJxpJ+hvJwg4dur9FuwfqDFMPjSDPKoUz1sxdlrxjJM0UFJMp3PPIHj7t9h98plUBgtxVcMLKiUGrkN+1W6KVizDnjmbiiWvU71hE3aDgVQAPl3RJ6RzQb7BJQJDog6da2x0O7mtlpDsflGU5Rm8kaczwxEWVViUxTNNdyPoJ3zcMeRPmUT1uMup6t4Xu57bJGiuS171HvI+XIn21Awq5r1CbPO2Rl2FPF0xyG8wwdC5wHU5IuGQZzlNHkNthKzG1PnIZ/C0rng+arHJcmigZ+i6Tp8+fbjgggu4cvJkBh93HJ06dWr3VoQnDC2k9jtIJBKsX7+eJUuWsGjRIt5++2127tzZRMl0RZHp4yTTz4W6wYW2zeGJKIHUXb61p4cAltJYHchjhm7wnBVnQyKK2+D38uXn0eWcUwhMuYqKEaPYXdgFQaEhFEf3ULDyXWT+QiKLFlP24VqsSCxjX5qC7iGds8MGY0yNs2IOXapsjHj2hl+LgnhA54Mik1nA89U266rtjItOM3TC/XsTGjkCJlxO9UmnIppGeO0azLkvEJ23gKr3VzeaCq0rGOAzuNBvMEbByQmHwpiNkpYNABPA0TU2BwxeNnWethzejVnUNGwskJ+fz+DBg5kwYQKXXHIJ/fv3b7ejPD1haAGO47B161aWLVvGjBkzePvtt9mxY0ejYqChCOs6x/kCXGL6uSgR43DbImBbKFo3+rAphOQQ5a2+IM+YfqbbCVY3EqjUTYPi4wdRNPVKrMMPx7dmNeUz51Cxag2JmswuRl1B54DOCUGdK/N0Tq126BO1MeNuXQwiF8cC4BqKr8MGi8IGj0cc3qmyqLIyTXd/QR7+gQNA07C+2kh0Z1lGFpUOlBgaw/3JcRznxW26JOw6V6G1I0JRUOPTWeEz+LeCl6M2X1sODaMwuq7Tu3dvRo8ezRVXXMGQIUPqytK1F4HwhKGZiAivvfYa3/ve91i7di3xeKZpDZCvmxzrCzBG1znHdTkmESPfsVp8J2pVW6kNVPqZ5wvyhGPzeiJK3GkwIlLX0EwTJ5HIyPpTCor9GsPyTS7xaZxjufSvtgnGHFSmh5RzRIPqkMHyfIN/B3VmbIsRiWYKcmMENMVpQZNLDI3zHOHwuE3AbtpVaHVbAdtI1q1comvMcFzei1pEGql+XVRUxPDhwxk9ejRjxoyhV69e7aLiVNYzH3P9OFh5DJZlyS233NJkv3Ynwyc/KyiVxeEi2WMGxFFKXBAXRA7SwwVxlCabQgVybs+BAvvvnwekJKjLb3oH5Z1uAanON8TR1EE9jtpjcTWkJt+Q2aeUSK9uTed+NHwMC/tkQ3FQbK1tf5Pk94+UBwyZUxiQq/P90sXURDXSRtM05YgjjpAf/vCH8uabb0osFjuoORFkexBVrh8HSxgSiYRce+21TZ58PfxBmR4ukh2mXxwO3oXkgjgoqdJN+SgQlj/kd5JTAnkS1DNHPzb16JlvyLN9Q1KWb4ijH1xRcBUSC2jyZSefPNwzKOd28kmnQOMjMZWuidIyxc9UyPCgKfcXBWVj0JSErrXpMdWKUdzQZE2eT/5QFJTD/E3/Hp07d5b7779fHMc5KOe6iLRIGLxisPtgazzKt6w4g8wA14eLmGjF6ZKItokLIam/Cd3gS1+QuYbJPNviAytGWayGzLg++PKCFB3RD4CyNeux01yjLVU2U6MOQwpMpnYzGRt16FJpoey2cYcEEEOxJ2ywLGzwtC28XmWzuTyB1Ygb4y8pIHTaUIIXnosbjRJ9dg7VH6zFSdWEtATeiVqsjFn09emMzvMxGRgSs/Dvo/chW9R+Zz7b5Sg7wUBDo0tRkBvjdsa8GQA7d+7k2WefZerUqfj9/tw2Lgsc8sJgGPW/Ai1V56Q2xyjuurwfj/BRIsZD/iBX5hVymZXgsEQULQcCIYCl6WzyBXhNN3hRhLdsi52x6kZLoBkBP/lH9KPg/HNRY0YSHzoMUPR+ZRHR6U9SvvRNYuWVANTYwptlCd7R4B8FJld3CXBpwqFfpY2eyH4BWAHQIBIy+DBPZ76mmBdz+OjrGLFGMiP1gI/AoMMJX3IhjB9P9VFDKPflo0QouOl2Sl97BevRx6l+7R0SuytAkgKxLu5wd9zhMUPj7IDB5KDJmQmHbnEb1UgxmWwen6sptgcMXjd1pkUSjYpCLTU1NUkzvSPQXNMil4+DGWO4OS3GoPuQrv/jky5PmVIyxhQjL9OEVSjp4wvIz8LFsiaQJ3Gt9SasC5JQmmzzBWVmuEguCRVIL1+gyfx+3WdK0eF9ZcB3psqAxbOkZOdm8dmJvQVb3GRdhXC0UvotXywDbp8ieV1LM0xyTSF983T5fo+AvN8tILFAsuhKq03slKvwRalP/tk7KOeW+KTQ14SrYBoSOqyHdP/eNdL9tdmSv2dbIzUa9h5TKFYpnT96U/r8748kfFQ/UUam+W4q5KiAIb8pDMin+X6JGtlzM2qPr9qny/v5frmjMCBHBgwxm6hBkf449dRTJRqNHpRzXaRlrsRBFwU5yMJw22231f1woRJNurxvinKRYIUmJfNM6XS1Ib5OjQtED9Mv384rlBXBsCQ0vcUnn6OU7PYFZW64WG7OK5Qj/EEJaI1Xb1KaJgV9ukuPKy+Vw558QLpv+kxCVnS/A5KU60p+vEr6fPCW9PvlD6X4iH4ZAqFAugV1ub6LX5Z2C0gkTz8ggXAMJds7+eS5XkG5uotf+uXpjQ6sAiTQpUiKxpwnXf71NynZtEYCVqQFw7JdMZ24dNr8iXR+4P+kcORZYuZnDgfXQHqZulyd75cXCwNSETBbJXyOrmRryJSnioIyNuyTUqPxoKOuKckP9ZQepcPESIsDecLQgYThe9/7Xt0PF+yUFAZc6h5mTEnxMkNKvmWKv4uWrAjS4KLqbPrl+rwieTWULzW62WSU3K0Tg4AsDubLz8JFcmIgT/xNiYGuSbh7Z+k29kIZ+Njd0uvL1RJMRA6slJvrimknpMemT2Xg334rnU48RnTTzNhn2FRySWe/PN09ILv303vhpi6WinxDXu0akJ91D8hxRab4GgkWJsu5BSX/5OOk+//+TErXvCOheFXzyrnt45iU60goWiHd3pgjnW+eLME+3YRG9h/QlJyV55N7CwOyIWRKImVF7EvM062Dd/L98tOCgBwTMBu1DpRC/L6QlBYNl77d/yJF+WulW8nnUpDX2xOGA30cTGH4/g9+ICplsgeKNem+wpcUhdp/tQIRV1K0ypDSH5sS7KWJauROmK8bMi6vUF7OK5JKY69AOCipMkxZGcyXX+aXyJBAWEJN9CgoTZNApyLpdckFctQjd0nPtSslP1aVLNjS6qHXSUExXFs679woRzxxr3Q75xQxAv6Mdvh1JcOLTHmwV1C+7uQT29jbLZh0FXT5rGtA7uodktM7+SRsNu4qaD5T8o/sK91/cYt0feNFKajY3rpybk0cl3Jd8VlR6bT+Q+n+999K0elDRAtklnnTQPr7dPluYUCWFwakxkxaR+kC4YJYupItIVMeKw7KiLBPipuoX6lruhTl95beXW+VbiWLJBQoE6UcAVc6FWySgry+HVIYDungo1IKMy34qADNbRCqSr20fEL5cTbG7xXhG3XyZuhEZjhE17nUJiFWOTazaypYrBuc5gtyjT/EANdhqWawyLGTPQrRaqSRHoVAYZjwsUcRHn0R9sWjqDnyaLYFC3Eyxj+06ohBgY3OztJelE2+haJRl9Fz4Xzijz1O+etvEytPFo+JO8I75RbvV9n8I2wwuUuAUZZLwBWW+zTm2MJrVRbbYg4ZxZ8VBLt1InjaSfgvHYN17gXs6tofW/MhOUnyUYiChBGgrP+xaN8eRP7V11OyZBH2k08TXfoWsZ3lALjAhoTD3xMOTxoapwYMLg+ZnGM5dHUhqmC1oTFLKeYlbDZUxIg3TGIC/P58isLD0NQYYomxbNvVF9sxSf+tRDRE2kfWY4tproLk8nGwLAbbtuWOO+6osxh8YSWdl5r1LYbG/rmIZiP5G3XpcrdPwsfpohmZdxNDaRLUDdEaudOgEF9eUEqHHStH/c/PpN+7C6W4encO7qb7eaTM8XC0Uvq/u1D633K15HXvnFGYRVNIl5AuvcKGGI0F2hRiFoSk6Oyh0veB30rpZyskGEt3Fdq6PF2qsG2sWjqvfkt6/88PJX/w4aI1UvnaUMhhfkPOCvnkxJApYV01GjswdEM6FfST3l1vkS6dFkvQX1VnHTTmjRTnb5b8kGcxdEjS01RdB5zmVC5T4OpQ1cuh5naH4ASdTi+bJKa5VK9wcFOD/WxxsRuZS6GgV3dKJo9HjR1N9eAT+aKwM7bSc3Q33Q8qOcqjOpBPzbDzCQ05je43r8L4/s/49I0361ZzBXZEGk9X9vfqRvG1lyNjLyF67BA255XgoLVN0domSVoRMX+I2NGnYB41jPC3vkfXRS9R89C/qVz8dvL6BWyB9XGb9Y1tRUE4WEw4OBxdn0h19Gy27eqD7Rg0y5LroAbDIS8MPp8PpRSSOkladC4rcBXUdHOIXOcQHKtT8phJ+W9srIpMd6GWriccj/Xjn7C5a18stNTJcxDPoNSx+7EJ79mF8eU6olWVzf548ejzcH/+C3bnd8OpmySmvZB0nywMykv7Epo4laAKob2+EjeROdK0FtMwyA8dRsB/IeJeRVnVYBJWXuqrasHxNX0atGsOaWFQSmGa5t4FLmQMm2vWhpK/f6TEwbrNJfiGhjWr6cFAX7y0iJJLLuXwb19P2ehL2V3SE1tlqcRZsxEQ0MUlHKmgZPUKeG4WFS+/wudrv8RJJOqtrUieLC7Q8Mh2PvYchevX0+vb17Pn7DFUF3ZNlodvDwIhgiYuocgeij5ahjz9NGXPLWhSFIL+fDoXnYHjTqYqMoLtu0tx3NrLpOXH0x6+ggPhkBYGoG5oLKTEvXmD+xpHgeMTjD71z4YCvRCASqcCANe22fneh5Td/FMKB02j9zWTiE26krKehxHPek3HhiQLruRZEYq++hzf3BepmjWHLR+sIV5RnbG2Dzhc0xmjNM5Uih3As67L665Ddep26ETjlC1cRvmrKwgddw+dp0zCnjCJym6HYalcH09jJI/R5ybI3/QZxqyZRJ57ge0frcVqpORbLQV5/QkF7mJn+QXE4qkp8lrbEs9i6HgopRgwYAC6rifrL4i0Thgawaf5uC94P72lD9NlOrMTs9hufw2AY9mUffAJ5R//jsIHHqX7xHFYV1zNnkGDiWj+LLoYSesgKBYFX28i783XiM96nvJXlxHZvgu3QRxEA3oqjTM0nUuU4jzXpcSxSE0RwySl8aZu8hjCfNdhd6pbxk1YVC//mJpVn5A/7V8UXT4Orp1KVb8jiWmBNhCIZEHYcM0uQu+9if3cLCLzXiGycTvS4Bhra26mvy4uuJrN28fguBodNjiQLZobpczl42CWj587d+7eSWBMpOTpZvRK7OOfZiOdfrg38l1kFMsa3yfi4kpCS8jHgdXy/8L/KX3NfqLRoG9cKQl1LZX+37tB+n70loTirZyKznXFsC0pqtgpA96cJwN+8C0pOqK/aI2kESuQAqXkbM2QaYZf1muGxPYxzNwFiSpNVuim/MzwSW+lZfa+KCXBPl2ly81XSJd3F0ogmovS8cneB3+8Wko+Wyl9/v6fUnjKYNGDmbkZSiH5IU0uPN0vD/4xLNeMDab1uig5vNc/RKnGexgO5NGReyUOuijIQRaGefPm1QmDZiKdnsmuMBQaRbLaXFN3tC6u2MqWtf7P5Td5v5OjfYPEUJkXaqhrqfS8frL0f+NlKYhVtmgWp+TMUZXSe/W70ue/fymdzzhJ/AXhRhN0Aig5QdPlTt2U13VTKlTLUrtdEEsp+UQz5Le6KcdquhiN7McsLpCiiaOk+0tPSEH1ztbPSuW6oru2FOzZKt3nPS7FV48Xf8/MblZATF3Jkf0M+emtAVk6JyCVuwxxHSXznwuIrtWKhpIBve5OdT96wnBIuxJA/Sq/AqrxIk4HjKY0tNp5GknWitRFZ2B8AL9I3MG3fN/imbxn+Zf9EB/HP8aWZF9nZPsuIv+aQeD5eXQbcz4l102lfPiZVISKcDMi/0mfOujGKdz6FXnvvIH93Ex2Ln6XyK7MuSE0oLfSGKEZjFJwjutQkHIVWmpAK8AQ4UixuRO4STN4xvAz3XX4wLWp/TqtPZWUPzOPqrmLKT5nKN2vv5aacy6mqqQnbnO7NiXp9QftGvLWrUGbOwfrhTnsWP4pTjTzh+tUoDH0WIOrrtC5+BKH0p5xkgmnyd35g1JvtyoH7oMXfOygaNreixYhByXOVKNdVrUC0T3ele/Eb2OyOYl5oZeZ5tzPyvhy4pI80WN7Kvly+izM516i5PSTOOw7N7H77IupzO+EqzRM1yavupySFW+QmD6D8lffZvvGrbgNalZqQKFSDFcGV2gaZ4tDL9fCEKltZWuPEh3o4tp827W5StN5TfcxDeE1x6amNlAZibFr3puoBcsIHXM4XW+YTHzC1VR17YulmY1cScn4iOHahCp3Uvj2QqKPzqDy1XeJ78isAekzYEAfg8vHmFw2yeHIYxyCBQka60XVtFoxSG5EchAozMU224JDXhhq8xjqyHLwUcRF9lM1REOji9WZqdY1jDPGsij4Cv+Sf/FG4nWqnGQ+gRWJ8fXC1zHfeI/i4UPoe9VEfEcfTmzxm9S8vJCvPvwUq5Gir3kojtE0RiudUQhHuw4h28pZaK02gbuT6zAOhwuUxuu6yYxUoHKHJEvMiO1Q88FaIj/6LXn3T6fThEtg4kQqjxpC1AgCCiVCnlVJ3ppVyOzZxOYuYOvHn+NEM7tSu5bonHmywdixigsudujSK4ZmSAvu2IKuZ9lc7MAc8sKgadre7koBsnxu1AYfmoNCUWwXMcG+jFH6xbwdWMY/5J8sib9ChVMOgBWNsWPpMna98V6y6Gs8nlH0VQf6KI0LdIMJAieLQ76TOCBXoTUoICwuFzsJzlOKtZrJvxTMdGw21QqE41K9Zj3Vv/sbgQemUzRhJHlXXovVux/hVW+R+PeT7Fm0jMSeymT6ZRqmoTiyn8HEsSaXTxQOOzZBIM9p1DrYLwKaOpAklv3guRIdk4aVe7Nt+WlKQ0Pb/4ppKBQhJ8T5Nedxhn4675sf8Jh/Os8lnmGXvRNBcG2n0dmjjtBNfqkUZ7kuPWwLIyu98a1DAT4RBjsJ/oTidk1nlmbwmDh86qZKsbtCbNtuvr7n3+iPzMJXWsS2zdtxG0yXpynoXKxz/hkGk66AU0536dwzitKlxb27ml7fb2yugLcIz5XomNSr+y8gjUwq0hpEZL+uRKPtSp3hASfAKc7JDNNO5Gb/TTzqe5TnrVlstL5q9EQOAP2BbuK2C1GopbYdBsLhrs2PgWs0g7+aAf7PipM+w6VTVUO0qn4iUtCnOHqAwbhROpdNFI4YbGEG3VYF93QjKTQemXjCkD5MFrITY5CGL1snNgqF6ZoMiR7HseoP3Ba4je+b32d+5KWMdT90LMYpxSjN4CZ0hrkOwVQCUnu4Bmr77iJK5wul2ChNu1q1sYOLz/YxabIw/Aybws5xNL0lsYN9tMVt+FNl//bu9Up0UDRd29szIWQ9+AjZ6wZTKEwxOSJ6OBPyJ7BILcSRTL+4TIR/OxazUZyl6dysG5zj2ORL9gu+Nofay81Wii2awfNK8bzrssKx69KqG6KA0ef5+O/fKY4aEscMpMQtqwew95cRQGFlZEQeqhzywpAxhViWz4qWBB9bQoEUoqHqdEyFDSjWka0JaieErEKY69osdRVnaDo3agbnikOJ67RZyXiASqXzrq7zPPCS47BRnP3qb15Q486faww+JZazu65qEKSMxMrJ9gngdVd2UHIybViDpJlcJM64qv7MEtp/5CFX2ejzQsgDFs5HEWonbKhBmO/aLAWO1wxuMfyMdh06u3Zd92K2qG2TpRQblc5Lms5TrsP7tkWkkYvO7w8RDHYlGt1BPL43ruAzFIWdcmvhGKagqb02QiyRIJvfhmT922079hsuV0r1VkotUUqtUUqtVkp9P7W8k1JqoVLq89Tf4tRypZS6Wym1Tin1oVLqxFwfRGvQNK1ekpNkTqLcKnJlMdSTG6Vwj4jh9q7BvqUcd4GN8XAh+jn5ENDrPhMH3nVtbrHjjED4s+HjK83ASVW4bQ1Cckh2uabzkuHjJs3kHHH5vh3nTdeuJwq6rlPSqT8DBtxG797PkZ+/lP79/0VBYc+07UnO77ZKk3rXbUG4OKvbFzFAdcx7b3NabQM/FpGVSql8YIVSaiFwHfCKiPyvUuoO4A7g58BIYGDqMRz4Z+pvuyQ9jwFAmlPBqQUolRuLocmODiVIpxj21THUWB/6wjA84OK+HUWqkvEIG/jIdfiF6/CgpjNFN5kgLgNdB72FPRkCWErjC6UxT2nMEpdVtlWX6ZhOIJBPcfEQ8vMvJxYbzZYtfYnHDUQgEOhJ374rqKz4Q9rGc3u3bSg8GjbZdCVENFQLu6rbC/sVBhHZBmxLPa9SSn0C9ATGAeekVnsUWEpSGMYBj6UGbSxTShUppbqnttMuSRcGo0yhpJXnpNR/fiDdlfvDaXSSuhS1va+FCZzLE6iLTLSVIXhQw50bQfYkUtuAz12HX+Nwn9KYpJtch3C0a2PuI1W6tmehXOks03UeE+E112G7mzk9m64bFBX1pXPnS4jHx1JWdiI7d+Zj2/XNbMvSUKrf3uNzwE7k2AxXqZGEKXZVZPcUVcpBJOs59m1Ci+wclfzlTgDeAbqmXexfA11Tz3sCm9I+tjm1rF0KQ0NXImBqWY1M5yRppm67zdi2AglbOGdZcIqBvioEDwdx58SQrxMgggtsFZe/OgkeVxqXaAZTgOGugz+tJ0OAuNL4RNOZg2K2OKyxLWIN2qGUIhgspLj4JMLhy6ipGcmXX/YkFtP3NqoRbLvB6ZhjV0LXQdfSx0pkO/Co0QxvvV3SbGFQSoWB54AfiEhlPfNbpLbScrNRSt0M3AzQp0+flnw0q4RCIfLz89m9ezcA0a9dNFH7uh+3iAPJfGw+zbyj1q7mt3FOroQTNPQfhuAhP+5TcWRzos6u3ikuDzkuz6AYrRtMQecYcXEEVmk6TyG84tqUpQQlHcMwyc/vQ+fOY3Gcy9i58wS+/jqE4+w/CJccqKxlLMslPlNhmkBdlbdsWygdN/jYLGFQSpkkReFxEZmZWry91kVQSnUHdqSWbwF6p328V2pZPURkGjANYNiwYQetU6dXr16cddZZfPnllwDE3nMo+tRg99FW0p1o5e96oJmPOUMBPhfnyGr4vYZ2SwBtdiHyLwv300hdV2clwpOOxSygh9KwgO1OgkTDzSlFKFRI585n4PNdQXX12Wzc2I1YrJlVlNNIFwJXpOHQiOyjGrQw69dwO/rdW0hzeiUU8BDwiYj8Je2tF4CpqedTgdlpy69N9U6cAlS05/iC3+/n+9//PocffjgANRtc4lNcOk03Ce3SWj2deq56JVqNAgwX9/AIzo8qYIGL8YcitONCYO49LWLAenHZJG49UTBNHyUlgxgw4Cd07/4i5eUzWLfuarZu7U0sVn/ilWY3SWm56T5uAi1jsFU24wGCYUSBvdHscDjcpsfXGppjMZwOTAE+UkqtSi37BfC/wNNKqRuBr4BJqffmAaOAdUAEuD6bDc4F/fr14+STT+aLL75ARKh630G72SF8gk6nm02iYxyipW7zLYg0HchVHkNWUYLbI4r7wxhqig99XgHcZ+O8W5Nhz4dCRXTteh6GcRmVleezcWMplqXT2hmXRMC2zXqvU6UYcjdEXDUYK5E13yU5fWbQt5RdkZ1Acnj/xIkT61clb8c0p1fiDZr+bc5vZH0Bbm9lu9oMy7L47W9/y3PPPVcv+OQmoPIdB22FQ95xOqU3mkQmuUQ6OfsXiHqJlO3UYmgMTZAucZypcbQLQ+jfKcCZVVH3dmFhTzp3vo8dO86nujpAsjBUFhOCpP5zy8raphtF15PFWmqpmw3wgH+ulCAE9lCc/ywV1b8mbkXRNI1JkyZx+eWX1y8M1I7pmNkXWWTPnj0sXbqUeLzxQgyuDVUrHWo+dMh7RKd4ikH8ciHSzUGa8RvnMvMxZz6sArd7BOP2IligQ00ygblnz8ls2HAx0WhuTpvaFGWRZOmFZJdm7vAZCr9PUTtARlPuAaZ6CX4zRji0Fr85l4Q9mx17PiBhJZ0vXdcZOHBgXT3FjuBOHPLCkEgkiEb3+oFd9GK+77+ZL/mS5+Pz2ZkqkOLaUPWeg3ofQg/olN5iEr3UJdLNwW1gQSg9fcRmbiyGGqqz3r3WEOnmgF9BDanZurrgOPr+P3jA1AYss1Nubn+YhsKXdgW07Hfaax0UhpeieJrKmiXsqdqN26DGpmVZ/P73v6esrIw//elPHcKdOOSFobi4mG7durF27VoATjQH89PEf4Kr+LZvJY/4HuYp63m222XJS9yGmo8cIt93CP1Tp3SqSWyyS3XPvQKhBfZuP1fdldYBTZnVUrKb07EvRMB1GwYf22TPdc98Zgy1z6KfyXVNw6Iw/Bl5wReojjzHrj0fk7Ab9tfUJxaLsWzZMmzb9oShI6BpGoa+9y5YmzhkukGOj53Kn7Sh3Oj/Fg/5HuTZxBy2piooiQM1qx0idziEHtEpvs7EmuAS7yH1ysPlqruyTYxRrW2z9lx3b9KWALaT68zH+r0Sht7U8Qq65hIM7CQcfAulnqcmuoiyyq9Tbd6LpmmUlgY566xOhMM6Tz+9lUgklWnq5GBMf4445IVBKYVKCwg5ysaltrCJwnT9HBsdzh+1Idxs3sbjvkd5JPEkW+1dQLLYR80ah8idDsEHNPJO0qlZtvcEyJUr0SbhTFtr0654kfr1N61YboXBNMBo8gqotQ5sCvI2EA49SzT2NGUVa0nYmfNe+nwmRx1VwqRJhYwdG+Hww/cQi4X59NNili3bntxiBxqDfcgLA9QfK+HgZNzhFQqf6+fo+In8Rh3PVb5r+bfxGDPsmXxlb62zICKfu0Q+r3/XscXGUjkIr7fFOdZg9GHuzZT6c3zk/AabkcdQg8+0cF2DUHA3+cFXEWYSjb/Opu1bM2IHmqYoKQlx9tnFTJpkcvbZNZSWrkcpKxVINenWrWjv7jpA0LEWTxgaYGGRmewLtdV+dDEYFB/K79Tx3GTeygOhe3k6MZsv7a11lkY6USfCgsBCjnKOwuea2avm1AbnmGrYL5vrYdD1jin3nbwNv8Jd5e9SUvRbDC1MLDGLssrVxK3M3qpAwOTIIwsZN66ISZMcBgz4Gr8/BjSYwEaBYaQN6fcsho6DAvSGk87s9zMKXUz6J47mt9Zf+JZ5G7PynuKBxKN8bm2qd0q7uPw29hu2BLdwm3MrA+ID0EWjtQXf2uIcE61tczAkTYgEcHKcEx2NJR91r+OVbN3xx2R9iwbWgVKKkpI8zjuvM1dcoTj99GpKSzeiaYn9iHTHsRLSOeSFgQYxhgQJnGbOL6BQGOLjsMQgfmT9JxN8V/LP4N/5Z/wRqty9FV+qnEr+VnMXz5rPMCl4BdfKFAbFj8ZslQXRce4+zcV1jXoxhppIjkamCjgJjSULdbbsrB8vcGunnkyRtA6KGDUqzIQJwjHH7MDni9DQOmhyX1lue1vhCQP1fT8bu1GXYJ+fR6FEp2/8KP5L/wPb/NuYHp2Vsd4WazN/tf7Ck+bjTAxdwbfsb3FU4ogDFIiOeSfaFyL1p8TJdoxBBGJVOutWG8x4QuOBfydI2JmXbtI6CHHGGaVcfXWQs84qo6RkM5pmtdiFS0+Y8mIMHQw9rbvSwT3gIdcKhc8JMkgdVW+5ZoDrkMr9F762vubv1t08YzzNmOBYvi23MTh2LLqr121n/zQsP5SDe1MbjwrVNFV34YlArJWzgtXe+MWFPdtN5j2vM/N54Y33LHZXuI26Y336FHHDDSWMHp1g0KDdBIMRoHXzV9Ri222Re5IdDnlhaFgl2hILJ4vJQ5oJhX8ycMqF+JMuiXXJHgxB+NrexoP2NGYbz3Np4HKuk+s4IXE8fse3f3FoGOXKRQq+07bdlZpmolRSHAWwrAPfuQjEqnU+XWXwwmzFrDkOq7+IY+9jQqEuXcI8/HAp55yTjB1AdoO8DeMW7ZlDXhigvsWQbTRDETnbITFY8E9VFMzQiT/sEv9CqK36tdPewTT7nzynP8MlgfHcLDcxJL5vgWizBKc2tX6NeiLdUlkQAXEUu782WPaqweNPCEvetthZ7mRaB8pAaT7E2RsLOumkQk47bSe6vu8sxgNFRHAcp0OMl/CEAeqNeLOx2f+sB/uhQbebi0J0iPUV4j91CEzWyH9KI/GYEF/rIqnd7XZ28a+aB5mlP8do/xhu4RZOjg/D5/hSmz3wi+aAcBukROf8XE7rHhVoYlxbPWoveCuq89kHJjNmwLwFDp+sjxFLZH5LmlGAHjwNpU1AM/JJVN6OayWT1UIhwTCym3OSLki2bWPlesholjjkhUEpVc9iiLgxYtK6O0b9u7yq91R0iPZ1if0U/NdqFD6rE5smxD/ZKxDlzh4ej0znRX0Oo/1juYEbGB4/iTwnVLfttrvftF0eQyAQxjT9RKPViEBlJU0WZBAB11bs2Gzw+hKdWTNh8VsWO/c4mc1UJrq/D4Z/JCLXYkcH41p+9GAlSu8BKWHQcjKR5d5tmqaJ3+9v99YCeMIAgJGWFytkuapzRnZdcpkoiHVzid8OvssU4Vk69gNCbPVegahwynkiMp05+mzO91/A9/kew+LDCDnB7LVvX2jNLDibNUIkqwgmaSyNQQTiNRpfrDF58t8aL7xk89lXceKNxCOUkY8ZOhWRK3Gt80lUd0OctJJzUl/Ck70guauXYFkW0WiUYDDY7sXBE4YG2OLgtLLEV7N/8pRAxHsIiW87+C5X5D+nY/1LiH3oUjstZZVTyfORmSzSFnC6/0yu06/jPZa3uFv1QGjbfon6gWA3JZAiIK6i7GuDV+YZPDPT5bV3bHY1GjvQMQL90MyLgCuwo0NxrRDN+VVsW8soSNta0msk67qO3+/P6vZzhScMUG8YrJPqsGwN0uDFfrMUawWimxC/3cF3haLgWR3rISH2sYub8rWr3WrmR19isfYKIu7erESRjptJsw+sqEak0uCLT3TmPq/zzAs2a9bFiDeWe6DnYwSHopnX4MQuxqruhrj18yIaQ+oFO1ULp9tpGUqpjAmO2iuHvDDU/li12OJgq4M0PDZ1viQ6C9YtDuYERWiBjjtNiL3t4qbiVpbbIAYigv5xHvZoB3QnOwEIRZvnMbiuicje7sqXXnFYu87g9XctdpXHM10LpaP7e6L7LkNkHE7sBKyagpRI7v9LEFerl/WabTTNxTTbvwg0xiEvDFA/xuDg4krrhKHe+ILmFpBtuA0NEqVC4ioH3yhFeI6OPU2IrXBxM0f94vxfNYYqxL0uhts92vqLWsjslcghmgY+XwTX3Ru1f//TBO9/mrmuMgowAiejGVfgWOdjVfdplnXQKA1+qmyTHtAUEVzX9borOwpGuishDgkjSmt6LOu5Dq2J39VaEMVCYoqDOVYRXqJj/0mIvOvWq3YueyzsX+1BfyqM8Z0i3FEx3O6x1mVENphRO/vnsuDzuRQU7KS4+C3i8QeoqdnZRFsMdF93dP8oYCp29Dis6ubFDpqL4wjZnC8zOfR67zfoOA7xeJy8vLys7SNXeMIAFBUW1j1PiEPmtCotQzV4kZULSoFVLFiXOgRO0QhepRF9tUEsxBGcD6vgdg3tiADGdUW4V8dwuyWHBLfoGmrElcjOiM7k4KNwOEGXLp8Az1JRMZsvv1yHZWWaQsoIYQROQWkTce0RWDV96vcstJb0WhyOanUZ/HSS47EyLYaOwCEvDEopwuFw2pIsDzTOdlww1c2Zf64Gr9H4xi0Xd3UE9+dRtEeC6NcXIpfHcXvHQG9Ja7JpIiStg+LiXeTnv47rPs2uXa9SWbmzyToFeqA/RuAurJoLUj0L2W7TAfp5hwCHvDBAshspWQU5eYI2d9h1U2TEyFq1tSbw1d/q0MBJdNZKeTP2BlVuVXKhK7irI/DzKNq9fvSb8pHJCdzeif2nO6dcoNZlPgqaBqFQlOLiL/D7n6ei4hm++uozrEYKoDREM88jUTU6ZSHkgAw3L7vRFKWkniuhaVpO0++ziScMgJ6e4CSkuiubSLlrKW1wQ9KVwR3qDi5KXMiywDs8xEPMi8+lyqlMruAI7voY/DKOesCPPjkf+ZaF2zcVpGyqja52ANdNqlaiCZ07lxEOLyKReI5du14jEtmZWR4NGNBNZ/S5Olu2wszXEtSNc1J6Vn3+Jpq692U2JittsL10V0LTNHw+X9a2n0sOeWFQSuEzzTqLIRmM7wD57Gl9+aZm0MntRNjO4wL7PM7WzuStwDL+yT9ZEH+Z8tTcGDiCrI/h/D6GNiOIPrUAmWjhDoyB3ogFobst6pXQNCEUilJSsgG//wWqq2eyYcOHWFb9mI0CCkOKkwcZjB+pMXaiS/cjLTZ9aLJspMamXalivEpy2mXaUPotC1w3t3kMtdZpe+eQFwYgY9qwrEYZmpPgdCCbTfN2JO3/ZOFaH2dHzmS4fjIf+D7gQfUQs+IzKXN2133AXR+FX0dR9/nRr85HbkrgHhbfKxAqueL+my6Ypkth4W6Ki1/Fsp5i1643iUR2ZFgHhgb9uuhcepHOpMnCUUMd8jpZoCV3l1cg+NL7/dskIzst09JVWRWGhq4EdJy6j54wQMYEIE4rqzo3LGqaa3/CFRdb6sdFFIqgE2B49GRO0E7gRv+NPKw9zAuJ2eywttc1TbbFcf4vjprhx7iiELnBxjmyJhmDyDDjpe5vsmfBorT0M0xzFuXls/jqq09JJKI0pCiocepxOpddorhwtNDzKAvN16A0mtS2O/0gkqKRs8zvBq5Dtm/kDV0J6DihzkNeGDRNo2fPnmnmnWCrRKsu57aY3VqlT8a6j30qFH7XxynRkzlJG8qt/lu517yXuYkX2WFvT9oEArI5jv1/cdSTAYyri5CrbLQlfpzqGoBUUs5uwuE4mlZBfv5b6Posdu5cRGXl1xl3QlOHvl10Lj5T5+qr4fgzbQKF7j67b5Um9Y9Lc1GqbacEzqY4JC2GHO4ghxzywqCUolu3bhQUFLBnzx5chDfkTc7WRmO6gSxc5Dk6EdKuFhfB2U+2pkJhuAYnRofwT+1e1vi+y2P+6TyZeJyvrW17N7s1hv3nGOohAydWA4m9t+vNm6fTvftOysreZ8uWzxq1DgoCijMHm0ycBOdc7NLrcAvN37zCqconaPWC9m07BsRxshtjSFoM9XslOgqHvDAADB48mIkTJ/Lggw/iui73xB5GBTVutG6lZ+IwFNqBC4RW/+6eLdJv0AqF1sydJGMQJsfHBvNH7fdM9V/Lg74HmZl4jq3WltTGQcoyu2wrK7+msvKRjOWagv5ddEado3PZpXDSeTahkn1bB000rsFrN8fjNRSotHT4LAqDCMTjOps37xXPTp06dYjAI+Ry8HkHwufzMWXKFIqKigDY41by25q7uEgu5r7Qn/na/ApH2QcWlHSpK+GWTVorNrUWxHHRY7kr8heW6Ev4cd5P6OXr06xJeBVQFFKMONHkr3f4WbpEcdejFmdPShAqdVFaNqxmJ7e9EqKjtPy019kJDoqA4/hZuLATq1aVAVBQUMDUqVO97sqOhOu6zJ07l4qKir3LED6x1vMD+z94wHyEG4PXMtmeQkmiB8nLqrlnfY6Cjw0idwfqiSfnxtA5IjaQ/9V+zw3+G3gi/CSPxh9hs7UpY32NpHUw9nyDSZOFY092CHdO9Sy08jCVlrQ+2gxRKK1+fYTW3NFFwLYDfPVVF558MsD992+joiKKUoqpU6cyceLEDuNOeMIAfPnVVzz11FONzkZsicOqxKf8MPH/eMz3JDcFr2e8PZFSq2mBaJNwWYNqx9nYp+EaHB09iv9S/8mE4ARu1W/lndjbde/7Dbh9so/v/kjodXQC3Z+qXpCtYd5acpRlHa0c5docJK03p8FcM838PIBGTU2YFSuKefZZjRdfLGfTps04jptaR/jss8/Yvn07/fr16xDuxH7lSykVUEq9q5T6QCm1Win1X6nl/ZVS7yil1imlnlJK+VLL/anX61Lv98vxMbSar7dtY/v27XWv9WNMjGv96H2NupPexuG9xEd8O/ZTRmkX82joH+wytyIqNWFEGvVPLpWbQHS9XgkNneyk2ian39M5PjKYnxs/J6DtLSN38TAf//V/Nn2HWBiBVEAxl+e4VKDIbbJZurBXViaIx5vn9yXdBZMdOzozY0Y/LrusgLFjt/P3v2/gyy/31IlCLQsWLODXv/51hykG2xy7Jg6cJyLHA0OAi5VSpwB/AO4SkcOBPcCNqfVvBPaklt+VWq9dUztGvhbjKhPnAQv1kob5cz9an70XnS0Oy+OruSX6Y8ZrY3gidD8V5q7UHTu5Da1BAdhckC4+mtIwldn0ygfI4c4AggTqXg8bopFX3LwehgMhs3uvDSwvbe/3lkg4yaHX+yDpLvhZt64Pf/xjX0aNguuv38TChZupqkobHao0lB5I+5zw7rvvUlVZ2SGSnPYrDJKkOvXSTD0EOA94NrX8UWB86vm41GtS75+v2rnt1HDSGXEEMVzsoxJYv02gLdAxv+NH66bvrZEgFm/FV3Fj5AdM1MfzbOhflJs7Ec3FSa8AlaPMx/oFRlSzAoYtQaHQGkwZpxstHLrd4n02PCFzG3xMWnN7g4G6rmgsBJB0MTRqagp57bW+/PgnPRgxoopf/nI9K1fuJB5PswI0H3poKGbR/+ArmY4W6Fv3VjQapbqmJofHkz2aFWNQyemBVgCHA/8AvgDKZa+DthnomXreE9gEICK2UqoCKAF2NdjmzcDNAH369GndUbSShsKw9w3AEOwjEqi7FPrNJvr9JvaMBLI7aSrGxWJh7C1eU+9xmv9ELvSdx0xrTt0mxJXUdPI5P4gcbDP7m9zvLuvtM9NNy/4O06YndKRed2VSEEx27y5k8eIS/vWvCG+/vZ3KysbqRhRj5J2P0qZgR0/DKu+E5ouj+R/AjX1Vt943KvgoIg4wRClVBMwCjtr3J5q1zWnANIBhw4YdVNvKNM16P5hUuPXPRwViCPaxCdRfFPo1JjygcJ63kLK9ArEk9g5LeKfetpMVjtvg8HJglqS7R0lyqxRKk/pzO+Sin7chafuIxx1sW0/FDwJs2NCZmTN9PPNMJatXrycWaxAfUBqarw964BJgAk50GG4iQN33JCpZo68D0qJeCREpV0otAU4FipRSRspq6AWksmPYAvQGNiulDKAQ2J3FNmedDFeiqVIBCsQn2MMTqBMVxq0++CvY8yykvImTWMCs1rBrT8Bc3djbwlvLxcS5aRg+KAxq1NXVawuLJS0hZPv2Kp56qi/HDArw8nyTF14oY9OmisyqS5ofI3Qsmu8G3PhIrKre4OqNNLjjFoLZrzAopToDVkoUgsAIkgHFJcAEYAYwFZid+sgLqddvp95fLO082qLren0TL7GfO1VKIKxhcdRDGsb7JtwL9mwLqar/WdcC7SdQ8EOd6BgXKz87fnr9BKeW5FU0n4wfLddWvQZGWueKSJzcjaCq3eneSyAaTfAf/7EBTdOIxxuW91PJIrR5F4B2DW7sdBJ7SjIGYtUnt8PGc0lzLIbuwKOpOIMGPC0iLyql1gAzlFK/A94HHkqt/xAwXSm1DigDJueg3Vklo9Z/c89FBRJwsU6Jo07QMK4zkXsEe26C9Amza5a76DdC4ByNwHc1Yme7WKHGhhM2n4Mhtbk2ShT1E5zEqYEszjyetmUAdF8NYm+p945lNdif0tD8/dD9oxCZjBM5AdcK0qwfTjUybrx93yPr2K8wiMiHwAmNLF8PnNzI8hgwMSutayM0TatvMbT0t1MgfhfrvDjaUB3jKj/2S/X9EScGNS+7aEshb4RO4HaIne5i5R2gBdEG51fGoOtcWwwKfEb6Xh2ybzEImq8KI/AuqAdIVL3R+GqaHz0wCC0wFYlfhl3dHXFqzZlm/mCNfF8dQxa8zEcA/H5/vRx2qRZwVcsKp6bOFbfAwTjZBy81vpobg6o5DvpiCKUEInKGg+OnRQKRi4FZGfto0F3ZFmEMX3o6RtauIgHlovt2oQdeRpx/YdUsT1kkDdB8GHkjUdr1uPFTsfaU7sdd2AcdM7wAeMIAJAdR1RMGm9adlHpa37/SOD/vVFwR3omtosqJAODUQNXzDsYSRXCUDrcI0VNcHB/NOqGkDQYVNOyVyLkVrBq4EmLRuh9CULqNEfwEpT+Hm5hJomotuE1lH2qYBTfjRH+LGy+k1Vd2Rjd1x1EKTxhopHpvay+AtOy5Ij3MXc499LMH8E7+Ev7m3M0rkbepdpLDce0KofpJB2Me5I3XsW8TYkNc3P0IhNpPhl5WaKqAUw53V7+0W9r8nM0mlX1qVqMHVqIZ07EjL+JU72B/B6D0EG5ianZEgWRSFBJIX9IhxkmAJwxAIyPqUmUPD/g6aND1bzg+QlYB51Rcwsm+M1kaXsB9zjReibxFNDVjrV0BlY86GHMUofEa3KSIDHVwm5pbpU3Or7b1iJWCwAGPSk66C0ZgJ5pvLmI/jh15D3GqM9YsydM4b7hOt27w9FyH7RWp4rO6H5F8svXlKkCpjnmJdcxWZxlN07Nb77+B/19rgitRhOLFjEpM4izfhSzIn80/7Qd5M7qcWGqiWrtMqH5YMF9QhK/Uca4TooPdDIFoi+B2W5Soa2SndYhrNWOEZa278CmaMQsn8SyJyk9B6rsLuoL+XXUuOkNnytRkqTnNENxrffxjZrxuW9n9YhXogf2v1g7xhIHknSqjV0JaYTPsw1xUKBBFOF7MZfGpjPCPYVHBXO5O3Muy6CriqRPa2iVY9ziYMxT5V+hYNwuxo1ICAag2iTEcBNJ2Km5TYyWS+QGaUY3uX4FmPI4VmYNVvZOGrfabMGSAwXVX6Iy+3KX7QCs5XFyBa0OvbmmJba6D0rLcC9IWUeIc4AkDmd2Vqg1KDapUVlxBvDOXJqZyju8i5ufP4X77QZbFVhFPBcisnULF3x3M5xR5V+s4NwhWX0Ftp018/rYMmCkNQsH0BY2t5GIEd6D7X8RNTMeOrUTsTHehNKwx4jSdiZcrzrzIoaRXPHmNNtimmeG6ZPlLbZjW/U3JYzgU6NSpE4VpE9viqqyeH/u7tJQoiuPdmJz4FiN945hT8Ax/T0xjRXQ1TurEsrYJ1v85+B5XBIdqRN/M/TgCt+FYiVwnOCkIBuplOKEZcdxadyGwHs18Fsd6inh54+5Cr84ao84yuOE6GHyWjS+v6dqTSoE/kMsLVZIJLLX7w8tj6FDouo6RNk1dcs5GlbUfsTnbqXUxCuNduCbxbS7yj2NO/nPcZz3Iqtin2OKAQGKbkHixod/dSIZdDsi5VSzJgqy1uHYZRugeTP1UlL4AO/oyVs02MtwFA4YeYXDtlRoXXuLQ+wgru9WlskRHEQXwhAGgbuqwutcRlbwZHYS4Ua1AdIn14ob49xgdHMezBU/yUOIxPo59vncwVhqW2GzWtyAqt6n54uT2KhMXqmrSgww2icp7UOofiJuZGl0S1rjgZIOJl8E5Yxw69Uo06i40vwE2Sms4RqI1qHqFYKCRHrB2iicMKeoFHx0aSU5pAVnxIxVKFF0j/bhN+xkTApP5d8EjPBibzmfxr+r171tugjutO9gT2sOl1ni6JrpkpXBLRq9ErlQnFdPZ9KnBq6saCIC4SJoYagp6l2hcdKbBt26CwafZ+PMPoFR9ioYVozRfnFQOWnbQsl9Zqy3omCHTHNCqsRINSXeTW70phe7qdI3050dVv2KhNp/vFlyHv0Ept68SX/K9yHcYoUbwz9D97DJ347aienRjjc/+FG5JKyFSrrF4ho9bbobPtzbePRk0FWcMMvn7r30sXqBx75MWwy5OEChsXal6n7+hgZHlSIDkYhBY7vEshhT1hMGllWN3VL1nrb+eUn0YrkGv6EB+6/6RDaGNzKl5pd5ajjisjn/MD9T3mO57jFvCtzI6PorOVumB5SQ0nJA1W/FOAdeBXRsMFr6g8/Qsl6UrLCpjmRdkUUhxwXCDqydpnDXSpriX0zp3IR0Fek5vjbKP9Ov2jScMKbT0Qi1R6mqFtJZshwUVinC8E2eaZzCXxameg2RgsPbCtcXmnfgyViZWcKzvOH4c+jEjExdTbBe1SCCy2e5a78qOKtZ/rDPvGYPpM21WfxUn0cR3nedX3P8/PsZOtQgUWAfsLuyTBq5E8o6QrZ0o0IP7X60d4glDCj2tV0J2uGhlGm4nDnBI9N5LKhehJgUEVe28msn5HovvMHHWCzXzHKyK5P4tsXg/voLr1FRO9g/nu/7vMjJ+MQV2frMEQsuIMbS8rZJSxkiZzrsLdWY8BXNfs9m6J5YhPErVn+sx4IcTTnWT7kIbxOxEBFS2Tf8GVpeXx9CxSHcl3K02+v8LYPzOhz0g0fILIs3kztVpkH5ha4Yidq5L4j9c8t7Rcf8GkUUOdnVy77ZYvBV7gxXacs70n8Vtvts4P3HefgWiYXyiRd2VKXdh90adJXN1pj8Br75vURXP/Eby8oopKTmDUGgwO3Y+TdnudclNCDhWbnsca129ulZlMcAqCOLsnbuyyaLD7RBPGEj+YF26dNm7wAXr6RjaCgPzV36csTZuodP8M7SNf/vaORetgFB+to0xXBF6Q0f+CtGlDnYkebLH3RiLogt4Q3uN0/1n8gPfDzg3fjYhJ9SoQChaGCFJ9S7YUcWGj3VmPaEzY47Nmq8SGe6CpukUFvampORiXHcqO3cOZtcuP337mewp+02b3Vl9gfpHmM3xIYrMKfA8i6EDoZTilltu4eOPP2blypXYtp28462zcW90ME4z0X9mYJ+fQHzNqLiUlv+QK41I747UDFC1GYMK7KBQeYGNeboi/IqOcy9EXndwUjkCMTfGK9GFvKW9ydn+c7hNu43zY+cRcoL1L4wGjW9qPFOtuxDdo/HOIoMnn4R5rzls3RPPsJh8vgAlJccTDk8gHh/Hli39iUaThVQNQ3DsIpRKiR25TwrSjNztIWkx7A0+dhRRAE8Y6hg2bBizZs1i2rRpPPTQQ2zevDn5hiXYryZQ72sYU3y433ZxjrKa7m5QoEJtbDJopE+PUNcOKySUj7Exz1WEl+g4fxGib7s4KXM+6kZ4OTqP17RXuTgwku/IdxieOJmg07zMLpFkb9zujTpvLNJ5dLqwpInehVCoiJKS0wmFrmb37hFs2NAJ227sS9xr3IsLdkzlalrg5DHUm/ZeSJYIz84eleYAVXWvXdfNrDjdTvGEgb2+X/fu3fnFL37BuEvG8de//ZXnn3+eyspKAKTSxbo3jvaCju/2IPaNCdySJsqcN/DFc3FSu83tT1VghYWKMTa+szUKXjZw/i5UL7PretIibg0zI8+yQJ/Pef7z+aH8kGGJoXyuf0Gcvbn+NVUK1wFNT7oLG1cbzHpC5/HZNms2NuUu9KK0dDy2fQW7dx/Pli1BktdGU99K2vweAnaiDUVWhOSMjK3eEGguet4ynOqVdUsdx2l04uT2iCcMaSil8Pl8nHDiCdx///1ceeWV/Pd//zfvvvsuiUQi6V5sckj8RxR9ton5QxN7dAIJunvPc4GG87C2CwNSQaLAJTHRJXCBRuELJtY0l8gKh1QpCKqdKl6IPM9SfTHH+07gq/hXRNy9aYAzXrI47u9+AnnCiy8L81932FRmNeIuBFPuwmXEYuPZvHmvu7AvkvNCahnLcoZKily9/bVqg4LSLfS8dWjas9g1D+ImdtS9m1GNvB3jCUMTBAIBLrroIk4cOpSnZszgH//4B5999lnST3TAedvCXWWjX2rCT8AZbCG1xWPbs7WoIFbsEr/WxTdGo/BFE+sel8iHDrXDESqdSl6Pvprx0S92OEz9eVIE43ZmTmUwWEjnzqcSDN5IWdm5bNhQlLrQW3IxNLAYcpwfZJipiXRrD6bFM0elSsn5Ymi+j1D6QzjRF7CtHRkZYUceeWT9IHc7xhOGfaCUonNpKbfffjsjRozg3nvv5YknnmD37uTEWhIV7CcSaK/omDf5cb5t43Sp33vRLqyFhiTHaREvdUlc6xIcqVM02yQxzaVmlbPPokmxBrUmNU2nuLgXpSXjiCcmsmfPEDZvzqs3B+SBIgKJbFj2+yCzC7a5ql4rCFGM8FLEuR878jpi7am/faUIh8OMHDmSO+64g7y8vA5hNXjCsB9q4w9HHnkkf/7zn5k0aRJ33303c+fOJRJJmtnudofEfzvoc03Mq/y4c/deWW1yCijgACvTiQaRrg7RmxyC43SKnzSJPeQQ/dTdZ5q/zxekuHgw+fmXEY9fyqbNhxGJtO50SroNRt2FI6lciFxS/6YuKC1zwtoMNBfdvwPNNw/XfhKr4u2MUvS1MavRo0dz1VVXcfLJJxMKhbLa9lziCUMzqY0/nH766Rx//PHMnDmTu+++mw8++CAZUBJw3rdwPrByPvgoA40DFoZaREGki0P0ew6BKzSKnjaJ/c0huqH+HTQQCNOlyxkEgzewe/e5fPll8QG4C/tqSNuekkqj/u+lmqoELCjdQQ9uRPO9gBN7BKtyTWaxGF3nsMMO4/LLL2fSpEkcffTR+P3+hhtr93jC0EJqTcMpU6ZwwQUX8Mgjj3DfffexZcuWZPyhgSXqimDpcQTJWXFVRZbEJ+ViRLu5xL7rUnKUD2uCVZdBGQ6X0KvX3/j66/Fs3hzaT+/CgZEeuXBdiObYlfD5UyXda6OcjQmCYaGHVqP06TjRmdg1mzLiBz6fj2OOOYYpU6Zw6aWX0rt37w4VbGyIJwwHQK170aNHD372s59x4YUX8ve//505c+awZ099H7PCruapvMf4sfSmIF6aszqKWY1lpCrb2b1cVFpNxF69LmHLlglUVTVzVpwWIgKGbtZdTI4IkUYmi8ommt7gSFSt7yJovmr04DJQT+JE5tbrYailoKCAIUOGcM011zB69Gi6d++e3EwHFYRaPGFoBUopTNNk2LBh3HfffUydOpXf/e53rF69mpKSEr788kui0Sh/rLyX1eFPuDPwc46vPg3D8WfVehAhN3O/pg8fVwqlHUE8nhtRgORx5OeXYpoGtm2jUBndiTlFbJAFGOETUcYaxJmGXf16o3NTFBUXc9GFF3Lrrbdy3HHHUVRU1KHGQuwPTxiygFKKQCDAueeey3HHHcf27dsJh8P86Ec/YubMmcTFYmbVAl433mNK3uV81/0BfWqOQomWPYFoi5I7ouW8l0XSUkpFBCubldYawXXTrS0hUT4dzXwJt6aMugSPFLqu0717d8aMGcM111zDiSeeSCAQ+MaIQTqeMGSJ2pOjtLSU0tJSRITvfve7LF++nI0bNwKw097DXysfYn5gMd8ruI3LY1fTKd6t9e5FbRmBNqAtLwFXIJbDGIM4ig1rNZz0LCrXxo1/XW890zQZOHAgV155JZMmTaJfv36YpvmNFIRavNJuOUIpxemnn86Mp57i0ksvJRBIjj9wEVbH1vPdyjuZoI/n9aIXSRix1pVggzZJmGibmghavf04WRa85EhUSFRrvP68yd8ftZvUVJ/Px9ChQ/nzn//M/PnzufPOOxk4cCA+n+8bLQrgWQw5xTAMThk+nOnTpzPjqaf4+z338NFHH+E4DgmxWRp5l/GJq5kcHM933O9zZPQ4NNdopnvRYL6HnEh8wyIjudhHOgqljHoXXbYuv9oRoDW7Nd6Yb/DodGH+mzZ7apKyMGDAABzHYeOmTeSHw5xzzjmMHz+ekSNH1stW/KYLQi2eMOSQ2pMoFApx/XXXMfLii7n33nt58MEH2b59OwB77Cruq5rOy77FfL/gZibHp9Il1hsl+66FYIm997J1yXnwsa1w3TSPXyDR2uOqLRizSWfJizqP/lt4dZVFTWLvfvLz8/nNb37DEUccwaJFizjt9NMZNnRoXfzgUBGDeohIsx4kU2jeB15Mve4PvAOsA54CfKnl/tTrdan3++1v20OHDpVDAdd1JRaPy9tvvy2TJ0+WUChUW3JAADGULsNDx8kLRf+WiFkpLm6j35iDI/8X/o1oyXJDYoaVhN/Spa4sdDb+uUjRx6aYnZL7UErJ0Uf/QXw+V/Ya5Nl/DB68VEKhPAFEV8g9/88nrtPs07Tu4bqIHUc2rDLknjv9ctIRhvgN6n3fgBQWFsqvfvUrqampEdd1xXEccV237U+ONgBYLs38AltigH4f+CTt9R+Au0TkcGAPcGNq+Y3AntTyu1LreZDKnjRNhg8fzkMPPcR9993HSSedVDcLli0O70Q+5Kqqm7gpMIWV+a9jp5KjDhUcJ0R6GqfWwqRKEUhUaXy41OSXt/k470Lhe7+P895nNvGU9aGUonPnzlxzzTXMmjWLO++8k2AwiFKqQyclZZXmqAfQC3gFOA94keRPtQswUu+fCsxPPZ8PnCq1ie/J9dS+tn+oWAzp1N6dtmzZIr/+9a+lR48eGXezrmaJ/KbwJ7IttF4cZTdtMeQrCb/9zbAYBg16T0KhgjqL4Z//5RfX3c8p6iKug9SUafLGLJ/cNs4v3Qo1UQ2+T13XpU+fPnLrrbfKsmXLJBKJfGOtg8agBRZDc2MMfwV+BuSnXpcA5SJ1w2w2Az1Tz3sCm1KiYyulKlLr70rfoFLqZuBmgD59+jSzGd8c0rMn77zzTkaNGsU999zDrFmzqK5OJtRst3bzXxV/YXZwHj8o/DbjI1eRlyjK3FjtqZ9lkudS21N7wxaBSESSx9bITVxSx121Q2fpizoPPiq8ujyzgpRhGBx55JFMnTqVsWPH0r9//0OiZ6E17FcYlFJjgB0iskIpdU62diwi04BpAMOGDTt0bOVGqM2evP/++xk9ejR/+9vfWL58OZZl4eCyIrqGb8V/yPOhOfww+AOOiw9jh9rxjXQwXNdHuivR1DG6CcW2z3Vemq3x76dc3l6dWUEqGAwy5IQTuOrKKxk/fjw9e/ase88ThX3THIvhdOASpdQokmVOC4C/AUVKKSNlNfQCtqTW3wL0BjYrpQygENid9ZZ/g6g9SQOBABMnTuSss85i+vTp3HvvvWzcuBERIe5aPFc9n9eMdxgcPJKPYp/lPPZwMC4eERPVRJ16EXDiii/X6Mx5Qufhpx0+25opCAUFBZx66qlMmTKFESNGUFJainao9i4cIPsVBhG5E7gTIGUx/ERErlZKPQNMAGYAU4HZqY+8kHr9dur9xXKwbNIORq170a1bN37yk58wcuRI7rrrLp599lmqqpJFRXfa5SyueqeRD7dxY3PG3nQjAexEKqBYqfHx2zoPPwwvvOKwtcwmrWcTpRSlpaWMGjWKKVOmcMoppxAKhTwxOEBak8fwc2CGUup3JLsxH0otfwiYrpRaB5QBk1vXxEOPWoE49thjuffee5k8eTK/+c1veO+995K1JxvgWqB9/c24AET2dkMI8OlHihcf8vPUM8L8t2x2R+rnKRqGQa9evRg1ejTXTZ3K8ccfj2kmJ/z1ROHAaZEwiMhSYGnq+Xrg5EbWiQETs9C2Q57awVkjRozg+OOP5+mnn+aee+5h3bp19QKDTlxwfikUdDKoOdXBMaSDWhCCUvF6tQ6eWBznqVcVUauxgOJRXHfddYwbdwl9+vTxAopZxMt87ADUzpR1++23c8EFFzBt2jS2bNmCK8K8uXOJRqPUrHbwXaYouMrA/p5QfZjNfpIn2xlCXl4CeJForLJuacKFdJ/B7/czZMgQpkyZwrhx4+nRo/uhm52YQzxh6CDUnvxHHXUUf/7znxERKisrmTBhAkuWLAEgsVtI/N0i72Wdoh+bRCY4xDu57VoclBJCoTilpWvx+x9n48b7cRw7Y4Lb4uJizjjjDCZMmMBFF11E586dPUHIIZ4wdDCUUuh6sjuvuLiYP/zhD9x6662sWrUqOcuRQM3nydqNeY/rhO4wqTrfxm7O1HptRrJke35+lK5d38Vx/sWOHfOpqdmJiItSirFjx1JUVMTKlSsZOnQo1113HSeddBLBYLDeBMQeucEThg5O7dR6Dz74INOmTasbnOUmoOp1B3OVS3iijvM9qDnWxm3LikgZCLoulJSUUVS0mFjscTZvXkI0WlVvrSOPPJI//elPHHbYYZSVlVFUVOQFFNsYT3o7MLWmdJ8+ffjl//t/PP/880yaNIlwOFy3jlUllD9sY412KfyjiX+bhmp2jYP6Ab8DvyYFn8+hS5fNDBz4EKZxCV9+OZWNG1+oJwr5+fmcd955PPDAAwwYMADDMOjSpUtdUNEThbbDsxi+IaQPzpozZw533XUXK1eurJsrMbbFJf4rl9CzOnk/Nam+xCYR3J97Uf/NlmWjJFcOBl26dv0Cn28Gu3c/xbp1n2M3mF6qsLCQiy66iBtvvJETTzyRkpISTwQOMp4wfINQSpGXl8fkyZM5++yzmT59Og888ADr169PDo6xoWalQ/wGl/BYncCPoeYEG8cgi/GH2vhBjJKS9zGMp9i1aybl5VvqBRM1TaNr165cdNFFXH/99QwfPhyfz1d3HB4HF08YvmHUXlQ9evTgJz/5CaNHj+bPf/4zs2fPpry8HAA7KpQ/beNbqii4wST2bZdYT6fl0zY2QNdd8vMr6dz5XSzrIXbsWEQksqeeIBiGQf/+/bn00ku58qqrOOqoo/B7+QftDk8YvsHous4xxxzDvffey1VXXcX//M//8Oabb2LbyUGxiR2C9UeL4Is6xT81qb7cIRFqafemoOvQpctOCgrmUVMznY0b3yUer19y3TAMBg0axLXXXstll11G79690XXdE4R2iicM33CUUgSDQUaMGMGQE07gySee4P7772ft2rW4rou4EPnYIXaTQ/6zBoEfadSc5uCYsp+h3EIwaFNc/CXh8DwqKx9h3bqPcZz6tdiCwWDdhCzjx4+vm5Cltm0e7RNPGA4Bai/AzqWlfOc732HUqFHcfffdzJgxg127kmUy3ARUzLEx31QUTjWwvi2Ye1S9WpJK2eh6MkOxa9e1mMYj7Ng5i+3bN2cIQmFhIaeddhrXXHNNcoRjKqDoiUHHQLWHgY/Dhg2T5cuXH+xmHDKICIlEgrfeeou7776b+fPnE41G695XGvj7aJiFiqoPnTrLoVevUykq+g41NfPZtWsB1dXbM4q5lJaWMnLkSK699lpOPfVUb4RjO0IptUJEhjVrXU8YDk1qf/doNMoTTzzBPffcw5o1a+riD02haTpug7npdV2nR48ejB49mhtuuMEb4dhO8YTBo9mICK7rsmXLFh555BHuvffeuuzJ/WEYBgMHDmTq1KmMGzfOK5nWzvGEwaPFiAi2bfPuu+9y9913M2/evLrakw3x+Xwce+yxTLn2WsaPG9fhp3w/VGiJMHjBRw8gafIbhsFpp53GCSecwAsvvMBf//pXVq5ciWUlMxXD4TAnnHACU6+7jrFjxlBaWuoFFL+heMLgUUf6zFmTJk3izDPPZMaMGcyZM4cePXpw1VVXMXz4cEpKSrwRjt9wPFfCo0lq5xiwbbvOogAvoNhR8VwJj6xQ6ybUjmHwOHTw7EEPD48MPGHw8PDIwBMGDw+PDDxh8PDwyMATBg8Pjww8YfDw8MjAEwYPD48MPGHw8PDIwBMGDw+PDDxh8PDwyMATBg8Pjww8YfDw8MjAEwYPD48MPGHw8PDIwBMGDw+PDJolDEqpL5VSHymlVimllqeWdVJKLVRKfZ76W5xarpRSdyul1imlPlRKnZjLA/Dw8Mg+LbEYzhWRIWkVYO4AXhGRgcArqdcAI4GBqcfNwD+z1VgPD4+2oTWuxDjg0dTzR4HxacsfkyTLgCKlVPdGPu/h4dFOaa4wCLBAKbVCKXVzallXEdmWev410DX1vCewKe2zm1PL6qGUulkptVwptXznzp0H0HQPD49c0dyaj2eIyBalVBdgoVLq0/Q3RUSUUi2qKisi04BpkCwG25LPenh45JZmWQwisiX1dwcwCzgZ2F7rIqT+7kitvgXonfbxXqllHh4eHYT9CoNSKk8plV/7HLgQ+Bh4AZiaWm0qMDv1/AXg2lTvxClARZrL4eHh0QFojivRFZiVmkvAAJ4QkZeVUu8BTyulbgS+Aial1p8HjALWARHg+qy32sPDI6e0iwlnlFJVwNqD3Y5mUgrsOtiNaAYdpZ3QcdraUdoJjbe1r4h0bs6H28uEM2ubO0POwUYptbwjtLWjtBM6Tls7Sjuh9W31UqI9PDwy8ITBw8Mjg/YiDNMOdgNaQEdpa0dpJ3SctnaUdkIr29ougo8eHh7ti/ZiMXh4eLQjDrowKKUuVkqtTQ3TvmP/n8hpWx5WSu1QSn2ctqxdDi9XSvVWSi1RSq1RSq1WSn2/PbZXKRVQSr2rlPog1c7/Si3vr5R6J9Wep5RSvtRyf+r1utT7/dqinWnt1ZVS7yulXmzn7cxtKQQROWgPQAe+AA4DfMAHwKCD2J6zgBOBj9OW/RG4I/X8DuAPqeejgJcABZwCvNPGbe0OnJh6ng98Bgxqb+1N7S+cem4C76T2/zQwObX8PuC21PNvA/elnk8Gnmrj7/VHwBPAi6nX7bWdXwKlDZZl7bdvswNp4uBOBeanvb4TuPMgt6lfA2FYC3RPPe9OMucC4H7gysbWO0jtng2MaM/tBULASmA4yeQbo+F5AMwHTk09N1LrqTZqXy+StUXOA15MXUjtrp2pfTYmDFn77Q+2K9GsIdoHmVYNL28LUmbsCSTvxu2uvSnzfBXJgXYLSVqJ5SJiN9KWunam3q8AStqincBfgZ8Bbup1STttJ+SgFEI67SXzsUMg0vLh5blGKRUGngN+ICKVqTEtQPtpr4g4wBClVBHJ0blHHdwWZaKUGgPsEJEVSqlzDnJzmkPWSyGkc7Atho4wRLvdDi9XSpkkReFxEZmZWtxu2ysi5cASkiZ5kVKq9saU3pa6dqbeLwR2t0HzTgcuUUp9Ccwg6U78rR22E8h9KYSDLQzvAQNTkV8fySDOCwe5TQ1pl8PLVdI0eAj4RET+0l7bq5TqnLIUUEoFScZBPiEpEBOaaGdt+ycAiyXlGOcSEblTRHqJSD+S5+FiEbm6vbUT2qgUQlsFS/YRRBlFMqL+BfAfB7ktTwLbAIukH3YjSb/xFeBzYBHQKbWuAv6RavdHwLA2busZJP3MD4FVqceo9tZe4Djg/VQ7PwZ+lVp+GPAuyeH5zwD+1PJA6vW61PuHHYTz4Bz29kq0u3am2vRB6rG69rrJ5m/vZT56eHhkcLBdCQ8Pj3aIJwweHh4ZeMLg4eGRgScMHh4eGXjC4OHhkYEnDB4eHhl4wuDh4ZGBJwweHh4Z/H9aFjH1VfwCrAAAAABJRU5ErkJggg==", 31 | "text/plain": [ 32 | "
" 33 | ] 34 | }, 35 | "metadata": { 36 | "needs_background": "light" 37 | }, 38 | "output_type": "display_data" 39 | } 40 | ], 41 | "source": [ 42 | "img_rubic_BGR=cv2.imread('rubix.png')\n", 43 | "img_rubic_RGB=cv2.cvtColor(img_rubic_BGR,cv2.COLOR_BGR2RGB)\n", 44 | "plt.imshow(img_rubic_RGB)" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 48, 50 | "metadata": {}, 51 | "outputs": [ 52 | { 53 | "data": { 54 | "text/plain": [ 55 | "" 56 | ] 57 | }, 58 | "execution_count": 48, 59 | "metadata": {}, 60 | "output_type": "execute_result" 61 | }, 62 | { 63 | "data": { 64 | "image/png": "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", 65 | "text/plain": [ 66 | "
" 67 | ] 68 | }, 69 | "metadata": { 70 | "needs_background": "light" 71 | }, 72 | "output_type": "display_data" 73 | } 74 | ], 75 | "source": [ 76 | "B,G,R=cv2.split(img_rubic_BGR)\n", 77 | "rows,cols,_=img_rubic_BGR.shape\n", 78 | "\n", 79 | "for i in range(rows):\n", 80 | " for j in range(cols):\n", 81 | " if R[i,j]==0 and B[i,j]==255 and G[i,j]==255:\n", 82 | " img_rubic_RGB[i-3:i+3,j-3:j+3]=(255,0,0)\n", 83 | " if R[i,j]==255 and B[i,j]==0 and G[i,j]==255:\n", 84 | " img_rubic_RGB[i-3:i+3,j-3:j+3]=(0,0,255)\n", 85 | "\n", 86 | " if R[i,j]==255 and B[i,j]==255 and G[i,j]==0:\n", 87 | " img_rubic_RGB[i-3:i+3,j-3:j+3]=(0,255,0)\n", 88 | "\n", 89 | "cv2.imwrite('rubic.jpg',img_rubic_RGB)\n", 90 | "plt.imshow(img_rubic_RGB)" 91 | ] 92 | } 93 | ], 94 | "metadata": { 95 | "interpreter": { 96 | "hash": "965ba1120b0c101b3f715b6e258a73742ec1cf86f2c8b04492724c87d9f112c3" 97 | }, 98 | "kernelspec": { 99 | "display_name": "Python 3.8.9 64-bit", 100 | "language": "python", 101 | "name": "python3" 102 | }, 103 | "language_info": { 104 | "codemirror_mode": { 105 | "name": "ipython", 106 | "version": 3 107 | }, 108 | "file_extension": ".py", 109 | "mimetype": "text/x-python", 110 | "name": "python", 111 | "nbconvert_exporter": "python", 112 | "pygments_lexer": "ipython3", 113 | "version": "3.8.9" 114 | }, 115 | "orig_nbformat": 4 116 | }, 117 | "nbformat": 4, 118 | "nbformat_minor": 2 119 | } 120 | -------------------------------------------------------------------------------- /Assignment29/carrot.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 10, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import cv2\n", 10 | "import matplotlib.pyplot as plt\n" 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": 11, 16 | "metadata": {}, 17 | "outputs": [ 18 | { 19 | "name": "stdout", 20 | "output_type": "stream", 21 | "text": [ 22 | "1500 1156\n" 23 | ] 24 | } 25 | ], 26 | "source": [ 27 | "img=cv2.imread('Carrot.jpg')\n", 28 | "height,width,_=img.shape\n", 29 | "img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)\n", 30 | "print(height,width)" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 12, 36 | "metadata": {}, 37 | "outputs": [ 38 | { 39 | "data": { 40 | "text/plain": [ 41 | "" 42 | ] 43 | }, 44 | "execution_count": 12, 45 | "metadata": {}, 46 | "output_type": "execute_result" 47 | }, 48 | { 49 | "data": { 50 | "image/png": "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", 51 | "text/plain": [ 52 | "
" 53 | ] 54 | }, 55 | "metadata": { 56 | "needs_background": "light" 57 | }, 58 | "output_type": "display_data" 59 | } 60 | ], 61 | "source": [ 62 | "plt.imshow(img)" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 13, 68 | "metadata": {}, 69 | "outputs": [], 70 | "source": [ 71 | "B,G,R=cv2.split(img)\n", 72 | "\n", 73 | "R_new=G\n", 74 | "G_new=G\n", 75 | "B_new=R\n", 76 | "\n", 77 | "carrot_img=cv2.merge((B_new,G_new,R_new))\n", 78 | "carrot_img=cv2.cvtColor(carrot_img,cv2.COLOR_BGR2RGB)\n" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": 14, 84 | "metadata": {}, 85 | "outputs": [ 86 | { 87 | "data": { 88 | "text/plain": [ 89 | "" 90 | ] 91 | }, 92 | "execution_count": 14, 93 | "metadata": {}, 94 | "output_type": "execute_result" 95 | }, 96 | { 97 | "data": { 98 | "image/png": "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", 99 | "text/plain": [ 100 | "
" 101 | ] 102 | }, 103 | "metadata": { 104 | "needs_background": "light" 105 | }, 106 | "output_type": "display_data" 107 | } 108 | ], 109 | "source": [ 110 | "plt.imshow(carrot_img)" 111 | ] 112 | } 113 | ], 114 | "metadata": { 115 | "interpreter": { 116 | "hash": "965ba1120b0c101b3f715b6e258a73742ec1cf86f2c8b04492724c87d9f112c3" 117 | }, 118 | "kernelspec": { 119 | "display_name": "Python 3.8.9 64-bit", 120 | "language": "python", 121 | "name": "python3" 122 | }, 123 | "language_info": { 124 | "codemirror_mode": { 125 | "name": "ipython", 126 | "version": 3 127 | }, 128 | "file_extension": ".py", 129 | "mimetype": "text/x-python", 130 | "name": "python", 131 | "nbconvert_exporter": "python", 132 | "pygments_lexer": "ipython3", 133 | "version": "3.8.9" 134 | }, 135 | "orig_nbformat": 4 136 | }, 137 | "nbformat": 4, 138 | "nbformat_minor": 2 139 | } 140 | -------------------------------------------------------------------------------- /Assignment29/color_detecting.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | 4 | 5 | video=cv2.VideoCapture(0) 6 | 7 | frame_width=int(video.get(3)) 8 | frame_height=int(video.get(4)) 9 | 10 | size=(frame_width,frame_height) 11 | result=cv2.VideoWriter('output.avi',cv2.VideoWriter_fourcc(*"MJPG"),30,size) 12 | filter=np.ones((15,15))/125 13 | 14 | while(True): 15 | ret,frame=video.read() 16 | 17 | if ret==False: 18 | break 19 | 20 | border=frame[150:250,250:350] 21 | frame=cv2.filter2D(frame,0,kernel=filter) 22 | 23 | ii=-1 24 | jj=-1 25 | 26 | for i in range(150,250): 27 | ii=ii+1 28 | for j in range(250,350): 29 | jj=jj+1 30 | frame[i,j]=border[ii-1,jj-1] 31 | jj=-1 32 | 33 | # high_contrast_border=cv2.normalize(border,border,0,255,cv2.NORM_MINMAX) 34 | # frame[150:250,250:350]=high_contrast_border 35 | 36 | 37 | # avg_border=int(np.average(border)) 38 | # cv2.putText(frame,str(avg_border),(200,200),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),3,cv2.LINE_AA) 39 | 40 | # if avg_border>=0 and avg_border<=15: 41 | # cv2.putText(frame,'Black',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 42 | # # 43 | # elif avg_border>=16 and avg_border<=30: 44 | # cv2.putText(frame,'Blue',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 45 | 46 | # elif avg_border>=17 and avg_border<=45: 47 | # cv2.putText(frame,'Red',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 48 | 49 | #elif avg_border>=46 or avg_border<=60: 50 | # cv2.putText(frame,'Red',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 51 | 52 | 53 | 54 | 55 | B,G,R=cv2.split(border) 56 | 57 | B_avg=int(np.average(B)) 58 | G_avg=int(np.average(G)) 59 | R_avg=int(np.average(R)) 60 | print(B_avg,G_avg,R_avg) 61 | 62 | 63 | if ((B_avg>=0 and B_avg<=70) and (G_avg>=0 and G_avg<=70) and (R_avg>=90 and R_avg<=255)): 64 | cv2.putText(frame,'Red',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 65 | 66 | elif ((B_avg>=100 and B_avg<=255) and (G_avg>=0 and G_avg<=100) and (R_avg>=0 and R_avg<=100)): 67 | cv2.putText(frame,'Blue',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 68 | 69 | elif ((B_avg>=0 and B_avg<=50) and (G_avg>=50 and G_avg<=255) and (R_avg>=0 and R_avg<=50)): 70 | cv2.putText(frame,'Green',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),5,cv2.LINE_AA) 71 | 72 | 73 | elif((B_avg>=50 and B_avg<=100) and (G_avg>=35 and G_avg<=45) and (R_avg>=50 and R_avg<=100)): 74 | cv2.putText(frame,'Purple',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,0),5,cv2.LINE_AA) 75 | 76 | elif((B_avg>=130 and B_avg<=255) and (G_avg>=130 and G_avg<=255) and (R_avg>=130 and R_avg<=255)): 77 | cv2.putText(frame,'White',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,0),5,cv2.LINE_AA) 78 | 79 | elif((B_avg>=0 and B_avg<=50) and (G_avg>=0 and G_avg<=30) and (R_avg>=0 and R_avg<=30)): 80 | cv2.putText(frame,'Black',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,0),5,cv2.LINE_AA) 81 | 82 | elif((B_avg>=65 and B_avg<=95) and (G_avg>=65 and G_avg<=95) and (R_avg>=65 and R_avg<=95)): 83 | cv2.putText(frame,'Gray',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,0),5,cv2.LINE_AA) 84 | 85 | elif((B_avg>=190 and B_avg<=255) and (G_avg>=190 and G_avg<=255) and (R_avg>=0 and R_avg<=150)): 86 | cv2.putText(frame,'Cyan',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,0),5,cv2.LINE_AA) 87 | 88 | elif((B_avg>=0 and B_avg<=70) and (G_avg>=75 and G_avg<=255) and (R_avg>=75 and R_avg<=255)): 89 | cv2.putText(frame,'Yellow',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,0),5,cv2.LINE_AA) 90 | 91 | 92 | cv2.imshow('frame',frame) 93 | if cv2.waitKey(1) & 0xFF == ord('q'): 94 | break 95 | 96 | 97 | video.release() 98 | cv2.destroyAllWindows() 99 | -------------------------------------------------------------------------------- /Assignment29/microsoft_logo.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 76, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import cv2\n", 10 | "import matplotlib.pyplot as plt\n", 11 | "import numpy as np" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 77, 17 | "metadata": {}, 18 | "outputs": [ 19 | { 20 | "data": { 21 | "text/plain": [ 22 | "" 23 | ] 24 | }, 25 | "execution_count": 77, 26 | "metadata": {}, 27 | "output_type": "execute_result" 28 | }, 29 | { 30 | "data": { 31 | "image/png": "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", 32 | "text/plain": [ 33 | "
" 34 | ] 35 | }, 36 | "metadata": { 37 | "needs_background": "light" 38 | }, 39 | "output_type": "display_data" 40 | } 41 | ], 42 | "source": [ 43 | "img_logo=np.ones((600,1400,3),dtype='uint8')*87\n", 44 | "plt.imshow(img_logo)" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 78, 50 | "metadata": {}, 51 | "outputs": [ 52 | { 53 | "data": { 54 | "text/plain": [ 55 | "" 56 | ] 57 | }, 58 | "execution_count": 78, 59 | "metadata": {}, 60 | "output_type": "execute_result" 61 | }, 62 | { 63 | "data": { 64 | "image/png": "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", 65 | "text/plain": [ 66 | "
" 67 | ] 68 | }, 69 | "metadata": { 70 | "needs_background": "light" 71 | }, 72 | "output_type": "display_data" 73 | } 74 | ], 75 | "source": [ 76 | "img_logo[200:300,200:300]=(242,80,34)\n", 77 | "img_logo[310:410,200:300]=(0,164,239)\n", 78 | "img_logo[200:300,310:410]=(127,186,0)\n", 79 | "img_logo[310:410,310:410]=(255,185,0)\n", 80 | "cv2.putText(img_logo,'Microsoft',(450,350),cv2.FONT_HERSHEY_SIMPLEX,5,(255,255,255),15)\n", 81 | "plt.imshow(img_logo)" 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 79, 87 | "metadata": {}, 88 | "outputs": [ 89 | { 90 | "data": { 91 | "text/plain": [ 92 | "True" 93 | ] 94 | }, 95 | "execution_count": 79, 96 | "metadata": {}, 97 | "output_type": "execute_result" 98 | } 99 | ], 100 | "source": [ 101 | "logo_result=cv2.cvtColor(img_logo,cv2.COLOR_BGR2RGB)\n", 102 | "cv2.imwrite('logo_result.jpg',logo_result)" 103 | ] 104 | } 105 | ], 106 | "metadata": { 107 | "interpreter": { 108 | "hash": "965ba1120b0c101b3f715b6e258a73742ec1cf86f2c8b04492724c87d9f112c3" 109 | }, 110 | "kernelspec": { 111 | "display_name": "Python 3.8.9 64-bit", 112 | "language": "python", 113 | "name": "python3" 114 | }, 115 | "language_info": { 116 | "codemirror_mode": { 117 | "name": "ipython", 118 | "version": 3 119 | }, 120 | "file_extension": ".py", 121 | "mimetype": "text/x-python", 122 | "name": "python", 123 | "nbconvert_exporter": "python", 124 | "pygments_lexer": "ipython3", 125 | "version": "3.8.9" 126 | }, 127 | "orig_nbformat": 4 128 | }, 129 | "nbformat": 4, 130 | "nbformat_minor": 2 131 | } 132 | -------------------------------------------------------------------------------- /Assignment29/result/Carrot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment29/result/Carrot.jpg -------------------------------------------------------------------------------- /Assignment29/result/carrot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment29/result/carrot.jpg -------------------------------------------------------------------------------- /Assignment29/result/logo_result.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment29/result/logo_result.jpg -------------------------------------------------------------------------------- /Assignment29/result/rubic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment29/result/rubic.jpg -------------------------------------------------------------------------------- /Assignment29/result/rubix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment29/result/rubix.png -------------------------------------------------------------------------------- /Assignment30/README.md: -------------------------------------------------------------------------------- 1 | # Blue screen technique 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 | 10 | # Skin detection (Image and video) 11 | 12 | 13 | -------------------------------------------------------------------------------- /Assignment30/result/image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment30/result/image.jpg -------------------------------------------------------------------------------- /Assignment30/result/img_result.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment30/result/img_result.jpg -------------------------------------------------------------------------------- /Assignment30/result/skin_dection.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment30/result/skin_dection.jpg -------------------------------------------------------------------------------- /Assignment30/result/space2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Parisa-Bagherzadeh/Image_processing/62bf425cfcddb1f0fa067fb61aebd80952e419e3/Assignment30/result/space2.jpg -------------------------------------------------------------------------------- /Assignment30/skin_detection.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | 4 | 5 | #HSV range of skin 6 | min_HSV=np.array([0,58,30],dtype='uint8') 7 | max_HSV=np.array([33,255,255],dtype='uint8') 8 | 9 | #skin detection in image 10 | image=cv2.imread('paris.jpg') 11 | imageHSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV) 12 | image_skinRegionHSV=cv2.inRange(imageHSV,min_HSV,max_HSV) 13 | image_skinHSV=cv2.bitwise_and(image,image,mask=image_skinRegionHSV) 14 | cv2.imwrite('skin_dection.jpg',np.hstack([image,image_skinHSV])) 15 | 16 | 17 | #skin detection in video 18 | video=cv2.VideoCapture(0) 19 | 20 | while(True): 21 | ret,BGR_frame=video.read() 22 | 23 | if ret==False: 24 | break 25 | 26 | HSV_frame=cv2.cvtColor(BGR_frame,cv2.COLOR_BGR2HSV) 27 | skinRegionHSV=cv2.inRange(HSV_frame,min_HSV,max_HSV) 28 | skinHSV=cv2.bitwise_and(BGR_frame,BGR_frame,mask=skinRegionHSV) 29 | cv2.imshow('frame',skinHSV) 30 | 31 | if cv2.waitKey(1) & 0xFF == ord('q'): 32 | break 33 | 34 | video.release() 35 | cv2.destroyAllWindows() -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | --------------------------------------------------------------------------------