挑战图像处理100问(26)——双线性插值

news2025/1/12 13:49:15

在这里插入图片描述
双线性插值是一种常用的图像插值方法,用于将低分辨率的图像放大到高分辨率。它基于一个假设:在两个相邻像素之间的值是线性的。

双线性插值考察 4 4 4邻域的像素点,并根据距离设置权值。虽然计算量增大使得处理时间变长,但是可以有效抑制画质劣化。

  1. 放大后图像的座标 ( x ′ , y ′ ) (x',y') (x,y)除以放大率 a a a,可以得到对应原图像的座标 ( ⌊ x ′ a ⌋ , ⌊ y ′ a ⌋ ) (\lfloor \frac{x'}{a}\rfloor , \lfloor \frac{y'}{a}\rfloor) (⌊ax,ay⌋)

  2. 求原图像的座标 ( ⌊ x ′ a ⌋ , ⌊ y ′ a ⌋ ) (\lfloor \frac{x'}{a}\rfloor , \lfloor \frac{y'}{a}\rfloor) (⌊ax,ay⌋)周围 4 4 4邻域的座标 I ( x , y ) I(x,y) I(x,y) I ( x + 1 , y ) I(x+1,y) I(x+1,y) I ( x , y + 1 ) I(x,y+1) I(x,y+1) I ( x + 1 , y + 1 ) I(x+1, y+1) I(x+1,y+1)

  3. 分别求这4个点与 ( x ′ a , y ′ a ) (\frac{x'}{a}, \frac{y'}{a}) (ax,ay)的距离,根据距离设置权重: w = d ∑   d w = \frac{d}{\sum\ d} w= dd

  4. 根据下式求得放大后图像 ( x ′ , y ′ ) (x',y') (x,y)处的像素值

d x = x ′ a − x d y = y ′ a − y I ′ ( x ′ , y ′ ) = ( 1 − d x )   ( 1 − d y )   I ( x , y ) + d x   ( 1 − d y )   I ( x + 1 , y ) + ( 1 − d x )   d y   I ( x , y + 1 ) + d x   d y   I ( x + 1 , y + 1 ) d_x = \frac{x'}{a} - x\\ d_y = \frac{y'}{a} - y\\ I'(x',y') = (1-d_x)\ (1-d_y)\ I(x,y) + d_x\ (1-d_y)\ I(x+1,y) + (1-d_x)\ d_y\ I(x,y+1) + d_x\ d_y\ I(x+1,y+1) dx=axxdy=ayyI(x,y)=(1dx) (1dy) I(x,y)+dx (1dy) I(x+1,y)+(1dx) dy I(x,y+1)+dx dy I(x+1,y+1)

import cv2
import numpy as np

# 定义双线性插值函数
def bilinear_interpolation(img, scale):
    height, width = img.shape[:2]  # 获取原始图像的高度和宽度
    new_height = int(height * scale)  # 计算缩放后的高度
    new_width = int(width * scale)  # 计算缩放后的宽度
    new_img = np.zeros((new_height, new_width, 3), dtype=np.uint8)  # 创建新图像
    for i in range(new_height):  # 遍历新图像的每一行
        for j in range(new_width):  # 遍历新图像的每一列
            # 计算在原始图像中的坐标
            x = i / scale
            y = j / scale
            # 计算距离最近的四个像素的坐标
            x1 = int(x)
            y1 = int(y)
            x2 = min(x1 + 1, height - 1)
            y2 = min(y1 + 1, width - 1)
            # 获取四个像素的像素值
            f11 = img[x1, y1]
            f12 = img[x1, y2]
            f21 = img[x2, y1]
            f22 = img[x2, y2]
            # 计算插值权重
            wx = x2 - x
            wy = y2 - y
            # 计算插值像素值
            new_img[i, j] = (f11 * wx * wy + f12 * wx * (1 - wy) + f21 * (1 - wx) * wy + f22 * (1 - wx) * (1 - wy)).astype(np.uint8)
    return new_img

