OpenCV实战之一 | 使用OpenCV进行图像超分辨率

这篇具有很好参考价值的文章主要介绍了OpenCV实战之一 | 使用OpenCV进行图像超分辨率。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言
图像超分辨率(Image Super-Resolution,简称ISR)是一种图像处理技术,将低分辨率的图像通过算法转换成高分辨率图像,从而增加图像的细节和清晰度。
ISR技术对于许多计算机视觉和图像处理任务都是至关重要的,如图像重建、监视、医学图像处理等。

一、OpenCV安装

pip install opencv-python -i https://mirror.baidu.com/pypi/simple
pip install opencv-contrib-python -i https://mirror.baidu.com/pypi/simple

二、模型下载

⭐ 注意的是模型的加载需要使用到cv2.dnn_superres函数,而此函数存在于OpenCV4.4以上以及。
OpenCV代码库目前仅支持4种不同的超分辨率模型:

EDSR

  • EDSR(2017 CVPR NTIRE2017超分辨率挑战赛冠军)
    • 优点高精度
    • 缺点:模型文件大且运行速度慢
    • 模型参数:提供x2,x3,x4训练模型
    • 模型下载EDSR_Tensorflow
    • 论文:Enhanced Deep Residual Networks for Single Image Super-Resolution
    • Pytorch Code:EDSR-PyTorch

ESPCN

  • ESPCN(2016 CVPR)
    • 优点:体积小,速度快,并且仍然表现良好;它可以进行对视频进行实时处理(取决于图像大小)
    • 缺点:与更新的、更健壮的模型相比,在视觉上表现更差
    • 模型参数:提供x2,x3,x4训练模型
    • 模型下载TF-ESPCN
    • 论文:Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network

FSRCNN

  • FSRCNN(2016 ECCV)
    • 优点:快速,小巧;可以进行实时视频升频
    • 缺点:不够准确
    • 模型参数:提供x2,x3,x4训练模型和small训练模型
    • 模型下载FSRCNN_Tensorflow
    • 论文:Accelerating the Super-Resolution Convolutional Neural Network

LapSRN

  • LapSRN(2017 CVPR)
    • 优点:该模型可以通过一次向前传递进行多尺度超分辨率,可以支持2x,4x,8x和[2x,4x]和[2x,4x,8x]超分辨率
    • 缺点:它比ESPCN和FSRCNN慢,并且精度比EDSR差
    • 模型参数:提供x2,x4,x8训练模型
    • 模型下载TF-LAPSRN
    • 论文:Deep laplacian pyramid networks for fast and accurate super-resolution
    • Pytorch Code:pytorch-LapSRN

总结:实践应用最广泛的是EDSR模型,其精度高,但推理速度太慢,所以2倍放大和4倍放大可以考虑使用ESPCN代替,4倍和8倍放大可以考虑使用LapSRN。当然超分放大需要高性能运算,还是用高性能显卡运算较为合适。注意的是OpenCV的dnn_superres模块不适用移动端设备嵌入式设备,因为OpenCV对设备性能有一定要求。所以移动端可以参考ncnn的超分放大实现。

三、代码实现

import cv2
from cv2 import dnn_superres

def upscale(img, alg_name, scale):
    # Create an SR object
    sr = cv2.dnn_superres.DnnSuperResImpl_create()
    # Read the desired model
    path = f"./model/{alg_name}_x{scale}.pb"
    sr.readModel(path)
    # Set the desired model and scale to get correct pre- and post-processing
    sr.setModel(alg_name,scale)
    # Upscale the image
    result = sr.upsample(img)
    return result

if __name__ == '__main__':
	img = cv2.imread(path_to_image)
	# 使用LapSRN x4模型
	res = upscale(img=img, alg_name='lapsrn', scale=4)
	cv2.imshow('result', res)
	cv2.waitKey(0)

四、超分算法效果评估

通过PSNR(峰值信噪比)和SSIM(结构相似性)来评估图像放大后的效果,PSNR越大,图像失真越小。SSIM也是越大,图像失真越小。PSNR和SSIM介绍见博客:【图像评价指标】PSNR和SSIM

  • OpenCV官方文档给了基础测试结果:
    • 2倍超分放大
      opencv处理图片清晰度,OpenCV实战笔记,opencv,人工智能,计算机视觉
    • 3倍超分放大
      opencv处理图片清晰度,OpenCV实战笔记,opencv,人工智能,计算机视觉
    • 4倍超分放大
      opencv处理图片清晰度,OpenCV实战笔记,opencv,人工智能,计算机视觉

