--- title: OpenCV-Python hw1筆記(code) tags: OpenCV,Python --- **使用 python, OpenCV 建立** **目錄** [TOC] ## 1. import cv2 ## 2. 讀取影像、調整大小 * 讀取影像 ```python= image = cv2.imread('影像名稱.jpg/jpeg/png/tiff...') ``` * 讀取大小 ```python= image_size = image.shape image_size = cv2.GetSize(image) ``` * 調整大小 ```python= reimage = cv2.resize(image, (64,64), interpolation=cv2.INTER_CUBIC) # cv2.resize(原影像, 調整後的(W, H), 模式) ``` >interpolation模式: >1. cv2.INTER_NEAREST: 採用鄰近插植 >2. cv2.INTER_LINEAR: 雙線性插植(如果未設定,通常系統會默認為此模式) >3. cv2.INTER_AREA: 使用像素區域關係進行重採樣 >4. cv2.INTER_CUBIC: 4*4像素鄰域的雙/三次插值 >5. cv2.INTER_LANCZOS4: 8*8像素鄰域的[Lanczos](https://en.wikipedia.org/wiki/Lanczos_algorithm) 插值 ## 3. 顯示影像 ```python= # 創建一個新的窗口用於顯示圖像 cv2.nameWindow('名稱') # 在窗口中顯示圖像 cv2.imshow('名稱', image) cv2.waitKey(0) ``` ## 4. 保存影像 ```python= v2.imwrite('路徑', image, 格式) ``` ## 5. 複製影像 ```python= img = image.copy() ``` ## 6. 影像RGB分開顯示 ```python= (B, G, R) = cv2.split(image) zeros = np.zeros(image.shape[:2], dtype="uint8") cv2.namedWindow('B') cv2.imshow('B', cv2.merge([B, zeros, zeros])) cv2.namedWindow('G') cv2.imshow('G', cv2.merge([zeros, G, zeros])) cv2.namedWindow('R') cv2.imshow('R', cv2.merge([zeros, zeros, R])) cv2.waitKey(0) ``` ## 7. 上下左右翻轉影像 ```python= # 橫向翻轉 horizontal = cv2.flip(image, 1) # 縱向翻轉 vertical = cv2.flip(image, 0) # 橫向縱向翻轉 hv_both = cv2.flip(image, -1) ``` ## 8. 兩個影像重疊 + Trackbar ```python= org_img = cv2.imread('./Dataset_opencvdl/Q1_Image/Uncle_Roger.jpg') flip_img = cv2.flip(org_img, 1) def on_trackbar(val): alpha = val / 255 beta = (1.0 - alpha) dst = cv2.addWeighted(org_img, alpha, flip_img, beta, 0.0) cv2.imshow('BLENDING', dst) cv2.namedWindow('BLENDING') cv2.createTrackbar('BLEND', 'BLENDING', 0, 255, on_trackbar) cv2.waitKey(0) cv2.destroyAllWindows() ``` > OpenCV官網[Two Images](https://docs.opencv.org/3.4/d5/dc4/tutorial_adding_images.html)。 > OpenCV官網[Trackbar](https://docs.opencv.org/3.4/da/d6a/tutorial_trackbar.html)。 ## 9. Smoothing 影像 * Gaussian ```python= # (3, 3)為filter guassian = cv2.GaussianBlur(image, (3, 3), 0) ``` * Median ```python= # 7為K值 median = cv2.medianBlur(image, 7) ``` * Bilateral ```python= bilateral = cv2.bilateralFilter(image, 9, 90, 90) ``` > 可參考此[網址](https://chtseng.wordpress.com/2016/11/17/python-%E8%88%87-opencv-%E6%A8%A1%E7%B3%8A%E8%99%95%E7%90%86/)。 > OpenCV官網[Smoothing Image](https://docs.opencv.org/3.4/dc/dd3/tutorial_gausian_median_blur_bilateral_filter.html)。 ## 10. 邊界偵測 * 先做 Gaussian轉換 ```python= image = cv2.imread('./Dataset_opencvdl/Q3_Image/Chihiro.jpg') gray_img = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) # 3*3 Gaussian Filter x, y = np.mgrid[-1:2, -1:2] gaussian_kernel = np.exp(-(x ** 2 + y ** 2)) # Normalization gaussian_kernel = gaussian_kernel / gaussian_kernel.sum() grad = signal.convolve2d(gray_img, gaussian_kernel, boundary='symm', mode='same') # convolution plt.imshow(grad, cmap=plt.get_cmap('gray')) plt.axis('off') plt.show() ``` > 參考[網址](https://medium.com/@bob800530/python-gaussian-filter-%E6%A6%82%E5%BF%B5%E8%88%87%E5%AF%A6%E4%BD%9C-676aac52ea17)。 * Sobel X ```python= image = cv2.imread('./Dataset_opencvdl/Q3_Image/Chihiro.jpg') gray_img = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) gray_img = np.array(gray_img) img_X = np.zeros(gray_img.shape) # Filter filters.sobel(gray_img, 1, img_X) # Normalization img_X *= (img_X - np.min(img_X)) / (np.max(img_X) - np.min(img_X)) plt.imshow(img_X, cmap='gray') plt.axis('off') plt.show() ``` * Sobwl Y ```python= image = cv2.imread('./Dataset_opencvdl/Q3_Image/Chihiro.jpg') gray_img = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) gray_img = np.array(gray_img) img_Y = np.zeros(gray_img.shape) # Filter filters.sobel(gray_img, 0, img_Y) # Normalization img_Y *= (img_Y - np.min(img_Y)) / (np.max(img_Y) - np.min(img_Y)) plt.imshow(img_Y, cmap='gray') plt.axis('off') plt.show() ``` * Magnitude ```python= image = cv2.imread('./Dataset_opencvdl/Q3_Image/Chihiro.jpg') gray_img = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) gray_img = np.array(gray_img) img_X = np.zeros(gray_img.shape) filters.sobel(gray_img, 1, img_X) img_Y = np.zeros(gray_img.shape) filters.sobel(gray_img, 0, img_Y) # Filter mag = np.hypot(img_X, img_Y) # Normalization mag *= 255.0 / np.max(mag) plt.imshow(mag, cmap='gray') plt.axis('off') plt.show() ``` ## 11. 影像 Transform - rotation, scaling, Trans_x, Trans_y ```python= image = cv2.imread('./Dataset_opencvdl/Q4_Image/Parrot.png') # image.shape=(600, 900, 3) center = ((image.shape[1] // 2 + float(Tx)), (image.shape[0] // 2 - float(Ty))) rot_mat = cv2.getRotationMatrix2D(center, float(rotation), float(scaling)) rot_dst = cv2.warpAffine(image, rot_mat, (image.shape[1], image.shape[0])) cv2.namedWindow('Image RST') cv2.imshow('Image RST', rot_dst) ``` > 參考[網址](https://docs.opencv.org/3.4/d4/d61/tutorial_warp_affine.html)。