# 加载图像
img = cv2.imread('input.jpg')

# 缩放图像
scale = 2
new_img = bilinear_interpolation(img, scale)

# 显示输出图像
cv2.imshow('input', img)
cv2.imshow('output', new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,双线性插值函数bilinear_interpolation()接受两个参数,分别是输入图像img和缩放倍数scale。函数首先获取原始图像的高度和宽度,然后计算缩放后的高度和宽度,并创建一个新图像。接下来,函数遍历新图像的每一个像素,并计算在原始图像中的坐标。然后,函数找到距离最近的四个像素,并获取它们的像素值。接着,函数计算插值权重,并使用这些权重计算插值像素值。最后,函数返回新图像。

示例代码加载图像input.jpg,并将其缩放两倍,然后显示输入图像和输出图像。在此示例中,输出图像使用双线性插值生成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/379658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑开机后进不了系统?原因以及解决方法

在日常使用电脑的过程中,我们有时候会遇到电脑开机后进不了系统的情况,这是令人十分烦恼的事情。那么,这种情况的出现可能是由于什么原因呢?接下来,本文将为您介绍电脑开机后无法进入系统的原因以及解决方法。 演示机型…

【Java】String类

1. String内部声明 jdk8以前: private final char value[]; final:指明数组一旦初始化,其地址就不能改变 jdk9以后: private final byte[] value;,为节省内存空间而优化 final:指明数组一旦初始化&…

这些让人变笨的食物你是不是天天吃?

我们关注食物的营养,关注它对身材、健康的影响。现在,我们发现有些食物,还会影响人的神经系统、认知能力。简而言之,就是有些食物可能会让人变笨。《美国医学会神经病学杂志》上的一项研究,分析了超加工食物与认知能力…

【蓝桥杯入门到入土】最基础的数组你真的掌握了吗?

文章目录一:数组理论基础二:数组知识点总结三:数组这种数据结构的优点和缺点是什么?四:实战解题1. 移除元素暴力解法双指针法2.有序数组的平方暴力解法双指针法最后说一句一:数组理论基础 首先要知道数组在…

【数据结构】堆的详解

本章的知识需要有树等相关的概念,如果你还不了解请先看这篇文章:初识二叉树 堆的详解一、二叉树的顺序结构及实现1、二叉树的顺序结构2、堆的概念及结构二、堆的简单实现 (以大堆为例)1、堆的定义2、堆的初始化3、堆的销毁4、堆的打印5、堆的插入6、堆顶元素的获取7…

网络传输:linux下的网络请求和下载(ping wget curl)、端口

一、下载和网络请求 1.ping命令 可以通过ping命令,检查指定的网络服务器是否可连通状态 语法:ping [-c num] ip或主机名 选项: -c 检查的次数,若不使用-c,将无限次数持续检查参数:ip或主机名&#xff0c…

基于Python的时间序列异常值检测

今天我们介绍一下使用python做时间序列数据分析和预测中异常值检测的方法,常用的异常值检测方法有以下几种: 3sigma: 基于正太分布,当数据值超过3个标准差(3sigma)时为异常值。z-score : z标准分数,它测量数据值到平均值的距离,当…

pandas对某一列的种类编码

文章目录背景实现背景 如果某一列的种类特别多,想要通过映射来编码,这样非常麻烦,所以可以对一个列全部一次性进行编码。 例如我的数据如下: 我需要编码专业这个列,我们可以看到这一列很多: 实现 使用…

【Unity】P3 基础设定

Unity基础设定父子关系InspectorTransformMesh FilterMesh Rendener第二种常用的父子操作Global 与 Local 模式Pivot 与 Center 模式声音组件创建多场景Asset 资源商店前言 上一篇博文主要围绕Unity的静态基础操作部分,从创建好的一个小方块cube开始,到对…

Selenium基于POM的自动化测试实践

什么是Page Object模式 Page Object 见名知意,就是页面对象,并将页面元素定位方法和元素操作进行分离。在实际自动化测试实战过程中,我们一般对脚本的实现分为三层: (1)对象层: 用于存放页面元素定位和控件操作 (2)逻…

《Nacos(3) - 集群搭建(详细)》

《Nacos(3) - 集群搭建》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《Nacos3 - 集群搭建》《Nacos(3) - 集群搭建》1.集群结构图2.搭建集群2.1.初始化数据库2.2.下载nacos2.3.配置Nacos2.4.启动2.5.nginx反向代理2.6.优化1.集群结构图 官方给出的Na…

【JavaSE】对象的比较

哈喽,大家好!我是保护小周ღ,本期为大家带来的是Java中自定义类型(对象)的三种比较方式,equals 方法, Comparable 泛型接口, Comparator 泛型接口 。在日常编程中,我们常常会需要比较的问题&…

cuda版本,pytorch(GPU)版本的选择和下载

cuda版本: 1.Nvidia控制面板里的cuda版本, 或使用nvidia-smi命令显示的cuda版本 是cuda的driver api版本 2.nvcc -V中的cuda版本,是cuda的runtime api版本,即cudatoolkit的版本 cudatoolkit的版本不能高于cuda driver api的版本&#xff…

23.2.28 Staffing System

员工管理系统功能介绍: 1)服务器负责管理所有员工表单(以数据库形式),其他客户端可通过网络连接服务器来查询员工表单。 2)需要账号密码登陆,其中需要区分管理员账号还是普通用户账号。 3&am…