Python代码

算法评估Python代码如下:

import cv2


def upscale(img, alg_name, scale):
    # Create an SR object
    sr = cv2.dnn_superres.DnnSuperResImpl_create()
    # Read the desired model
    path = f"./models/{alg_name}_x{scale}.pb"
    sr.readModel(path)
    # Set the desired model and scale to get correct pre- and post-processing
    sr.setModel(alg_name, scale)
    # Upscale the image
    result = sr.upsample(img)
    return result


def getQualityValues(upsampled, orig):
    psnr = cv2.PSNR(upsampled, orig)
    q, _ = cv2.quality.QualitySSIM_compute(upsampled, orig)
    ssim = (q[0] + q[1] + q[2]) / 3
    return round(psnr, 3), round(ssim, 3)


if __name__ == "__main__":
    # 图片路径
    img_path = "./data/images/1.jpg"
    # 算法名称 edsr, espcn, fsrcnn or lapsrn
    algorithm = "lapsrn"
    # 放大系数
    scale = 4
    # 模型路径,根据算法确定
    model = f"./model/{algorithm}_x{scale}.pb"
    # 裁剪图像,使图像对齐
    img = cv2.imread(img_path)
    width = img.shape[0] - (img.shape[0] % scale)
    height = img.shape[1] - (img.shape[1] % scale)
    cropped = img[0:width, 0:height]
    # Downscale the image for benchmarking
    # 缩小图像,以实现基准质量测试
    img_downscaled = cv2.resize(cropped, None, fx=1.0 / scale, fy=1.0 / scale)
    img_new = upscale(img_downscaled, algorithm, scale)
    # 获得模型质量评估值
    psnr, ssim = getQualityValues(cropped, img_new)
    print("=" * 30)
    print(f"{algorithm}_x{scale}\nPSNT:{psnr}, SSIM:{ssim}")
    print("=" * 30)
    # INTER_CUBIC - 三次样条插值放大图像
    bicubic = cv2.resize(img_downscaled, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC)
    psnr, ssim = getQualityValues(cropped, bicubic)
    print(f"三次样条插值\nPSNT:{psnr}, SSIM:{ssim}")
    print("=" * 30)
    # INTER_NEAREST - 最近邻插值
    nearest = cv2.resize(img_downscaled, None, fx=scale, fy=scale, interpolation=cv2.INTER_NEAREST)
    psnr, ssim = getQualityValues(cropped, nearest)
    print(f"最近邻插值\nPSNT:{psnr}, SSIM:{ssim}")
    print("=" * 30)
    # Lanczos插值
    lanczos = cv2.resize(img_downscaled, None, fx=scale, fy=scale, interpolation=cv2.INTER_LANCZOS4);
    psnr, ssim = getQualityValues(cropped, lanczos)
    print(f"Lanczos插值\nPSNT:{psnr}, SSIM:{ssim}")
    print("=" * 30)

五、相关超分辨率算法

WDSR

2018 NTIRE超分辨率冠军

  • 论文解析
  • Pytorch Code:wdsr_ntire2018

RCAN

ECCV2018超分冠军方案,EDSR的改进,加入通道注意力

  • 论文:Image Super-Resolution Using Very Deep Residual Channel Attention Networks
  • Pytorch Code:RCAN

SAN

CVPR2019,RCAN的改进,使用二阶注意力文章来源地址https://www.toymoban.com/news/detail-788660.html

  • 论文:Second-Order Attention Network for Single Image Super-Resolution
  • Pytorch Code:SAN

ESRT(CVPR 2022)

  • 论文:Transformer for Single Image Super-Resolution
  • Pytorch Code:ESRT

