[雪峰磁針石部落格]pythonopencv3例項(物件識別和擴增實境)1-影像幾何轉換

書籍尋找發表於2018-10-15

原書程式碼地址

在本章中,我們將學習如何應用酷的幾何效果到影像。 知識點

  • 如何安裝OpenCV-Python
  • 如何讀取,顯示和儲存影像
  • 如何轉換到多個顏色空間
  • 如何應用幾何變換,例如平移,旋轉,和縮放
  • 如何使用仿射和投影變換來應用幾何效果

本書英文版本:OpenCV 3.x with Python By Example 2nd 2018.pdf

更多opencv相關書籍:最佳人工智慧影像處理工具OpenCV書籍下載

安裝OpenCV-Python

  • 安裝

本教程基於python3,ubuntu 16,在windows環境可能可以執行。

Linux

#!python
pip3 install opencv-python

Windows

#!python
pip install opencv-python
  • 文件:

    [官網](http://docs.opencv.org/) [opencv-python官方文件](http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html)
    

讀取顯示和儲存圖片

01_reading_image.py 讀取顯示圖片

import cv2

img = cv2.imread(`./images/input.jpg`)
cv2.imshow(`Input image`, img)

cv2.waitKey()

02_saving_image.py 儲存為灰度圖

import cv2

gray_img = cv2.imread(`images/input.jpg`, cv2.IMREAD_GRAYSCALE)
cv2.imshow(`Grayscale`, gray_img)
cv2.imwrite(`images/output.jpg`, gray_img)

cv2.waitKey()

Alt Text

Alt Text

轉換格式

03_convert_image_format.py

In [1]: import cv2

In [2]: print([x for x in dir(cv2) if x.startswith(`COLOR_`)])
    [`COLOR_BAYER_BG2BGR`, `COLOR_BAYER_BG2BGRA`, `COLOR_BAYER_BG2BGR_EA`, `COLOR_BAYER_BG2BGR_VNG`, `COLOR_BAYER_BG2GRAY`, `COLOR_BAYER_BG2RGB`, `COLOR_BAYER_BG2RGBA`, `COLOR_BAYER_BG2RGB_EA`, `COLOR_BAYER_BG2RGB_VNG`, `COLOR_BAYER_GB2BGR`, `COLOR_BAYER_GB2BGRA`, `COLOR_BAYER_GB2BGR_EA`, `COLOR_BAYER_GB2BGR_VNG`, `COLOR_BAYER_GB2GRAY`, `COLOR_BAYER_GB2RGB`, `COLOR_BAYER_GB2RGBA`, `COLOR_BAYER_GB2RGB_EA`, `COLOR_BAYER_GB2RGB_VNG`, `COLOR_BAYER_GR2BGR`, `COLOR_BAYER_GR2BGRA`, `COLOR_BAYER_GR2BGR_EA`, `COLOR_BAYER_GR2BGR_VNG`, `COLOR_BAYER_GR2GRAY`, `COLOR_BAYER_GR2RGB`, `COLOR_BAYER_GR2RGBA`, `COLOR_BAYER_GR2RGB_EA`, `COLOR_BAYER_GR2RGB_VNG`, `COLOR_BAYER_RG2BGR`, `COLOR_BAYER_RG2BGRA`, `COLOR_BAYER_RG2BGR_EA`, `COLOR_BAYER_RG2BGR_VNG`, `COLOR_BAYER_RG2GRAY`, `COLOR_BAYER_RG2RGB`, `COLOR_BAYER_RG2RGBA`, `COLOR_BAYER_RG2RGB_EA`, `COLOR_BAYER_RG2RGB_VNG`, `COLOR_BGR2BGR555`, `COLOR_BGR2BGR565`, `COLOR_BGR2BGRA`, `COLOR_BGR2GRAY`, `COLOR_BGR2HLS`, `COLOR_BGR2HLS_FULL`, `COLOR_BGR2HSV`, `COLOR_BGR2HSV_FULL`, `COLOR_BGR2LAB`, `COLOR_BGR2LUV`, `COLOR_BGR2Lab`, `COLOR_BGR2Luv`, `COLOR_BGR2RGB`, `COLOR_BGR2RGBA`, `COLOR_BGR2XYZ`, `COLOR_BGR2YCR_CB`, `COLOR_BGR2YCrCb`, `COLOR_BGR2YUV`, `COLOR_BGR2YUV_I420`, `COLOR_BGR2YUV_IYUV`, `COLOR_BGR2YUV_YV12`, `COLOR_BGR5552BGR`, `COLOR_BGR5552BGRA`, `COLOR_BGR5552GRAY`, `COLOR_BGR5552RGB`, `COLOR_BGR5552RGBA`, `COLOR_BGR5652BGR`, `COLOR_BGR5652BGRA`, `COLOR_BGR5652GRAY`, `COLOR_BGR5652RGB`, `COLOR_BGR5652RGBA`, `COLOR_BGRA2BGR`, `COLOR_BGRA2BGR555`, `COLOR_BGRA2BGR565`, `COLOR_BGRA2GRAY`, `COLOR_BGRA2RGB`, `COLOR_BGRA2RGBA`, `COLOR_BGRA2YUV_I420`, `COLOR_BGRA2YUV_IYUV`, `COLOR_BGRA2YUV_YV12`, `COLOR_BayerBG2BGR`, `COLOR_BayerBG2BGRA`, `COLOR_BayerBG2BGR_EA`, `COLOR_BayerBG2BGR_VNG`, `COLOR_BayerBG2GRAY`, `COLOR_BayerBG2RGB`, `COLOR_BayerBG2RGBA`, `COLOR_BayerBG2RGB_EA`, `COLOR_BayerBG2RGB_VNG`, `COLOR_BayerGB2BGR`, `COLOR_BayerGB2BGRA`, `COLOR_BayerGB2BGR_EA`, `COLOR_BayerGB2BGR_VNG`, `COLOR_BayerGB2GRAY`, `COLOR_BayerGB2RGB`, `COLOR_BayerGB2RGBA`, `COLOR_BayerGB2RGB_EA`, `COLOR_BayerGB2RGB_VNG`, `COLOR_BayerGR2BGR`, `COLOR_BayerGR2BGRA`, `COLOR_BayerGR2BGR_EA`, `COLOR_BayerGR2BGR_VNG`, `COLOR_BayerGR2GRAY`, `COLOR_BayerGR2RGB`, `COLOR_BayerGR2RGBA`, `COLOR_BayerGR2RGB_EA`, `COLOR_BayerGR2RGB_VNG`, `COLOR_BayerRG2BGR`, `COLOR_BayerRG2BGRA`, `COLOR_BayerRG2BGR_EA`, `COLOR_BayerRG2BGR_VNG`, `COLOR_BayerRG2GRAY`, `COLOR_BayerRG2RGB`, `COLOR_BayerRG2RGBA`, `COLOR_BayerRG2RGB_EA`, `COLOR_BayerRG2RGB_VNG`, `COLOR_COLORCVT_MAX`, `COLOR_GRAY2BGR`, `COLOR_GRAY2BGR555`, `COLOR_GRAY2BGR565`, `COLOR_GRAY2BGRA`, `COLOR_GRAY2RGB`, `COLOR_GRAY2RGBA`, `COLOR_HLS2BGR`, `COLOR_HLS2BGR_FULL`, `COLOR_HLS2RGB`, `COLOR_HLS2RGB_FULL`, `COLOR_HSV2BGR`, `COLOR_HSV2BGR_FULL`, `COLOR_HSV2RGB`, `COLOR_HSV2RGB_FULL`, `COLOR_LAB2BGR`, `COLOR_LAB2LBGR`, `COLOR_LAB2LRGB`, `COLOR_LAB2RGB`, `COLOR_LBGR2LAB`, `COLOR_LBGR2LUV`, `COLOR_LBGR2Lab`, `COLOR_LBGR2Luv`, `COLOR_LRGB2LAB`, `COLOR_LRGB2LUV`, `COLOR_LRGB2Lab`, `COLOR_LRGB2Luv`, `COLOR_LUV2BGR`, `COLOR_LUV2LBGR`, `COLOR_LUV2LRGB`, `COLOR_LUV2RGB`, `COLOR_Lab2BGR`, `COLOR_Lab2LBGR`, `COLOR_Lab2LRGB`, `COLOR_Lab2RGB`, `COLOR_Luv2BGR`, `COLOR_Luv2LBGR`, `COLOR_Luv2LRGB`, `COLOR_Luv2RGB`, `COLOR_M_RGBA2RGBA`, `COLOR_RGB2BGR`, `COLOR_RGB2BGR555`, `COLOR_RGB2BGR565`, `COLOR_RGB2BGRA`, `COLOR_RGB2GRAY`, `COLOR_RGB2HLS`, `COLOR_RGB2HLS_FULL`, `COLOR_RGB2HSV`, `COLOR_RGB2HSV_FULL`, `COLOR_RGB2LAB`, `COLOR_RGB2LUV`, `COLOR_RGB2Lab`, `COLOR_RGB2Luv`, `COLOR_RGB2RGBA`, `COLOR_RGB2XYZ`, `COLOR_RGB2YCR_CB`, `COLOR_RGB2YCrCb`, `COLOR_RGB2YUV`, `COLOR_RGB2YUV_I420`, `COLOR_RGB2YUV_IYUV`, `COLOR_RGB2YUV_YV12`, `COLOR_RGBA2BGR`, `COLOR_RGBA2BGR555`, `COLOR_RGBA2BGR565`, `COLOR_RGBA2BGRA`, `COLOR_RGBA2GRAY`, `COLOR_RGBA2M_RGBA`, `COLOR_RGBA2RGB`, `COLOR_RGBA2YUV_I420`, `COLOR_RGBA2YUV_IYUV`, `COLOR_RGBA2YUV_YV12`, `COLOR_RGBA2mRGBA`, `COLOR_XYZ2BGR`, `COLOR_XYZ2RGB`, `COLOR_YCR_CB2BGR`, `COLOR_YCR_CB2RGB`, `COLOR_YCrCb2BGR`, `COLOR_YCrCb2RGB`, `COLOR_YUV2BGR`, `COLOR_YUV2BGRA_I420`, `COLOR_YUV2BGRA_IYUV`, `COLOR_YUV2BGRA_NV12`, `COLOR_YUV2BGRA_NV21`, `COLOR_YUV2BGRA_UYNV`, `COLOR_YUV2BGRA_UYVY`, `COLOR_YUV2BGRA_Y422`, `COLOR_YUV2BGRA_YUNV`, `COLOR_YUV2BGRA_YUY2`, `COLOR_YUV2BGRA_YUYV`, `COLOR_YUV2BGRA_YV12`, `COLOR_YUV2BGRA_YVYU`, `COLOR_YUV2BGR_I420`, `COLOR_YUV2BGR_IYUV`, `COLOR_YUV2BGR_NV12`, `COLOR_YUV2BGR_NV21`, `COLOR_YUV2BGR_UYNV`, `COLOR_YUV2BGR_UYVY`, `COLOR_YUV2BGR_Y422`, `COLOR_YUV2BGR_YUNV`, `COLOR_YUV2BGR_YUY2`, `COLOR_YUV2BGR_YUYV`, `COLOR_YUV2BGR_YV12`, `COLOR_YUV2BGR_YVYU`, `COLOR_YUV2GRAY_420`, `COLOR_YUV2GRAY_I420`, `COLOR_YUV2GRAY_IYUV`, `COLOR_YUV2GRAY_NV12`, `COLOR_YUV2GRAY_NV21`, `COLOR_YUV2GRAY_UYNV`, `COLOR_YUV2GRAY_UYVY`, `COLOR_YUV2GRAY_Y422`, `COLOR_YUV2GRAY_YUNV`, `COLOR_YUV2GRAY_YUY2`, `COLOR_YUV2GRAY_YUYV`, `COLOR_YUV2GRAY_YV12`, `COLOR_YUV2GRAY_YVYU`, `COLOR_YUV2RGB`, `COLOR_YUV2RGBA_I420`, `COLOR_YUV2RGBA_IYUV`, `COLOR_YUV2RGBA_NV12`, `COLOR_YUV2RGBA_NV21`, `COLOR_YUV2RGBA_UYNV`, `COLOR_YUV2RGBA_UYVY`, `COLOR_YUV2RGBA_Y422`, `COLOR_YUV2RGBA_YUNV`, `COLOR_YUV2RGBA_YUY2`, `COLOR_YUV2RGBA_YUYV`, `COLOR_YUV2RGBA_YV12`, `COLOR_YUV2RGBA_YVYU`, `COLOR_YUV2RGB_I420`, `COLOR_YUV2RGB_IYUV`, `COLOR_YUV2RGB_NV12`, `COLOR_YUV2RGB_NV21`, `COLOR_YUV2RGB_UYNV`, `COLOR_YUV2RGB_UYVY`, `COLOR_YUV2RGB_Y422`, `COLOR_YUV2RGB_YUNV`, `COLOR_YUV2RGB_YUY2`, `COLOR_YUV2RGB_YUYV`, `COLOR_YUV2RGB_YV12`, `COLOR_YUV2RGB_YVYU`, `COLOR_YUV420P2BGR`, `COLOR_YUV420P2BGRA`, `COLOR_YUV420P2GRAY`, `COLOR_YUV420P2RGB`, `COLOR_YUV420P2RGBA`, `COLOR_YUV420SP2BGR`, `COLOR_YUV420SP2BGRA`, `COLOR_YUV420SP2GRAY`, `COLOR_YUV420SP2RGB`, `COLOR_YUV420SP2RGBA`, `COLOR_YUV420p2BGR`, `COLOR_YUV420p2BGRA`, `COLOR_YUV420p2GRAY`, `COLOR_YUV420p2RGB`, `COLOR_YUV420p2RGBA`, `COLOR_YUV420sp2BGR`, `COLOR_YUV420sp2BGRA`, `COLOR_YUV420sp2GRAY`, `COLOR_YUV420sp2RGB`, `COLOR_YUV420sp2RGBA`, `COLOR_mRGBA2RGBA`]

04_image_color_split.py

import cv2

img = cv2.imread(`./images/input.jpg`, cv2.IMREAD_COLOR)
gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

yuv_img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
y,u,v = cv2.split(yuv_img)

cv2.imshow(`Grayscale image`, gray_img)
cv2.imshow(`Y channel`, y)
cv2.imshow(`U channel`, u)
cv2.imshow(`V channel`, v)

cv2.waitKey()

合併影像色帶

05_image_color_merge.py

import cv2

img = cv2.imread(`./images/input.jpg`, cv2.IMREAD_COLOR)

g,b,r = cv2.split(img)
gbr_img = cv2.merge((g,b,r))
rbr_img = cv2.merge((r,b,r))

cv2.imshow(`Original`, img)
cv2.imshow(`GRB`, gbr_img)
cv2.imshow(`RBR`, rbr_img)

cv2.waitKey()

移動translation

06_image_translation.py

import cv2
import numpy as np

img = cv2.imread(`images/input.jpg`)
num_rows, num_cols = img.shape[:2]

translation_matrix = np.float32([ [1,0,70], [0,1,110] ])
img_translation = cv2.warpAffine(img, translation_matrix, (num_cols + 70, num_rows + 110))
translation_matrix = np.float32([ [1,0,-30], [0,1,-50] ])
img_translation = cv2.warpAffine(img_translation, translation_matrix, (num_cols + 70 + 30, num_rows + 110 + 50))

cv2.imshow(`Translation`, img_translation)
cv2.waitKey()

Alt Text

旋轉

07_image_rotation.py

import cv2
import numpy as np

img = cv2.imread(`images/input.jpg`)
num_rows, num_cols = img.shape[:2]

translation_matrix = np.float32([ [1,0,70], [0,1,110] ])
img_translation = cv2.warpAffine(img, translation_matrix, (num_cols + 70, num_rows + 110))
translation_matrix = np.float32([ [1,0,-30], [0,1,-50] ])
img_translation = cv2.warpAffine(img_translation, translation_matrix, (num_cols + 70 + 30, num_rows + 110 + 50))

cv2.imshow(`Translation`, img_translation)
cv2.waitKey()

Alt Text

縮放

08_image_scaling.py

import cv2

img = cv2.imread(`images/input.jpg`)

img_scaled = cv2.resize(img,None,fx=1.2, fy=1.2, interpolation = cv2.INTER_LINEAR)
cv2.imshow(`Scaling - Linear Interpolation`, img_scaled)

img_scaled = cv2.resize(img,None,fx=1.2, fy=1.2, interpolation = cv2.INTER_CUBIC)
cv2.imshow(`Scaling - Cubic Interpolation`, img_scaled)

img_scaled = cv2.resize(img,(450, 400), interpolation = cv2.INTER_AREA)
cv2.imshow(`Scaling - Skewed Size`, img_scaled)

cv2.waitKey()

仿射變換

09_affine_transformation.py

import cv2
import numpy as np

img = cv2.imread(`images/input.jpg`)
rows, cols = img.shape[:2]

src_points = np.float32([[0,0], [cols-1,0], [0,rows-1]])
dst_points = np.float32([[0,0], [int(0.6*(cols-1)),0], [int(0.4*(cols-1)),rows-1]])

affine_matrix = cv2.getAffineTransform(src_points, dst_points)
img_output = cv2.warpAffine(img, affine_matrix, (cols,rows))

cv2.imshow(`Input`, img)
cv2.imshow(`Output`, img_output)
cv2.waitKey()

Alt Text

射影變換

10_projective_transformation.py

import cv2
import numpy as np

img = cv2.imread(`images/input.jpg`)
rows, cols = img.shape[:2]

src_points = np.float32([[0,0], [cols-1,0], [0,rows-1], [cols-1,rows-1]])
dst_points = np.float32([[0,0], [cols-1,0], [int(0.33*cols),rows-1], [int(0.66*cols),rows-1]])

projective_matrix = cv2.getPerspectiveTransform(src_points, dst_points)
img_output = cv2.warpPerspective(img, projective_matrix, (cols,rows))

cv2.imshow(`Input`, img)
cv2.imshow(`Output`, img_output)

cv2.waitKey()

Alt Text

影像變形

11_image_warping.py

import numpy as np 
import math

img = cv2.imread(`images/input.jpg`, cv2.IMREAD_GRAYSCALE) 
rows, cols = img.shape

##################### 
# Vertical wave

img_output = np.zeros(img.shape, dtype=img.dtype)

for i in range(rows): 
    for j in range(cols): 
        offset_x = int(25.0 * math.sin(2 * 3.14 * i / 180)) 
        offset_y = 0 
        if j+offset_x < rows: 
            img_output[i,j] = img[i,(j+offset_x)%cols] 
        else: 
            img_output[i,j] = 0

cv2.imshow(`Input`, img) 
cv2.imshow(`Vertical wave`, img_output)

##################### 
# Horizontal wave

img_output = np.zeros(img.shape, dtype=img.dtype)

for i in range(rows): 
    for j in range(cols): 
        offset_x = 0 
        offset_y = int(16.0 * math.sin(2 * 3.14 * j / 150)) 
        if i+offset_y < rows: 
            img_output[i,j] = img[(i+offset_y)%rows,j] 
        else: 
            img_output[i,j] = 0

cv2.imshow(`Horizontal wave`, img_output)

##################### 
# Both horizontal and vertical

img_output = np.zeros(img.shape, dtype=img.dtype)

for i in range(rows): 
    for j in range(cols): 
        offset_x = int(20.0 * math.sin(2 * 3.14 * i / 150)) 
        offset_y = int(20.0 * math.cos(2 * 3.14 * j / 150)) 
        if i+offset_y < rows and j+offset_x < cols: 
            img_output[i,j] = img[(i+offset_y)%rows,(j+offset_x)%cols] 
        else: 
            img_output[i,j] = 0

cv2.imshow(`Multidirectional wave`, img_output)

##################### 
# Concave effect

img_output = np.zeros(img.shape, dtype=img.dtype)

for i in range(rows): 
    for j in range(cols): 
        offset_x = int(128.0 * math.sin(2 * 3.14 * i / (2*cols))) 
        offset_y = 0 
        if j+offset_x < cols: 
            img_output[i,j] = img[i,(j+offset_x)%cols] 
        else: 
            img_output[i,j] = 0

cv2.imshow(`Concave`, img_output)

cv2.waitKey()

Alt Text

參考資料


相關文章