当前位置 博文首页 > 无水wangyang:【OpenCV】图片裁切 移位 翻转 缩放 仿射变换

    无水wangyang:【OpenCV】图片裁切 移位 翻转 缩放 仿射变换

    作者:[db:作者] 时间:2021-09-06 13:30

    ?从慕课网《opencv 》相关课程总结而来

    #图片裁切
    import cv2
    img = cv2.imread('G:/1.jpg',1)
    imgInfo = img.shape
    dst = img[100:200,100:300]
    cv2.imshow('image',dst)
    cv2.waitKey(0)
    #图片移位
    #1  API的使用
    #2  算法原理
    #3  源代码
    import cv2
    import numpy as np
    img = cv2.imread('G:/1.jpg',1)
    cv2.imshow('src',img)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    ####
    matShift = np.float32([[1,0,100],[0,1,200]])#2x3
    dst = cv2.warpAffine(img,matShift,(height,width))
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    
    
    #API的原理
    #[1,0,100],[0,1,200] 2x2 2x1
    #[[1,0],[0,1]]  2x2  A
    #[[100],[200]] 2x1   B
    #xy c
    #AxC+B = [[1*x +0*y],[0*x+1*y]]+[[100],[200]]
    # =  [[x+100],[y+200]]
    
    #(10,20) -> (110,220)
    
    
    #通过源码实现位移
    import cv2
    import numpy as np
    img = cv2.imread('G:/1.jpg',1)
    cv2.imshow('src',img)
    imgInfo = img.shape
    #定义一个空矩阵 与原始图片等大
    dst = np.zeros(img.shape,np.uint8)
    height = imgInfo[0]
    width = imgInfo[1]
    for i in range(0,height):
        for j in range(0,width-100):
            dst[i,j+100] = img[i,j]
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
            
    #图片翻转
    #1 创建一个“画板”,需要足够大
    # 2  将一副图像分别从前向后,从后向前绘制
    #3 绘制中心分割线
    import cv2
    import numpy as np
    img = cv2.imread('G:/02.jpg',1)
    cv2.imshow('src',img)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    deep = imgInfo[2]
    newImgInfo = (height*2,width,deep)
    dst = np.zeros(newImgInfo,np.uint8)
    for i in range(0,height):
        for j in range(0,width):
            dst[i,j] = img[i,j]
            # x  y = 2*h - y -1
            dst[height*2 - i-1,j] = img[i,j]
    for i in range(0,width):
        dst[height,i] = (0,0,225)
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    #图片缩放
    #[[A1 A2 B],[A3 A4 B2]]
    #[[A1 A2],[A3 A4]]  [[B1]  ,[B2]]
    #newX = A1*x+A2*y+B1
    #newY = A3*x +A4*y +B2
    #x->x*0.5  y->y*0.5
    #newX = 0.5*x
    import cv2
    import numpy as np
    img = cv2.imread('G:/02.jpg',1)
    cv2.imshow('src',img)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    matScale = np.float32([[0.5,0,0],[0,0.5,0]])
    dst = cv2.warpAffine(img,matScale,(int(width*0.5),int(height*0.5)))
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    #图片的仿射变换
    # 位移 旋转  缩放
    import cv2
    import numpy as np
    img = cv2.imread('G:/02.jpg',1)
    cv2.imshow('src',img)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    #仿射变换的原理就是将原图像的左上角,左下角,右上角映射到新的三个点上
    matSrc = np.float32([[0,0],[0,height-1],[width-1,0]])
    matDst = np.float32([[150,50],[150,height-100],[width-100,100]])
    #组合
    matAffine = cv2.getAffineTransform(matSrc,matDst)
    dst = cv2.warpAffine(img,matAffine,(width,height))
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    #图片旋转
    import cv2
    import numpy as np
    img = cv2.imread('G:/02.jpg',1)
    cv2.imshow('src',img)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    #定义一个mat的旋转矩阵
    #2 * 3
    matRotate = cv2.getRotationMatrix2D((height*0.5,width*0.5),45,0.5) # 旋转中心  旋转角度 缩放大小,缩放系数
    dst = cv2.warpAffine(img,matRotate,(height,width))
    cv2.imshow('dst',dst)
    cv2.waitKey(0)

    ?

    cs
    下一篇:没有了