超分辨重建-Bicubic双三次线性插值opencv实现

论文实验中经典方法Bicubic的Python实现 

 使用时更改文件夹、保存路径、重建倍数即可

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'D:\PythonUtils\RCAN_TestCode\LR\LRBI\B100\x4',
                    help='path to low resolution image dir')  # 待上采样图片文件夹
parser.add_argument('--hr_img_dir', type=str, default=r'D:\PythonUtils\RCAN_TestCode\LR\LRBI\B100',
                    help='path to desired output path for Upsampled images')  # 结果保存路径,会自动生成存储结果的文件夹,如  X2result
parser.add_argument('--scale', type=int, default=4,
                    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"\Bicubic-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"\Bicubic-x{args.scale}", f"x{args.scale}_" + filename.split('.')[0] + ext),
                lr_image)  # 保存高分辨率图像

4x下的重建效果

 Bicubic

RCAN 

 Bicubic

RCAN 

 Bicubic

RCAN

和现在的方法相比,Bicubic确实效果太差,不过实验中会经常用到进行对比 

<think>好的,用户想在Python中使用三次插值法提高图像分辨率。首先,我需要回忆一下三次插值的基本原理和常见实现方法。根据之前的引用资料,三次插值是一种图像处理中的插值方法,比线性和最近邻插值更复杂,能提供更平滑的结果。用户可能需要具体的代码示例,所以得找几个不同的库来实现。 首先想到的是Pillow库,因为它常用的图像处理库,用户可能比较熟悉。引用[1]中的代码用了torchvision的transforms模块,里面提到了InterpolationMode.BICUBIC。这可能是一个方法,但用户可能更想要直接的Python实现,而不是依赖PyTorch。不过这个例子可以作为一个参考。 然后引用[2]和引用[5]提到了OpenCV的cv2.resize函数,使用cv.INTER_CUBIC参数。这应该是一个直接的方法,用户可能希望看到如何用OpenCV实现。代码示例在引用[2]中已经有了,可以简化一下,展示如何读取图像并进行放大。 另外,引用[3]和引用[4]讨论了超分辨重建中生成低分辨率图像的过程,但用户需要的是提高分辨率,也就是上采样。这时候可能需要用三次插值来放大图像尺寸。例如,将图像的长宽各放大两倍。 接下来要考虑用户可能的场景:他们可能有一张低分辨率的图片,想通过插值来提高其分辨率,用于显示或其他处理。需要确保代码示例清晰,步骤明确,包括读取图像、应用插值、保存结果等。 另外,用户可能对不同的库感兴趣,比如Pillow、OpenCV或者Scipy。所以最好提供多种实现方式,让用户可以根据自己的项目需求选择。例如,Pillow的resize方法,OpenCV的resize函数,或者Scipy的ndimage.zoom函数。这些方法各有优劣,需要分别说明。 同时,需要注意代码的依赖库是否常见,比如OpenCV可能需要安装opencv-python包,而Pillow可能已经安装过了。在代码示例前,可能需要提示用户安装必要的库。 还有,用户可能需要了解三次插值与其他方法的区别,比如线性和最近邻插值,所以在相关问题中可以提到这些比较。但根据用户的问题,重点是在三次插值实现。 需要检查引用中的代码是否正确。比如引用[2]中的代码使用cv.resize,参数顺序是(width, height),而OpenCV的resize函数尺寸参数是(width, height),但通常图像处理中是(height, width),这点需要注意,避免用户出错。在示例中应该明确说明尺寸参数的设置。 另外,引用[5]提到了自定义的三次插值函数,但用户可能更倾向于使用现有的库函数,因为自己实现插值算法比较复杂,尤其是三次插值需要处理16个邻近像素,计算复杂度高,容易出错。所以可能不推荐自己造轮子,而是调用现有函数。 总结步骤:1. 使用OpenCV;2. 使用Pillow;3. 使用Scipy。每个方法给出代码示例,并说明如何调整尺寸。同时,需要提到放大后的效果可能受原始图像质量限制,插值无法恢复丢失的高频信息。 在生成相关问题的时候,可以考虑与其他插值方法的比较,参数调整的影响,或者超分辨率与插值的区别等。</think>在Python实现三次插值提升图像分辨率,可通过以下三种主流方法实现: ### 一、OpenCV实现(推荐) ```python import cv2 def upscale_bicubic(img_path, scale_factor=2): img = cv2.imread(img_path) h, w = img.shape[:2] new_size = (int(w*scale_factor), int(h*scale_factor)) # OpenCV使用(width,height)格式 resized = cv2.resize(img, new_size, interpolation=cv2.INTER_CUBIC) cv2.imshow('Original', img) cv2.imshow('Bicubic', resized) cv2.waitKey(0) return resized # 使用示例 upscaled_img = upscale_bicubic('input.jpg', 3) # 放大3倍 ``` ### 二、PIL/Pillow实现 ```python from PIL import Image def pillow_upscale(img_path, scale=2): img = Image.open(img_path) w, h = img.size resized = img.resize((w*scale, h*scale), Image.BICUBIC) resized.show() return resized pillow_upscale('input.jpg', 4) # 放大4倍 ``` ### 三、Scipy实现(适合科学计算) ```python import numpy as np from scipy.ndimage import zoom from PIL import Image def scipy_upscale(img_path, zoom_factor=2): img = Image.open(img_path) arr = np.array(img) # 三维缩放:(高度缩放比, 宽度缩放比, 通道缩放比) scaled = zoom(arr, (zoom_factor, zoom_factor, 1), order=3) # order=3表示三次插值 return Image.fromarray(scaled.astype('uint8')) result = scipy_upscale('input.jpg', 2) result.save('output.jpg') ``` ### 关键参数说明: 1. **缩放比例控制**:通过调整`scale_factor`参数控制分辨率提升幅度 2. **尺寸计算**:新尺寸需保持整数倍关系,建议使用`int(w*scale)`避免浮点误差 3. **通道处理**:彩色图像需注意保持RGB通道完整性,OpenCV默认处理BGR通道顺序 ### 效果说明: 三次插值通过16个相邻像素的加权计算实现插值,相比线性插值能更好保留边缘细节[^2][^4]。但需注意插值无法真正恢复丢失的高频信息,本质上是基于已有数据的预测重建[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值