数据预处理-最近邻插值算法

最近邻插值算法

  • 最近邻插值法nearest_neighbor是最简单的灰度值插值。也称作零阶插值。最近邻插值法可应用于图像的缩放,因为简单的变换与计算,效果一般不好。
  • 核心思想:就是令变换后像素的灰度值等于距它最近的输入像素的灰度值。
  • 计算公式:
    srcX=dstX(srcWidth/dstWidth)*
    srcY=dstY(srcHeight/dstHeight)*
    上式中,dstX与dstY为目标图像的某个像素的横纵坐标,dstWidth与dstHeight为目标图像的长与宽;srcWidth与srcHeight为原图像的宽度与高度。srcX,srcY为目标图像的点(dstX,dstY)对应的原图像的坐标。

代码实现:

from matplotlib import pyplot as plt
import numpy as np
from PIL import Image
#1.首先得到原图像的宽度、高度
def get_image_information(image_path):
    vector=plt.imread(image_path)
    # print(vector)#得到图像的三维矩阵
    # print(type(vector))
    # print(vector.shape)#得到(高,宽,通道数)
    height=vector.shape[0]
    width=vector.shape[1]
    return height,width,vector

def getdst_image_vector(srcHeight,srcWidth,srcVector,dstHeight,dstWidth):
    #定义一个三维矩阵存储目标图像,每个像素由RGB三种颜色组成,shape接受一个元组,可以创建多维矩阵
    dstVector=np.zeros(shape=(dstHeight,dstWidth,3),dtype=int)#默认是float64
    # print(dstVector)
    #遍历目标图像的每一个像素
    for dstX in range(1,dstWidth+1):#[0,dstWid-1],#矩阵从0开始,不是从1开始
        for dstY in range(1,dstHeight+1):#[0,dstHeight-1]
            #坐标换算
            dstX_srcX=dstX*(srcWidth/dstWidth)#python中/表示除法,//表示整除
            dstY_srcY=dstY*(srcHeight/dstHeight)
            # print(dstX_srcX,dstY_srcY)
            #最近邻四舍五入,采用round函数实现
            dstX_srcX_round=int(round(dstX_srcX))
            dstY_srcY_round=int(round(dstY_srcY))
            # print(srcVector[dstX_srcX_round][dstY_srcY_round])
            # print(dstX_srcX_round,dstY_srcY_round)
            dstVector[dstY-1][dstX-1]=srcVector[dstY_srcY_round-1][dstX_srcX_round-1]#这个地方要认真琢磨,x,y也不能搞反了
            # dstVector[dstX][dstY]=srcVector[dstX_srcX_round][dstY_srcY_round]
    print(dstVector)
    # pic=Image.fromarray(dstVector, "RGB")
    # pic.show()
    plt.imshow(dstVector)  # 显示数组
    plt.show()
    plt.imsave('邻近法得到的图像.jpg',dstVector.astype(np.uint8))#matplotlib保存图像的时候,只接受浮点数或者unit8的整数类型
    # plt.imsave('邻近法得到的图像.jpg',dstVector/255)
    return dstVector

if __name__=='__main__':
    imagePath=r'songshu.jpg'
    srcHeight,srcWidth,srcVector=get_image_information(imagePath)
    dstHeight=int(0.5*srcHeight)
    dstWidth =int(0.5*srcWidth)
    # print(dstHeight,dstWidth)
    dstVector=getdst_image_vector(srcHeight,srcWidth,srcVector,dstHeight,dstWidth)
    # print("srcVector",srcVector)
    # print("dstVector",dstVector)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值