• 图像处理之几何变换


    图像处理之几何变换

    (1)图片缩放

    1.图片缩放1

    # 缩放其实顾名思义就是改变图片的宽度和高度,可以放大和缩小等等
    # 1.加载图片load   2.获取图片的信息info  3.调用resize方法,改变图片的宽度和高度  4.检查最终的结果check
    import tensorflow as tf
    import cv2
    # 以彩色图片的形式加载图片,读取图片。
    img = cv2.imread('image0.JPG',1)
    
    # 获取图片的info信息,这是一个三维的矩阵
    imgInfo = img.shape
    print(imgInfo)  # (547, 730, 3) 输出图片的信息info  547是表示高度  730是表示宽度  3是表示颜色组成方式
    height = imgInfo[0] # 获取图片的高
    width = imgInfo[1] # 获取图片的宽
    mode = imgInfo[2] # 获取图片的颜色组成方式
    
    print(height)
    print(width)
    print(mode)
    
    # 1.放大 缩小  2 等比例  非等比例 
    # 对于同一个原始图片来说,如果原始图片的宽高乘以了同一个系数,那么这个是等比例的缩放。
    # 如果不是乘以同一个系数,那么这个不是等比例缩放。
    dstHeight = int(height*0.5)
    dstWidth = int(width*0.5)
    
    print(dstHeight)
    print(dstWidth)
    # 最近临域插值  双线性插值  像素关系重采样  立方插值
    dst = cv2.resize(img,(dstHeight,dstWidth))
    cv2.imshow('image',dst)
    cv2.waitKey(0)
    # 输出的结果为:
    # (547, 730, 3)
    
    # 547
    # 730
    # 3
    
    # 273
    # 365
    

    实现的结果为:

    2.图片缩放2

    1)最近临域插值

    理解最近临域插值  双线性插值的原理
    
    1.先看一下最近临域插值法
    src 10*20  -->dst 5*10 
    dst <--src  目标图像的每一个点其实都来自于原图像。我们可以用原图像的每一个点来表示原图像的每一个点。
    例如目标图像的(1,2),可以用原图像的(2,4)来表示   (1,2)<-(2,4)  目标图像的每一个点其实都是来至于原图像。
    dst x -> src x  2    计算newX
    newX = src x*(src 行/dst 行)    newX=1*(10/5)=2
    newY = src y*(src 列/dst 列)    newX=2*(20/10)=4
    有时候我们取出来的值不是整数,例如是12.3,那么我们就取离12.3最近的值12。这个就是我们说的最近临域插值法。
    

    使用代码实现最近临域插值。

    # 使用代码实现上面的步骤
    # 1.info 2.空白模板 3.x y
    import cv2
    import numpy as np
    img = cv2.imread('image0.JPG',1)# 这里的img是一个数组,读取图片。
    imgInfo = img.shape
    print(imgInfo) # (547, 730, 3)
    Height = imgInfo[0]
    Width = imgInfo[1]
    mode = imgInfo[2]
    # print(Height)# 547
    # print(Width)# 730
    # print(mode)# 3
    
    dstHeight =  int(Height/2)
    dstWidth = int(Width/2)
    
    dstImage = np.zeros((dstHeight,dstWidth,3),np.uint8) # 0-255
    # print(dstImage)
    for i in range(0,dstHeight):
        for j in range(0,dstWidth):
            iNew = int(i*(Height*1.0/dstHeight))
            jNew = int(j*(Width*1.0/dstWidth))
            dstImage[i,j] = img[iNew,jNew]
    cv2.imshow('dst',dstImage)
    cv2.waitKey(0)
    

    实现的结果为:

    2)双线性插值的原理

    # 2.再看一下双线性插值的原理
    # 对A1 = 20% X上面的点 +80%X下面的点  A2 = 20% X上面的点 +80%X下面的点
    # 对B2 = 30% X左面的点 +70%X右面的点  B2 = 30% X左面的点 +70%X右面的点 
    # 最终点的求值有两种方法。
    # 1.A = A1*30% + A2*70%
    # 2.B = B1*20% + B2*80%
    

    3.图片缩放3

    通过矩阵的变化实现图片的缩放。

    # 使用矩阵实现图片的缩放
    import cv2
    import numpy as np
    img = cv2.imread('image0.JPG',1)
    cv2.imshow('src',img)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    
    matshift = np.float32([[0.5,0,0],[0,0.5,0]])
    
    dst = cv2.warpAffine(img,matshift,(int(height/2),int(width/2)))
    
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    

    (2)图片剪切

    如下图所示,图片的剪切效果图如下所示。

    # 图片的剪切
    # 100 -》200 y
    # 100 -》300 x
    import cv2
    img = cv2.imread('image0.JPG',1)
    imgInfo = img.shape
    dst = img[100:200,100:300]
    cv2.imshow('image',dst)
    cv2.waitKey(0)
    

    实现的结果为:

    (3)图片移位

    1.图片移位1

    # 1.opencv api实现图片移位  2.算法原理  3.源代码实现
    import cv2
    import numpy as np
    img = cv2.imread('image0.JPG',1)
    cv2.imshow('src',img)
    imgInfo = img.shape
    print(imgInfo)# (547, 730, 3)
    height = imgInfo[0]
    width = imgInfo[1]
    ###
    matShift = np.float32([[1,0,100],[0,1,200]]) # (2,3)
    print(matShift)
    dst = cv2.warpAffine(img,matShift,(height,width)) # 参数1:原始图片的data信息img。
    # 参数二:移位矩阵 参数三:图片的宽度和高度,图片的info信息。最后显示的图片的宽度和高度
    # 当前行数的功能是完成图片的移位,进行的是矩阵的运算
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    # 在水平方法移动100个像素,在竖直方向移动200个像素。
    
    # 输出的结果为:
    # (547, 730, 3)
    # [[  1.   0. 100.]
    #  [  0.   1. 200.]]
    

    实现的结果为:

    以上代码的原理分析。

    # 图像移位的算法原理
    # 移位矩阵 [1,0,100],[0,1,200]  把这个矩阵分为两个部分:一个是两行两列的矩阵2*2  一个是两行一列的矩阵2*1
    # 将一个2*3的矩阵分为两个矩阵,一个是2*2的矩阵,一个是2*1的矩阵
    # [[1,0],[0,1]]   2*2  A
    # [[100],[200]]  2*1   B
    
    
    # 输入的xy 为C。这里的xy是原图像的位置。
    
    # A*C + B = 移位之后的矩阵 [[1*x+0*y],[0*x+1*y]] + [[100],[200]] = [[1*x+0*y+100],[0*x+1*y+100]] = [[x+100],[y+200]]
    
    
    # (10,20) - >(110,120)这样新的点,就相当于x加上100,和y加上100
    

    2.图片移位2

    # 使用代码实现图片移位的算法
    import cv2
    import numpy as np
    img = cv2.imread('image0.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):
            # 这里的width-100表示的是移动不会是的图片的宽度变大,依然保持原图片的大小。还是一样的宽和高。
            dst[i,j+100] = img[i,j]
    cv2.imshow('image',dst)
    cv2.waitKey(0)
    

    实现的结果为:

    (4)图片镜像

    我们可以看出如下所示的图片显示,我们就可以看出图片镜像的含义。

    # 图片的镜像
    import cv2
    import numpy as np
    img = cv2.imread('image0.JPG',1)
    cv2.imshow('src',img)
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    deep = imgInfo[2]
    
    newImgInfo = (height*2,width*2,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,255) # BGR
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    

    实现的结果为:

    (5)图片仿射变化

    矩阵的仿射变化过程如下所示:

    import cv2
    import numpy as np
    img = cv2.imread('image0.JPG',1)
    imageInfo = img.shape
    height = imageInfo[0]
    width = imageInfo[1]
    mode = imageInfo[2]
    
    matSrc = np.float32([[0,0],[0,height-1],[width-1,0]])
    matDst = np.float32([[50,50],[300,height-200],[width-300,100]])
    
    matAffine = cv2.getAffineTransform(matSrc,matDst)
    dst = cv2.warpAffine(img,matAffine,(height,width))
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    

    (6)图片的旋转

    import cv2
    import numpy as np
    
    img = cv2.imread('image0.JPG',1)
    imageInfo = img.shape
    height = imageInfo[0]
    width = imageInfo[1]
    mode = imageInfo[2]
    matRotate = cv2.getRotationMatrix2D((height*0.5,width*0.5),45,0.5)
    # 参数一:Point2f center:表示旋转的中心点
    # 参数二:double angle:表示旋转的角度
    # 参数三:double scale:图像缩放因子
    dst = cv2.warpAffine(img,matRotate,(height,width))
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    
    

  • 相关阅读:
    03-链表
    23-自定义用户模型
    01-使用pipenv管理项目环境
    10-多线程、多进程和线程池编程
    17-Python执行JS代码--PyExecJS、PyV8、Js2Py
    09-Python-Socket编程
    08-迭代器和生成器
    07-元类编程
    06-对象引用、可变性和垃圾回收
    05-深入python的set和dict
  • 原文地址:https://www.cnblogs.com/stu-zhouqian/p/13252031.html
Copyright © 2020-2023  润新知