<button id="ssm6u"><optgroup id="ssm6u"></optgroup></button>
  • 跳轉至

    圖像翻轉

    概要

    本節講解了用OpenCV的flip函數, numpy的索引,以及wrapAffine 三種方式實現圖像翻轉.

    keywords : flip 圖像翻轉 水平翻轉 鏡像 垂直翻轉

    使用flip函數實現翻轉

    flip 函數原型

    flip(src, flipCode[, dst]) -> dst
    

    參數解析

    • src 輸入圖片

    • flipCode 翻轉代碼

    • 1 水平翻轉 Horizontally (圖片第二維度是column)

    • 0 垂直翻轉 *Vertically * (圖片第一維是row)

    • -1 同時水平翻轉與垂直反轉 Horizontally & Vertically

    為了方便使用, 你也可以封裝成下面的函數

    def flip(image, direction):
        if direction == "h":
            flipped = cv2.flip(image, 1)
        elif direction == "v":
            flipped = cv2.flip(image, 0)
        else:
            # both horizontally and vertically
            flipped = cv2.flip(image, -1)
    

    201802191033

    src/flip_demo.py

    '''
    反轉Demo
    '''
    import numpy as np
    import cv2
    from matplotlib import pyplot as plt
    
    img = cv2.imread('cat.png')
    
    def bgr2rbg(img):
        '''
            將顏色空間從BGR轉換為RBG
        '''
        return img[:,:,::-1]
    
    # 水平翻轉
    flip_h = cv2.flip(img, 1)
    # 垂直翻轉
    flip_v = cv2.flip(img, 0)
    # 同時水平翻轉與垂直翻轉
    flip_hv = cv2.flip(img, -1)
    
    plt.subplot(221)
    plt.title('SRC')
    plt.imshow(bgr2rbg(img))
    
    plt.subplot(222)
    plt.title('Horizontally')
    plt.imshow(bgr2rbg(flip_h))
    
    plt.subplot(223)
    plt.title('Vertically')
    plt.imshow(bgr2rbg(flip_v))
    
    plt.subplot(224)
    plt.title('Horizontally & Vertically')
    plt.imshow(bgr2rbg(flip_hv))
    
    plt.show()
    

    利用numpy的索引實現翻轉

    利用numpy中ndarray的索引, 我們可以非常方便地實現圖像翻轉。

    # 水平翻轉
    flip_h =  img[:,::-1]
    # 垂直翻轉
    flip_v =  img[::-1]
    # 水平垂直同時翻轉
    flip_hv =  img[::-1, ::-1]
    

    201802191033

    '''
    使用numpy的索引進行圖像反轉
    '''
    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread('cat.png')
    height,width,channel = img.shape
    
    # 水平翻轉
    flip_h =  img[:,::-1]
    
    # 垂直翻轉
    flip_v =  img[::-1]
    
    # 水平垂直同時翻轉
    flip_hv =  img[::-1, ::-1]
    
    def bgr2rbg(img):
        '''
            將顏色空間從BGR轉換為RBG
        '''
        return img[:,:,::-1]
    
    plt.subplot(221)
    plt.title('SRC')
    plt.imshow(bgr2rbg(img))
    
    plt.subplot(222)
    plt.title('Horizontally')
    plt.imshow(bgr2rbg(flip_h))
    
    plt.subplot(223)
    plt.title('Vertically')
    plt.imshow(bgr2rbg(flip_v))
    
    plt.subplot(224)
    plt.title('Horizontally & Vertically')
    plt.imshow(bgr2rbg(flip_hv))
    
    plt.show()
    

    !!學霸分割線!!
    如果你對圖像翻轉的數學原理不感興趣的話,就不需要往下看了.


    利用wrapAffine實現翻轉

    注: width 代表圖像的寬度 height代表圖像的高度

    水平翻轉的變換矩陣

    \begin{equation} { \left[ \begin{array}{c} x'\\ y'\\ \end{array} \right ]}= { \left[ \begin{array}{cc} -1 & 0\\ 0 & 1\\ \end{array} \right ]}\times { \left[\begin{array}{c} x\\ y\\ \end{array} \right] }+ { \left[\begin{array}{c} width\\ 0 \\ \end{array} \right] } \end{equation}
    M = { \left[ \begin{array}{ccdc} -1 & 0 & width\\ 0 & 1 & 0\\ \end{array} \right ]}

    垂直翻轉的變換矩陣

    \begin{equation} { \left[ \begin{array}{c} x'\\ y'\\ \end{array} \right ]}= { \left[ \begin{array}{cc} 1 & 0\\ 0 & -1\\ \end{array} \right ]}\times { \left[\begin{array}{c} x\\ y\\ \end{array} \right] }+ { \left[\begin{array}{c} 0\\ height \\ \end{array} \right] } \end{equation}
    M = { \left[ \begin{array}{ccc} 1 & 0 & 0\\ 0 & -1 & height\\ \end{array} \right ]}

    同時進行水平翻轉與垂直翻轉

    \begin{equation} { \left[ \begin{array}{c} x'\\ y'\\ \end{array} \right ]}= { \left[ \begin{array}{cc} -1 & 0\\ 0 & -1\\ \end{array} \right ]}\times { \left[\begin{array}{c} x\\ y\\ \end{array} \right] }+ { \left[\begin{array}{c} width\\ height \\ \end{array} \right] } \end{equation}
    M = { \left[ \begin{array}{ccc} -1 & 0 & width\\ 0 & -1 & height\\ \end{array} \right ]}

    201802191033

    src/flip_by_warpaffine.py

    '''
    使用仿射矩陣實現反轉
    '''
    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread('cat.png')
    height,width,channel = img.shape
    
    # 水平翻轉
    M1 = np.float32([[-1, 0, width], [0, 1, 0]])
    flip_h =  cv2.warpAffine(img, M1, (width, height))
    
    # 垂直翻轉
    M2 = np.float32([[1, 0, 0], [0, -1, height]])
    flip_v =  cv2.warpAffine(img, M2, (width, height))
    
    # 水平垂直同時翻轉
    M3 = np.float32([[-1, 0, width], [0, -1, height]])
    flip_hv =  cv2.warpAffine(img, M3, (width, height))
    
    def bgr2rbg(img):
        '''
            將顏色空間從BGR轉換為RBG
        '''
        return img[:,:,::-1]
    
    plt.subplot(221)
    plt.title('SRC')
    plt.imshow(bgr2rbg(img))
    
    plt.subplot(222)
    plt.title('Horizontally')
    plt.imshow(bgr2rbg(flip_h))
    
    plt.subplot(223)
    plt.title('Vertically')
    plt.imshow(bgr2rbg(flip_v))
    
    plt.subplot(224)
    plt.title('Horizontally & Vertically')
    plt.imshow(bgr2rbg(flip_hv))
    
    plt.show()
    


    韩国精品无码一区二区三区,精品无码一区二区三区AV,欧洲丰满美熟女乱又伦AV,亚洲午夜久久久影院伊人