图片双线性插值原理解析与代码 Python

这篇具有很好参考价值的文章主要介绍了图片双线性插值原理解析与代码 Python。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、原理解析

图片双线性插值原理解析与代码 Python,程序开发--算法与数据结构,python,算法

图片插值是图片操作中最常用的操作之一。为了详细解析其原理,本文以 3×3 图片插值到 5×5 图片为例进行解析。如上图左边蓝色方框是 5×5 的目标图片,右边红色方框是 3×3 的源图片。上图中,蓝/红色方框是图片,图片中的蓝/红色小圆点是图片中的像素,蓝/红色实线箭头是图片坐标系,蓝/红色虚线箭头是图片像素坐标系,从中可以发现图片框是要比最外圈像素所围成的像素框大一圈。图片插值指的是将右边红色方框放大到与左边蓝色方框同大,然后通过右边放大后的 3×3 的红色像素值计算得到左边的 5×5 的蓝色像素值。通常意义下所说的图片缩放或插值指的是两幅图片的图片框之间的关系而不是像素框之间的关系。基于图片框缩放,3×3 的图片要插值搭到 5×5 的图片,指的是红色方框从上图放大到下图的样子。

图片双线性插值原理解析与代码 Python,程序开发--算法与数据结构,python,算法

如果采用像素框缩放,那红色方框放大后,需要保证 3×3 的像素的四个角的像素位置与蓝色方框的 5×5 像素的四个角的像素位置完全重合,那放大后的红色方框要比上图的红色方框再大一小圈。基于图片框缩放,从上图中可以发现,当 3×3 的红色图片被插值到 5×5 的图片后,原本 3×3 的像素位置也会相应的发生缩放。

图片双线性插值原理解析与代码 Python,程序开发--算法与数据结构,python,算法

将参考辅助线调整后,如上左图所示,在完成缩放后,那图片插值的剩余过程就是通过红色像素值计算蓝色像素值。拿一个最左下角红色方格举例如上右图所示,已知四个红色像素点的位置和像素值,同样已知蓝色像素点 的位置,求  的像素值。

二维线性插值是图片插值中最常用的插值算法。二维线性插值的原理为,首先基于一维线性插值原理,通过  和  计算得到  的像素值,通过  和  计算得到  的像素值,然后通过  和  计算得到  的像素值。

通过  和  计算得到  的像素值的公式为(线性方程):

图片双线性插值原理解析与代码 Python,程序开发--算法与数据结构,python,算法

通过  和  计算得到  的像素值的公式为(线性方程):

图片双线性插值原理解析与代码 Python,程序开发--算法与数据结构,python,算法

通过  和  计算得到  的像素值的公式为(线性方程):

图片双线性插值原理解析与代码 Python,程序开发--算法与数据结构,python,算法

整理得到:

图片双线性插值原理解析与代码 Python,程序开发--算法与数据结构,python,算法

其中

这里需要特别说明的是,边界点的处理方法,如上右图的  点,其位于四个红色像素点以外,但由于其位于图片的最左下角边界上,其下面没有红色像素点,只有上面有两个像素点。但针对  点像素值的计算我们依然使用这四个红色像素点,相当于  点是  与  的直线段的延伸。

二、Python 代码

关于代码实现需要注意 3 个地方:

1. 上面原理讲的是从原图片像素坐标映射到目标图片像素坐标的过程,但实际编程一般采用从目标图片像素坐标映射到源图片像素坐标;

2. 在缩放比计算时注意,图片框缩放计算公式是 src_h/dst_h,但像素框缩放计算公式是 (src_h-1)/(dst_h-1);

3. 在图片边界处的处理为,需要保证所计算的左下角像素点坐标大于等于 0 且小于等于图片尺寸 -2,小于等于图片尺寸 -2 的原因是保证右上角像素点坐标小于等于图片尺寸 -1,边界处的像素点的计算依然需要最近邻的四个点。文章来源地址https://www.toymoban.com/news/detail-782050.html

import numpy as np
import cv2


def bilinear(src_img, dst_shape):

    # 计算目标图片到原图片的缩放比,且是图片坐标系的缩放,不是像素坐标系的缩放,像素位于图像像素格的中心
    src_h, src_w = src_img.shape[0], src_img.shape[1]
    dst_h, dst_w = dst_shape
    scale_h, scale_w = src_h/dst_h, src_w/dst_w              # 如果是像素坐标系的缩放则应该为 (src_h-1)/(dst_h-1)

    # 定义目标图片并向其中填充像素值,遍历目标图片像中的每个像素点
    dst_img = np.zeros((dst_h, dst_w, 3), np.uint8)
    for i in range(dst_h):
        for j in range(dst_w):

            # 将 目标像素坐标系下的坐标 --> 目标图像坐标系下的坐标(+0.5) --> 源图像坐标系下的坐标(*scale) --> 源像素坐标系下的坐标(-0.5)
            src_x = (j + 0.5) * scale_w - 0.5
            src_y = (i + 0.5) * scale_h - 0.5
			
			# 在非边界情况下获取左下角图像像素点坐标,在左/下边界的情况下保证大于等于0,在右/上边界的情况下保证小于等于src-2,以保证计算时所用的右上角像素坐标小于等于src-1
            src_x_int = min(max(int(src_x), 0), src_w-2)
            src_y_int = min(max(int(src_y), 0), src_h-2)
            
            # 获取所求像素点相比左下角像素点的距离
            src_x_float = src_x - src_x_int
            src_y_float = src_y - src_y_int

            # 计算每个像素值
            dst_img[i, j, :] = (1. - src_y_float) * (1. - src_x_float) * src_img[src_y_int, src_x_int, :] + \
                               (1. - src_y_float) * src_x_float * src_img[src_y_int, src_x_int + 1, :] + \
                               src_y_float * (1. - src_x_float) * src_img[src_y_int + 1, src_x_int, :] + \
                               src_y_float * src_x_float * src_img[src_y_int + 1, src_x_int + 1, :]
            
    return dst_img


