python实现图像最近邻插值
作者:机器学习入坑者 发布时间:2023-02-01 00:03:34
引言:
最近邻插值Nearest Neighbour Interpolate
算法是图像处理中普遍使用的图像尺寸缩放算法,由于其实现简单计算速度快的特性深受工程师们的喜爱。
图像插值技术是图像超分辨率领域的重要研究方法之一,其目的是根据已有的低分辨率图像(Low Resolution,LR)获得高分辨率图像(High Resolution,HR)。
本文一方面对最邻近插值算法的流程进行分析,另一方面借助python实现基本的最近邻插值算法。
注:网上的资料有的翻译是“近邻”,也有的翻译是“临近”。
1、最近邻插值算法思想
插值的目的是根据已知的图像的像素值获得未知目标图像的像素值,插值变换过程如下图(PPT画的背景没去除)所示:
其中src
表示原始图像,tar表示插值得到的目标图像,H和W分别表示图像的高度和宽度。插值的核心是找到(tar_x, tar_y)和(src_x, src_y)的映射关系,从而实现对目标图像的每一个像素点进行赋值。假设目的是将原始图像长度和宽度扩大(3,4)倍,即:
ratio_H = tar_H/src_H = tar_x/src_x = 3
ratio_W = tar_W/src_W = tar_y/src_y = 4
通过上式变形,得到目标图像的像素点和原始图像的像素点映射如下:
tar_x = src_x/ratio_H
tar_y = src_y/ratio_W
知道了像素点之间的映射关系,实现算法就很容易了,算法流程如下:
(1)根据tar_H和tar_W创建目标图像
(2)计算缩放比例因子ratio
(3)遍历目标图像每个像素点,计算映射关系
(4)遍历目标图像每个像素点,使用对应原始图像的对应像素点对其赋值
2、python实现最邻近插值
有了前面的理论分析就很容易实现了,自己实现中比较难理解的地方就是“坐标变换关系”!如果是将原始图像放大整数倍很容易理解,比如一张原始10x10图像放大到目标20x20图像,那么20x20图像中的任一个像素点(tar_x,tar_y)的值来自原始10x10图像的(src_x,src_y)=int(tar_x/2, tar_y/2)
,也就是正好是除以2的位置;然而经常需要放大的倍数是小数倍,比如将10x10放大到15x15,这样(tar_x,tar_y)的值来自10x10图像中(src_x, src_y)=int(tar_x/1.5, tar_y/1.5)。
代码如下:
def nearest(image, target_size):
"""
Nearest Neighbour interpolate for RGB image
:param image: rgb image
:param target_size: tuple = (height, width)
:return: None
"""
if target_size[0] < image.shape[0] or target_size[1] < image.shape[1]:
raise ValueError("target image must bigger than input image")
# 1:按照尺寸创建目标图像
target_image = np.zeros(shape=(*target_size, 3))
# 2:计算height和width的缩放因子
alpha_h = target_size[0]/image.shape[0]
alpha_w = target_size[1]/image.shape[1]
for tar_x in range(target_image.shape[0]-1):
for tar_y in range(target_image.shape[1]-1):
# 3:计算目标图像人任一像素点
# target_image[tar_x,tar_y]需要从原始图像
# 的哪个确定的像素点image[src_x, xrc_y]取值
# 也就是计算坐标的映射关系
src_x = round(tar_x/alpha_h)
src_y = round(tar_y/alpha_w)
# 4:对目标图像的任一像素点赋值
target_image[tar_x, tar_y] = image[src_x, src_y]
return target_image
得到的插值结果的插值结果如下:
可以看出插值以后的图像明显存在锯齿效应,很多地方出现了“方格”。
来源:https://zhuanlan.zhihu.com/p/89409337


猜你喜欢
- 此代码适合你做网站用,普通朋友可以不用理这个东西!ASP:<%dim objXMLHTTP, qq, pwd qq = &
- ceil()方法返回x的值上限 - 不小于x的最小整数。语法以下是ceil()方法的语法:import mathmath.cei
- 最近,在搞这个东西,网上也找不到asp相关的,如果有人很早弄出来了,也不要笑话偶;费了好久,总算搞定;原理:用stream对象预读文件的头两
- 前言很多人会使用postman工具,或者熟悉python,但不一定会使用python来编写测试用例脚本,postman里面可以完整的将pyt
- 1.怎么样查看数据库字符集 [A]数据库服务器字符集select * from nls_database_parameters,其来源于pr
- 目录beautiful soup库的安 * eautiful soup库的理解beautiful soup库的引用BeautifulSoup类
- 1. base64编码简介用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,
- 本文实例讲述了VC基于ADO技术访问数据库的方法。分享给大家供大家参考。具体如下:一、在StdAfx.h文件中添加#import "
- 前言Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好。下面这篇文章主要介绍了关于golang自定义
- 在SQLServer中我们可以用over子句中来代替子查询实现来提高效率,over子句除了排名函数之外也可以和聚合函数配合。实现
- 看到好几位博主通过对模块的各个击破学习python,我也效法一下,本篇说一下python中加密涉及到的模块。hashlibhashlib模块
- 赶快记录一下,只是懂皮毛,或许多积累就好了import sysfrom PyQt4 import QtGuiclass MainWindow
- 一、MongoDB对MySQL常用的SQL语句对应的实现 —————————————— MySQL: SELECT * FROM user
- 目录一、MySQL主从搭建操作步骤二、Django实现读写分离自动指定一、MySQL主从搭建主从配置原理:主库写日志到 BinLog从库开个
- 一、format格式输出字符串使用 % 操作符对各种类型的数据进行格式化输出,这是早期 Python提供的方法。字符串类型(str)提供了
- 本人在做项目的时候遇到一个问题:某个函数需要在每个小时的 3 分钟时候被执行一次,我希望我 15:45 启动程序,过了18 分钟在 16:0
- 最好的学习方式就是实践。 我们通过导入gin包来深入学习。环境go 1.13.5goland 2019.3.1manjaro-gnome3.
- 线性逻辑回归本文用代码实现怎么利用sklearn来进行线性逻辑回归的计算,下面先来看看用到的数据。这是有两行特征的数据,然后第三行是数据的标
- Flask是一个用Python编写的Web应用程序框架,Flask是python的web框架,最大的特征是轻便,让开发者自由灵活的兼容要开发
- 当我们想对python中原有的模块进行覆盖,又不希望退出当前的程序,就需要用到重载的概念。这样既能使模块得到更新,又不影响解释器的使用。在导