python近邻图片修复_图像最近邻插值及python实现

引言:

最近邻插值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

得到的插值结果的插值结果如下:

可以看出插值以后的图像明显存在锯齿效应,很多地方出现了“方格”。

后面我会继续介绍其它的插值算法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值