快速上手Opencv---图像的缩放、剪切、位移、镜像

快速上手Opencv---图像的缩放、剪切、位移、镜像

图像的缩放

图片缩放第一步,读取图片及图片的像素信息

import cv2
img = cv2.imread('katong.jpg',1)
imgInfo = img.shape
print(imgInfo)
(940, 1024, 3)
height = imgInfo[0]
width = imgInfo[1]
mode = imgInfo[2]#色彩信息

#等比例缩放
desHeight = int(height*0.5)
desWidth = int(width*0.5)
dst = cv2.resize(img,(desWidth,desHeight))
cv2.imshow('suofangkatong1',dst)
cv2.waitKey(0)

在这里插入图片描述

通过插值方法缩小图片

#最近邻域插值法
#数学映射问题
import numpy as np
img = cv2.imread('katong.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#定义高度和宽度的缩放比例
dstHeight = int(height*0.5)
desWidth = int(width*0.5)
#生成一个空白模板
dstImage = np.zeros((dstHeight,dstWidth,3),np.uint8) #0-255
#这里的i和j指代目标图像中的高度与宽度的像素值
for i in range(0,dstHeight):#行
    for j in range(0,dstWidth):#列
    #iNew和jNew指代目标图像的高度和宽度信息对应在原始图像中的位置,接下里实际上是一组映射公式
        iNew = int(i*(height*1.0/dstHeight))
        jNew = int(j*(width*1.0/dstWidth))
        dstImage[i,j] = img[iNew,jNew]
cv2.imshow('dst1',dstImage)
cv2.waitKey

在这里插入图片描述

图片的剪切

在这里插入图片描述

#这是图片剪切的完整代码,仅针对这个例子的。
import cv2
img = cv2.imread('katong.jpg',1)
imgInfo = img.shape
#有了前面的知识铺垫,我们可以发现,所谓的图片剪切,就是我们仅读取部分像素点。
dst = img[100:600,200:600]
cv2.imshow('jianqie1',dst)
cv2.waitKey(0)

图片的位置移动

在这里插入图片描述

上面这个图片我们是对原始图片进行了水平和竖直方向的位移。这里和图片的剪切是有区别的。剪切是我们从原有图片的像素中取点显示,位移则是我们将原始图片的水平坐标与数值坐标做了一个移动。代码如下:

import cv2
import numpy as np
img = cv2.imread('katong.jpg',1)
cv2.imshow('src',img)#这里图片的显示格式为'src',方便与后面图片比较
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

matShift = np.float32([[1,0,100],[0,1,200]])#2*3矩阵,对这个矩阵做一个说明,这个矩阵可以拆解为2个矩阵2*2,2*1
# [[1,0],[0,1]]我们把这个矩阵叫做A矩阵,[[100],[200]]我们把这个矩阵叫做B矩阵
#我们把原始图像叫做C矩阵,C矩阵包含了像素的宽度和高度[[x],[y]]
#我们用A矩阵乘以C矩阵加上B矩阵得到[[1*x+0*y],[0*x,1*y]]+[[100],[200]]=[[x+100],[y+200]]
#相当于x向右移动了100,y向下移动了200
dst = cv2.warpAffine(img,matShift,(height,width))#位移函数
cv2.imshow('dst',dst)
cv2.waitKey(0)

用代码实现的详细说明

import cv2
import numpy as np
img = cv2.imread('katong.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros(img.shape,np.uint8)
for i in range(0,height):
    for j in range(0,width-100):#这里width-100是指将原始图像在列上减小100个像素点距离
        dst[i,j+100]=img[i,j]#这里目标图像与原始图像的映射关系
        #下面6幅图片是调整不同的映射关系得到的结果
cv2.imshow('dst',dst)
cv2.waitKey(0)

在这里插入图片描述

在这里插入图片描述

图片的镜像

在这里插入图片描述

从上图可以看出来,图片的镜像实际就是将图片在竖直方向上的像素点夸大2倍(针对本图片而言),然后上半部分是正常的原始图像,下半部分是将原始图像针对新图像的中心线做一个对称的映射。代码如下:

import cv2
import numpy as np
img = cv2.imread('katong.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]
newImgInfo = (height*2,width,deep)#这里把新图片的像素信息在高度上乘以2倍
dst = np.zeros(newImgInfo,np.uint8)#准备新的图像模板
for i in range(0,height):
    for j in range(0,width):
        dst[i,j] = img[i,j]#这里首先绘制上部分图像,与原始图像一致
        dst[height*2-i-1,j] = img[i,j]#这里是下半部分的映射图像,列方向上的图像是保持一致的,行上面的做一个对应变化
        #变化的公式在文末展示:
for i in range(0,width):
    dst[height,i] = (0,0,255)
cv2.imshow('dst',dst)
cv2.waitKey(0)

在这里插入图片描述

发布了64 篇原创文章 · 获赞 25 · 访问量 9892

猜你喜欢

转载自blog.csdn.net/LEEANG121/article/details/103546526