聚观早报 | 苹果2024年放弃高通;腾讯回应进军类 ChatGPT

今日要闻:苹果2024年放弃高通;腾讯回应进军类 ChatGPT;小米发布无线AR眼镜探索版;50%的美国企业已在使用ChatGPT;Snap推出ChatGPT驱动的聊天机器人 苹果2024年放弃高通 高通公司 CEO 兼总裁克里斯蒂亚诺・安蒙&#xf…

Node.js 是个啥?

趣学 Node.js - 死月 - 掘金小册带你重新体悟 Node.js 之美。「趣学 Node.js」由死月撰写,1923人购买https://s.juejin.cn/ds/SYVvuDw/ 在这里,我们先装作对 Node.js 不了解,从头来过吧。你有没有假装不了解 Node.js 我不知道,但…

界面开发(2)--- 使用PyQt5制作用户登陆界面

使用PyQt5制作用户登陆界面 上篇文章已经介绍了如何配置PyQt5环境,这篇文章在此基础上展开,主要记录一下如何使用 PyQt5 制作用户登陆界面,并对一些基础操作进行介绍。 下面是具体步骤,一起来看看吧! 1. 打开 Pychar…

【IoT】2023裁员潮还在继续,构建规划能力也许是一剂良方

今天要分享的主题是华为的市场管理方法论。 市场管理这个词总体来说还是有些抽象,本质上来看或者说从个人的角度来看,其实就是一种规划的能力。 无论是创业,还是作为职场人,规划能力必将是你不可或缺的一种基础能力。 尤其是在这样…

Maven说明

目录 1.说明 2.详细说明 3.Maven模型 4.Maven常用的命令 5.Maven生命周期 6.Maven坐标 7.依赖管理与依赖范围 1.说明 Maven是专门用于管理和构建Java项目的工具,它是基于项目对象模型(POM)的概念,主要功能有: 提供了一套标准化的项目…

Ubuntu 下NGINX 的简单使用

1.NGINX的安装与卸载 1.1.安装NGINX apt-get install nginx1.2.NGINX操作命令 service nginx start #启动 service nginx reload #重新加载配置文件 service nginx restart #重启 service nginx status #查看运行状态 1.3.卸载NGINX apt-get remove nginx nginx-common #…