图片缩放原理

**shape[0] =图像的高
shape[1] =图像的宽
shape[2] = 图像的图像通道数量
np.zeros(shape, dtype=float, order=‘C’)
示例:

import numpy as np 
Zero =  np.zeros(10)
print(Zero)
print(Zero.shape)
输出:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]10,)**

方法1:
   利用cv2.resize()函数实现,很简单,直接调用resize函数就能实现

代码:

import cv2 as cv
img = cv.imread('d://python1//image//1.jpg',1)  #参数1:获取图片路径  参数2:1表示彩色  0:表示灰色
imageInfo = img.shape
'''
image[0] =图像的高
image[1] =图像的宽
image[2] = 图像的图像通道数量
'''
hight = imageInfo[0] #图片高
width = imageInfo[1] #图片宽
mode = imageInfo[2] #图像通道数量3   R G B

#缩放图像的比例 缩小原图的一半
dstHeight = int(hight * 0.5)
dstWidth = int(width * 0.5)

#调整图片的大小
dst = cv.resize(img,(dstWidth,dstHeight))

#显示图片
cv.imshow('image1',img)
cv.imshow('image',dst)
cv.waitKey(0)

运行结果:
在这里插入图片描述
可以看到输出的图片一张是原图一张是缩进原图的一半

方法2:最近临域插值法
原图:10 * 20 缩放后:5 * 10

缩放后图像上的的点都来自原图像上的点
缩放后图像的(1,2)点 通过原图像(2,4)点得到

计算公式:
缩放后图片的x坐标 通过原图片上的x坐标得到
那么缩放后图片的x = 缩放后图片上x * (原图上的右下角x坐标 除以 缩放后图片的右下角x坐标)
那么缩放后图片的y = 缩放后图片上y * (原图上的右下角y坐标 除以 缩放后图片的右下角坐标)

例如:
原图 10 * 20 右下角 x坐标是10 右下角y坐标是20
缩放 5 * 10 右下角 x坐标5 右下角y坐标是10
给定任意个缩放后图像的坐标(1,2)
根据公式 1 * (10/5)得到2
2 * (20/10)得到4

以上就是最近临域插值算法

大概思路:
1.获得原图的宽和高
2.获得缩放后图的宽高
3.遍历缩放后图的每一个像素点
4.通过得到的每一个像素点的x坐标和y坐标,利用公式得到一个x和y
5.通过得到的x和y,在原图上得到一个像素点
6.最终当遍历完每一个像素点就得到缩放的图

代码:

import numpy as np
import cv2 as cv

img = cv.imread('d://python1//image//1.jpg',1)
imageInfo = img.shape
'''
image[0] =图像的高
image[1] =图像的宽
image[2] = 图像的图像通道数量
'''
#1.原图宽和高
Hight = imageInfo[0]  #高
Width = imageInfo[1]  #宽

#2.缩放图的宽和高
dstHight = int(Hight / 2) #缩放图高
dstWidth = int(Width / 2) #缩放图宽

#创建一个数组
dstImage = np.zeros((dstHight,dstWidth,3),np.uint8)  #每一个像素点类型是uint8  范围是[0:255]

#3.遍历缩放图的每一个像素点
for x in range(0,dstHight):
    for y in range(0,dstWidth):
        #4.利用公式求得新的x和y坐标
        xNew = int(x * (Width * 1.0 / dstWidth))
        yNew = int(y * (Hight * 1.0 / dstHight))
        #5.通过获得新的坐标,在原图上获取该像素点
        dstImage[x,y] = img[xNew,yNew]
#6.得到缩放好的图
cv.imshow('image',dstImage)
cv.imshow('image1',img)
cv.waitKey(0)

运行结果:
在这里插入图片描述
在这里插入图片描述
3.

import cv2
import numpy as np
img = cv2.imread('d://python1//image//1.jpg',1)

imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

matShift = np.float32([[0.5,0,0],[0,0.5,0]]) #23列
dst = cv2.warpAffine(img,matShift,(int(width/2),int(height/2)))
'''
[[0.5,0,0], 
 [0,0.5,0]]
二行三列矩阵 拆分成二行二列 和二行一列

二行二列:                          A
[[0.5,0],
 [0,0.5]]

二行一列                          B
[[0],
 [0]]

二行一列                         C
xy    

缩放公式:
A*C+B    =  [[0.5*x+0*y],[0*x+0.5*y]] + [[0],[0]]
              =  [[0.5*x],[0.5*y]]
'''
cv2.imshow('image1',img)
cv2.imshow('image2',dst)
cv2.waitKey(0)

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值