if __name__ == "__main__":
    img_path = "test.jpg"

    src_img = cv2.imread(img_path, cv2.IMREAD_COLOR)
    dst_shape = (300, 400)

    # 图片放缩均采用双线性插值法
    # opencv的放缩图片函数
    resize_image = cv2.resize(src_img, (400, 300), interpolation=cv2.INTER_LINEAR)
    # 自定义的图片放缩函数
    dst_img = bilinear(src_img, dst_shape)

    cv2.imwrite("new_resize.jpg", resize_image)
    cv2.imwrite("new.jpg", dst_img)

到了这里,关于图片双线性插值原理解析与代码 Python的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 上采样(最近邻插值、双线性插值法、反池化、转置卷积)

    一般图像分割的时候,需要对图像进行像素级别的分类,因此在卷积提取到抽象特征后需要通过上采样将feature map还原到原图大小,在FCN和U-net等网络中都提到了上采样的操作,这里会一些上采样的方法进行总结。 最简单的图像缩放算法就是最近邻插值,也称作零阶插值,就

    2024年02月05日
    浏览(66)
  • 深度学习基础知识 最近邻插值法、双线性插值法、双三次插值算法

    最邻近插值:将每个目标像素找到距离它最近的原图像素点,然后将该像素的值直接赋值给目标像素 优点 :实现简单,计算速度快 缺点 :插值结果缺乏连续性,可能会产生锯齿状的边缘,对于图像质量影响较大,因此当处理精度要求较高的图像时,通常会采用更加精细的插

    2024年02月03日
    浏览(56)
  • 在 FPGA 上如何实现双线性插值的计算?

    作者 | 殷庆瑜  责编 | 胡巍巍 目录 一、概述 二、What?什么是双线性插值? 二、Why?为什么需要双线性插值? 三、How?怎么实现双线性插值? 关键点1 像素点选择 关键点2 权重计算 升级1 通过查表减少计算量 升级2 通过数据锁存减少取数周期 升级3 通过换数信号兼容更多分

    2024年02月08日
    浏览(40)
  • 数字图像处理(十三)图像放大及双线性插值算法

    图像放大是日常学习中经常要用到的两个算法,我们首先讨论缩放的流程以及放大时如何优化双线性插值算法。 采用国际标准测试图像Lena,为了方便,我们将读入的彩色图转为灰度图进行缩放。 和图像缩小不同,图像放大是小数据量到大数据量的处理过程,因此需要对许多

    2024年02月05日
    浏览(52)
  • 九.图像处理与光学之图像几何变换算法(双线性插值)

    ​ 图像几何变换是图像处理中非常基础实用的技能,主要包括图片位移、缩放、镜像、剪切、放射变换等,在对图像进行空间变换的过程中,典型的情况是在对图像进行放大,旋转处理的时候,图像会出现失真的现象。这是由于在变换之后的图像中,存在着一些变换之前的图

    2024年02月13日
    浏览(49)
  • 上采样,下采样,卷积,反卷积,池化,反池化,双线性插值【基本概念分析】

    上采样(upsampling):又名放大图像、图像插值; 主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上; 上采样有3种常见的方法:双线性插值(bilinear),反卷积(Transposed Convolution),反池化(Unpooling); 图像放大几乎都是采用内插值方法,即在原有图像像素的基础上在

    2024年02月05日
    浏览(46)
  • 《数字图像处理》实验之对图像进行双线性(bilinear)插值缩放

     最近数字图像处理的实验课,老师让我们实现 对图像进行双线性(bilinear)插值缩放 ,以下是原理和代码。 一、双线性插值缩放 1、图像几何变换的一般流程: ①确定变换后新图像的大小 ②对新图像的每一个像素,确定其在旧图像坐标中的对应位置(逆变换) ③确定旧图像

    2024年02月07日
    浏览(97)
  • uniapp开发小程序使用rich-text富文本解析对图片大小处理

    1、问题: 在小程序中使用rich-text富文本解析时图片大小不能自适应而超出屏幕问题。 2、解决方式:如下   这是我绑定的值,在绑定值前,需要先进行对图片数据的处理后再使用即可。 3、 接口数据处理方法!!!!!(重点)  .replace(/img/gi, \\\'img style=\\\"width:100%;height:auto\\\"

    2024年02月11日
    浏览(55)
  • 微信小程序:服务器请求、上传图片和提交表单开发完整代码实例

    该示例涉及服务器请求、上传图片、展示上传的图片,并提交表单,同时配合使用 WXML(微信小程序的前端页面结构)、WXSS(样式表)、以及 JavaScript(逻辑控制)。请注意,服务器端的实现将不在本示例范围内,您需要根据实际需求创建后端 API 来处理请求和上传的操作。

    2024年02月06日
    浏览(56)
  • 损失函数(Loss Function)一文详解-分类问题常见损失函数Python代码实现+计算原理解析

    目录 前言 一、损失函数概述 二、损失函数分类 1.分类问题的损失函数

    2023年04月26日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包