python最近邻插值、双线性插值(石原里美系列二)

news/2024/7/21 6:00:17 标签: python, 图像处理

一、故事背景

石原里美小姐姐可真是个磨人的小妖精,上次讲到python中值滤波、最大池化、平均池化、canny边缘检测(石原里美系列一)让你修复了椒盐噪声和生成简笔画。现在秋招了,石原里美小姐姐也加入到了秋招的大军中,但是遇到一个问题,秋招需要上传个人照片,要求图像的尺寸较大。但是,石原里美小姐姐用的老人机,只有几百万像素,拍不了高清大图,于是又找到了身为技术宅的你。聪明的你,立马想到了最近邻插值、双线性插值的方法来做。

二、最近邻插值

所谓最近邻插值,就是当图像进行尺度缩放时,直接找最近的像素点进行填充。比如第一个矩阵经过最近邻插值进行二倍的扩大:
在这里插入图片描述

python">def nearest(src,dst,shape):
    img = np.array(Image.open(src))
    srcH,srcW,_ = img.shape
    rateH,rateW = srcH/shape[0],srcW/shape[1]
    newimg = np.zeros((shape[0],shape[1],3),dtype=np.uint8)
    for i in range(shape[0]):
        for j in range(shape[1]):
            xx = min(round(rateH*i),srcH-1)
            yy = min(round(rateW*j),srcW-1)
            newimg[i,j] = img[xx,yy]
    dst_img = Image.fromarray(newimg.astype('uint8'))
    dst_img.save(dst)

在这里插入图片描述

三、双线性插值

石原里美小姐姐收到照片之后不高兴了,质问到,为什么隔壁老王修的照片没有模糊,你这缩放的图像怎么锯齿状这么明显呢?于是,聪明的你又想到了双线性插值的方法。双线性插值就是像素点在进行采样时考虑到上下左右四个相邻像素点,然后根据四个像素点的距离进行插值运算。
在这里插入图片描述
思想图如上所示,下面开始敲代码:

python">def biniliar(src,dst,shape):
    img = np.array(Image.open(src))
    srcH, srcW, _ = img.shape
    rateH, rateW = srcH / shape[0], srcW / shape[1]
    newimg = np.zeros((shape[0], shape[1], 3), dtype=np.uint8)
    for i in range(shape[0]):
        for j in range(shape[1]):
            src_i = rateH * i
            src_j = rateW * j
            floor_i = min(math.floor(src_i),srcH-1)
            floor_j = min(math.floor(src_j),srcW-1)
            ceil_i = min(floor_i+1,srcH-1)
            ceil_j = min(floor_j+1,srcW-1)
            xx, yy = src_i - floor_i, src_j - floor_j
            newimg[i, j] = (1-xx)*(1-yy)*img[floor_i, floor_j] + xx*(1-yy)*img[ceil_i, floor_j] + (1-xx)*yy*img[floor_i,ceil_j] + xx*yy*img[ceil_i,ceil_j]
    dst_img = Image.fromarray(newimg.astype('uint8'))
    dst_img.save(dst)

在这里插入图片描述
经过双线性插值处理,考虑几个近邻像素并进行线性计算,并未直接进行近邻复制(马赛克形状)。可把石原里美高兴坏了,表示愿意和你一起共进晚餐。


http://www.niftyadmin.cn/n/819211.html

相关文章

搞懂Python装饰器

一、故事背景 石原里美在学习排序算法时看到了这个博客python 实现几大排序算法,里面提到了不同的算法排序的时间复杂度不同,于是想通过实验来感受一下。直接通过计算不同算法的排序时长,感受时间复杂度。于是乎,写了个冒泡排序。…

27岁乌克兰数学家在俄自杀,留下给疯狂世界的遗书!

编辑:David 好困 袁榭转载来源:新智元3月20日,年仅27岁的乌克兰数学家Konstantin Olmezov在俄罗斯自杀。一个名为「乌克兰数学家」的账号梳理了关于这位数学家的介绍,以及他自杀前后的细节。「他在2月26日第一次试图离开俄罗斯时被…

编译opencv cuda环境时的cmake指令及依赖数据下载vgg、ippicv、wechat_qrcode等

nvidia-docker下安装编译opencv cuda,python调用 根据这个方式走 https://blog.csdn.net/qq_44523137/article/details/124098406 cmake时 遇到缺少什么包,就安装什么包。-D后面如果有空格报错没有CMakexxxlist.txt可以把-D后面的空格去掉,…

python list初始化中,修改一个值,一列都修改了?延伸copy与deepcopy

今天遇到一个list初始化的问题。 初始化一个55的二维数组: >>>a [[1] * 5]*5 >>>a [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]下面对a[0][0]的值进行修改: >>> a[0][0]10 &…

python 实现几大排序算法

1、插入排序 插入排序的思想是由后往前插入,选择合适的位置插入之后,进行下一个操作。 稳定算法,时间复杂度O(n^2),空间复杂度O(1)。图源百度 def insert_sort(nums):for i in range(len(nums)):tmp nums[i]j i# 如果当前位数…

基于深度学习的目标检测综述(单阶段、多阶段、FPN变体、旋转目标检测等)

随着深度学习的发展,基于深度学习的目标检测方法因其优异的性能已经得到广泛的使用。目前经典的目标检测方法主要包括单阶段(YOLO、SSD、RetinaNet,还有基于关键点的检测方法等)和多阶段方法(Fast RCNN、Faster RCNN、Cascade RCNN等)。下面主…

详解经典旋转目标检测算法RoI Transformer

一、引言 1、旋转目标检测检测 旋转目标检测检测就是将具有旋转方向的目标检测出来,也就是需要检测目标的中心点、长宽、角度。在俯视图的目标检测中比较常见,如遥感图像目标检测、航拍图像目标检测等。(见下图旋转目标检测,图源论文RoI Tr…

python中值滤波、最大池化、平均池化、canny边缘检测(石原里美系列一)

一、常见三种滤波器介绍 中值滤波:取卷积区域内的中位数 最大池化:取卷积区域内的最大值 平均池化:取卷积区域内的均值 边缘检测:边缘检测就是找到图像的边缘信息(轮廓) 二、故事背景 有一天,石原里美小姐姐出去玩&…