到了这里,关于OpenCV实战之一 | 使用OpenCV进行图像超分辨率的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 目标检测项目中面对高分辨率图像的滑动窗口技术(一)(代码开源,超简便API封装,直接调用进行切图及保存)

    目录 一、技术背景 二、解决方法介绍:滑动窗口切图、随机中心点切图 三、程序代码 四、使用文档 一、技术背景         在目标检测项目中,面对高分辨率、小目标的图片数据(如航拍图片数据),若对图片直接resize到模型合适的大小,会损失大量信息,模型无法学到信

    2024年02月06日
    浏览(27)
  • 【Python&图像超分】Real-ESRGAN图像超分模型(超分辨率重建)详细安装和使用教程

            图像超分是一种图像处理技术,旨在 提高图像的分辨率 ,使其具有更高的清晰度和细节。这一技术通常用于图像重建、图像恢复、图像增强等领域,可以帮助我们更好地理解和利用图像信息。图像超分技术可以通过多种方法实现,包括插值算法、深度学习等。其

    2024年02月04日
    浏览(35)
  • 图像超分辨率重建概述

    1. 概念:         图像分辨率是一组用于评估图像中蕴含细节信息丰富程度的性能参数,包括时间分辨率、空间分辨率及色阶分辨率等,体现了成像系统实际所能反映物体细节信息的能力。相较于低分辨率图像,高分辨率图像通常包含更大的像素密度、更丰富的纹理细节及更

    2024年02月04日
    浏览(37)
  • 图像超分辨率简单介绍

    图像超分辨率(Image Super-Resolution,简称SR)是一种通过使用计算机算法提高图像分辨率的技术,即从低分辨率的图像中生成高分辨率的图像。图像SR可以在许多领域得到应用,例如计算机视觉、医学成像、遥感等。 图像SR旨在从低分辨率(低清晰度)图像中提高图像质量和信

    2024年02月06日
    浏览(29)
  • 解决OpenCV使用USB摄像头获取高分辨率视频低帧率、卡、果冻画面的问题

    最近制作移动设备,需要安置多个usb摄像头到电脑,踩了几个坑,记录一下解决方案。 不能使用分线器插多个usb摄像头,同一时间只能加载一个。 usb摄像头调高分辨率时,非常卡顿,视频画面像果冻一样,及不流畅 第二个情况具体描述: 摄像头支持1920*1080  60fps,opencv在

    2024年02月16日
    浏览(51)
  • ISP之图像降分辨率

    1、图像缩放背景 图像的放大、缩小(简称缩放)是图像处理的一种处理方法。所谓图像缩放是指图像分辨率的改变,它在图像显示、传输、图像分析以及动画制作、电影合成、甚至医学图像处理中都有着相当广泛的应用。比如要在1024 X 768 分辨率的显示器上全屏显示800 X 600 的数

    2024年02月11日
    浏览(31)
  • 图像超分辨率重建(pytorch)

             本文代码主体来自CVPR2020论文《Closed-loop matters: Dual regression networks for single image super-resolution》,但原作者并未提供论文亮点--如何使用unpair数据进行训练的代码,所以我在其基础上补齐了该过程的代码。         代码仓库:https://github.com/VitaminyW/Super_Solution      

    2024年01月16日
    浏览(28)
  • ​目标检测算法——YOLOv5/YOLOv7改进之结合​SOCA(单幅图像超分辨率) CVPR19 单幅图像超分辨率来了!!!

    (一)前沿介绍 论文题目:Second-order Attention Network for Single Image Super-Resolution 论文地址:CVPR19 超分辨率 代码地址:https://github.com/daitao/SAN 1.SOCA moudle结构图 2.相关实验结果 (二)YOLOv5/YOLOv7改进之结合​SOCA 1.配置common.py文件 2.配置yolo.py文件 3.配置yolov5/yolov7_SOCA moudle.yaml文件

    2023年04月23日
    浏览(33)
  • 【图像超分辨率重建】——HAT论文精读笔记

    作者: Xiangyu Chen, Xintao Wang, Jiantao Zhou, and Chao Dong 期刊: 引用: 摘要: 基于 Transformer 的方法在图像超分辨率等低级视觉任务中表现出令人印象深刻的性能。然而,我们发现这些网络只能通过归因分析利用有限空间范围的输入信息。这意味着 Transformer 的潜力在现有网络中仍未

    2024年02月08日
    浏览(43)
  • 【图像超分辨率重建】——GRL论文精读笔记

    作者: Yawei Li1 Yuchen Fan2 Xiaoyu Xiang2 Denis Demandolx2 Rakesh Ranjan2 Radu Timofte1;3 Luc Van Gool1;4 期刊: CVPR 引用: * 摘要: 本文的目的是提出一种机制,在全局、区域和局部范围内有效和明确地建立图像层次模型,用于图像修复。为了实现这一目标,我们首先分析了自然图像的两个重要

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包