超分辨率重建双三次插值Bicubic生成高分辨率图像

目录

一背景

二代码

三注意


一背景

在超分任务中,为了做对比实验,需要双三次插值算法生成高分辨率图像。为此写了简单代码实现。

二代码

import os
import argparse
import cv2

# parse args
parser = argparse.ArgumentParser(description='Upsize images using bicubic interpolation')
parser.add_argument("-k", "--keepdims", help="keep original image dimensions in downsampled images",
                    action="store_true")
##############################需要修改的部分#############################
parser.add_argument('--lr_img_dir', type=str, default=r'C:\Users\Administrator\Desktop\dunhuangchaofen\Testset\Set5\X2',
                    help='path to low resolution image dir') #待上采样图片文件夹
parser.add_argument('--hr_img_dir', type=str, default=r'C:\Users\Administrator\Desktop\bicubic',
                    help='path to desired output path for Upsampled images') #结果保存路径,会自动生成存储结果的文件夹,如  X2result
parser.add_argument('--scale', type=int, default=2,
                    help='path to desired output dir for Upsampled images')#上采样倍率
##########################################################
args = parser.parse_args()

lr_image_dir = args.lr_img_dir
hr_image_dir = args.hr_img_dir

print(args.hr_img_dir)
print(args.lr_img_dir)

# create LR image dirs
os.makedirs(hr_image_dir + f"\X{args.scale}result", exist_ok=True) #创建保存结果的文件夹


supported_img_formats = (".bmp", ".dib", ".jpeg", ".jpg", ".jpe", ".jp2",
                         ".png", ".pbm", ".pgm", ".ppm", ".sr", ".ras", ".tif",
                         ".tiff")

# Upsample LR images
for filename in os.listdir(lr_image_dir):
    if not filename.endswith(supported_img_formats):
        continue

    name, ext = os.path.splitext(filename)
    # Read LR image
    lr_img = cv2.imread(os.path.join(lr_image_dir, filename))
    hr_img_dims = (lr_img.shape[1], lr_img.shape[0])


    # Upsample image
    lr_image = cv2.resize(lr_img, (0, 0), fx=int(f"{args.scale}"), fy=int(f"{args.scale}"), interpolation=cv2.INTER_CUBIC)
    if args.keepdims:
        lr_image = cv2.resize(lr_image, hr_img_dims, interpolation=cv2.INTER_CUBIC)

    cv2.imwrite(os.path.join(hr_image_dir + f"\X{args.scale}result", f"x{args.scale}_"+filename.split('.')[0]  + ext), lr_image) #保存高分辨率图像

三注意

使用时,修改输入图像的文件夹,修改生成结果保存的位置,修改双三次插值上采样的倍率。

相关链接:

超分辨率重建中,生成低分辨率数据集

超分辨率重建数据集制作:生成低分辨率数据集_Alocus_的博客-CSDN博客_超分辨率数据集背景超分辨率重建任务需要高清和对应的低质图像。由于需要自己制作超分辨率重建数据集,需要将高分辨率图像按照公认的方式(DIV2k)制作为低分辨率图像,我根据网上代码进行了改造可运行代码如下:代码import osimport argparseimport cv2#parse argsparser = argparse.ArgumentParser(description='Downsize images at 2x using bicubic interpolation')parhttps://blog.csdn.net/Crystal_remember/article/details/122899283

