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