<think>好的,我现在需要帮用户解答关于双三次插值算法用于提高图像分辨率的实现方式的问题。首先,我得回顾一下用户提供的引用内容,看看有哪些相关信息可以利用。 根据引用[1],双三次插值通过在水平和垂直方向应用三次样条插值来估计目标位置的值,比双线性插值更平滑,保留更多细节,但计算复杂度更高。引用[2]提到FPGA实现中双三次插值需要16个邻近像素点,使用三次函数加权平均。引用[3]指出OpenCV的resize函数可以用INTER_CUBIC选项,而引用[4]和[5]涉及超分辨率数据集生成和SRCNN结合双三次插值的方法。 用户的问题集中在实现方式上,所以需要分步骤解释算法原理、数学公式、具体实现步骤,并提供代码示例。同时,要参考引用中的信息,比如权值函数、映射方法、实际应用中的权衡(如计算资源)。 首先,要明确双三次插值的基本原理,包括二维插值的处理方式,如何利用周围16个像素点,以及权值函数(比如Bicubic函数)。然后,详细说明插值的步骤,比如坐标映射、邻近像素确定、权值计算、加权求和。数学公式部分要使用$$...$$格式,确保正确。 接着,代码实现部分需要选择用户提到的语言,比如Matlab或Python,但引用中有HLS和C++的例子,用户可能需要跨平台的方法。考虑到用户之前的问题可能涉及Python,示例用Python实现,并提及OpenCV的接口。 最后,根据引用内容,比较双三次插值的优缺点,以及应用场景,如超分辨率重建中的使用,结合深度学习模型如SRCNN。同时,生成相关问题时要覆盖算法优化、与其他方法比较、实际应用中的问题等。 需要确保LaTeX格式正确,所有行内公式用$...$,独立公式用$$...$$。检查引用标识是否正确对应,比如引用[1]到[5]的内容是否准确应用到回答中。可能还需要补充关于权值计算的具体公式,如Bicubic的a值通常取-0.5或-0.75,以及如何处理边缘像素等问题。 总结回答结构:原理、数学公式、实现步骤、代码示例、优缺点、应用场景,然后生成相关问题。</think>### 双三次插值算法提高图像分辨率的实现方式 #### 1. **算法原理** 双三次插值Bicubic Interpolation)是一种基于二维网格的插值方法,通过目标像素周围的$4×4$邻域(共16个像素)的加权平均值来估算新像素值[^2][^3]。其核心在于**三次样条函数**的权值计算,能够保留更多图像细节并减少锯齿效应。 #### 2. **数学公式** 对于目标像素$f(x,y)$,映射到原图像坐标为$(i+u,j+v)$(其中$i,j$为整数部分,$u,v∈[0,1)$为小数偏移量),插值公式为: $$f(x,y) = \sum_{m=-1}^{2} \sum_{n=-1}^{2} f(i+m,j+n) \cdot W(m-u) \cdot W(n-v)$$ 其中$W(t)$是三次样条权值函数,常用形式为: $$ W(t) = \begin{cases} (a+2)|t|^3 - (a+3)|t|^2 + 1 & \text{if } |t| \leq 1 \\ a|t|^3 -5a|t|^2 +8a|t| -4a & \text{if } 1 < |t| < 2 \\ 0 & \text{otherwise} \end{cases} $$ 通常参数$a$取$-0.5$或$-0.75$以平衡平滑性和锐度[^2][^3]。 #### 3. **实现步骤** 1. **坐标映射** 将目标图像像素位置映射到原图像坐标系。例如,若将图像放大$k$倍,目标像素$(x',y')$对应原图坐标为: $$x = x'/k, \quad y = y'/k$$ 2. **确定邻近像素** 获取原图中最近的$4×4$邻域像素,即$(i-1,j-1)$到$(i+2,j+2)$的16个点。 3. **计算权值** 根据水平方向偏移$u$和垂直方向偏移$v$,分别计算水平和垂直权值$W(u+m)$和$W(v+n)$($m,n∈\{-1,0,1,2\}$)。 4. **加权求和** 对16个邻域像素的RGB值进行加权平均,得到目标像素值。 #### 4. **代码实现示例(Python + OpenCV)** ```python import cv2 import numpy as np def bicubic_interpolation(img, scale_factor): # OpenCV内置双三次插值方法 h, w = img.shape[:2] new_h, new_w = int(h * scale_factor), int(w * scale_factor) return cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_CUBIC) # 示例调用 input_img = cv2.imread('input.jpg') output_img = bicubic_interpolation(input_img, 2.0) cv2.imwrite('output_bicubic.jpg', output_img) ``` #### 5. **优缺点对比** | **优点** | **缺点** | |---------------------------------------|---------------------------------------| | 保留边缘细节,插值结果更平滑[^1] | 计算复杂度高(需16次乘加运算)[^2] | | 适合高精度图像处理(如医学成像)[^3] | 边缘需特殊处理(如镜像填充)[^4] | #### 6. **应用场景** - **超分辨率重建**:生成低分辨率图像对应的高分辨率版本(需结合退化模型)[^4] - **图像缩放**:在打印、显示设备中提升图像质量[^2] - **深度学习预处理**:与SRCNN等网络结合,作为初始化步骤[^5] --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alocus_

如果我的内容帮助到你,打赏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值