使用Python,OpenCV缩放照片(忽略宽高比,保持宽高比)

  • 1. 效果图
    • 1.1 保持宽高比效果图
    • 1.2 忽略宽高比效果图
    • 1.3 opencv各插值效果图
  • 2. 原理
  • 3. 源码
  • 参考

这篇博客将介绍如何使用OpenCV调整图像大小。

调整图像的大小:缩小图像大小更有利一些(而且视觉上更吸引人一些),需要从图像中移除像素。增加图像的大小,则需要在其间“填补”不存在的像素值。

虽然高分辨率图像在视觉上对人眼有吸引力,但它们会损害计算机视觉和图像处理管道处理。

  • 根据定义,图像越大,数据越多,因此算法处理数据的时间也就越长。
  • 高分辨率图像非常详细,但从计算机视觉/图像处理的角度来看,我们更感兴趣的是图像的结构成分,而不是超细粒度的细节。大分辨率的图像几乎都是下采样的,以帮助图像处理系统运行更快,更准确。

1. 效果图

1.1 保持宽高比效果图

原图 VS 缩小为1/2图 VS 放大2倍图效果图如下:

1.2 忽略宽高比效果图

可以看出保持宽高比的缩放使得图片看起来比较规整,忽略图像的宽高比会使调整后的图像看起来像被压缩、扭曲或者挤压。

1.3 opencv各插值效果图

原图 VS cv2.INTER_NEAREST效果图如下,有块状的伪影

原图 VS cv2.INTER_LINEAR效果图如下:块状的伪影消失,图像看起来更平滑

原图 VS cv2.INTER_AREA效果图如下,块状的瑕疵又回来了

原图 VS cv2.INTER_CUBIC效果图如下,三次插值进一步消除了块状伪影

原图 VS cv2.INTER_LANCZOS4效果图如下,基本同cv2.INTER_CUBIC

2. 原理

  • cv2.resize(忽略宽高比)
  • imutils.resize(保持宽高比)
  • OpenCV中提供的插值方法(在需要对图像进行下采样或上采样时非常有用)

3. 源码

# USAGE
# python opencv_resize.py# 导入必要的包
import argparseimport cv2
# 构建命令行参数及解析
# --image 输入图像的路径
import imutilsap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, default="ymzyt.jpg",help="path to the input image")
args = vars(ap.parse_args())# 加载原始图像并展示
image = cv2.imread(args["image"])
image = imutils.resize(image, width=400)
cv2.imshow("Original", image)
width = image.shape[1]
cv2.imshow("ratio 1/2", imutils.resize(image, width=int(width / 2)))
cv2.imshow("ratio 2", imutils.resize(image, width=width * 2))
cv2.waitKey(0)cv2.imshow("Original", image)
width = image.shape[1]
height = image.shape[0]
cv2.imshow("no ratio 1/2", cv2.resize(image, (int(width / 2), int(height / 1)), interpolation=cv2.INTER_AREA))
cv2.imshow("no ratio 2", cv2.resize(image, (width * 2, height * 3), interpolation=cv2.INTER_AREA))
cv2.waitKey(0)# 缩放图像为宽度200px,但是为了防止图像被挤压及扭曲,首先计算宽高比
r = 200.0 / image.shape[1]
dim = (200, int(image.shape[0] * r))# 调整图像大小
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
cv2.imshow("Resized (Width)", resized)# 保持宽高比的缩放高度为100px
r = 100.0 / image.shape[0]
dim = (int(image.shape[1] * r), 100)# 执行缩放
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
cv2.imshow("Resized (Height)", resized)
cv2.waitKey(0)# 每次缩放图像时都自动计算宽高比,并保持宽高比的缩放图像
resized = imutils.resize(image, width=200)
cv2.imshow("Resized via imutils", resized)
cv2.waitKey(0)resized = imutils.resize(image, height=75)# 插值函数的目标是检查像素的邻域,并使用这些邻域在不引入失真(或至少尽可能少的失真)的情况下光学地增大或减小图像的大小。
# - cv2.INTER_NEAREST 最近邻插值法,OpenCV默认执行该方法,它执行双线性插值-斜率截距形式;
# - cv2.INTER_AREA 最简单的插值方法,找到“最近的”像素并假设其值。该方法不需要计算相邻像素的加权平均值或应用复杂的规则,虽然这种方法快速简单,但调整大小后的图像质量往往相对较差,并可能导致“块状”伪影。# 这俩种方法速度较慢(它们不再使用简单的线性插值,而是使用样条曲线),并且在正方形像素邻域上使用双三次插值。
# - cv2.INTER_CUBIC 计算4 x 4邻居
# - cv2.INTER_LANCZOS4 计算8 x 8邻居,很少见,# 构建OpenCV中的插值方法List
methods = [("cv2.INTER_NEAREST", cv2.INTER_NEAREST),  # 有块状的伪影("cv2.INTER_LINEAR", cv2.INTER_LINEAR),  # 块状的伪影消失,图像看起来更平滑("cv2.INTER_AREA", cv2.INTER_AREA),  # 块状的瑕疵又回来了("cv2.INTER_CUBIC", cv2.INTER_CUBIC),  # 三次插值进一步消除了块状伪影("cv2.INTER_LANCZOS4", cv2.INTER_LANCZOS4)]  # 基本同cv2.INTER_CUBIC# 遍历插值方法
for (name, method) in methods:# 上采样,使用当前插值方法,放大图片3倍print("[INFO] {}".format(name))resized = imutils.resize(image, width=image.shape[1] * 2,inter=method)cv2.imshow("Method: {}".format(name), resized)cv2.waitKey(0)
cv2.destroyAllWindows()

参考

  • https://www.pyimagesearch.com/2021/01/20/opencv-resize-image-cv2-resize/

使用Python,OpenCV缩放照片(忽略宽高比,保持宽高比)相关推荐

  1. 使用Python+OpenCV将照片变成卡通照片

    正如你可能知道的,素描或创建一个卡通并不总是需要手动完成.如今,许多应用程序可以把你的照片变成卡通照片.但是如果我告诉你,你可以用几行代码创造属于自己的效果呢? 有一个名为OpenCV的库,它为计算机 ...

  2. Python + OpenCV 太好玩了,可惜你可能还不会

    这些年,你可能看过很多这样的新闻: "用 Python + OpenCV 把照片变成油画--" "Python + OpenCV 实现自动扫雷,挑战世界记录--" ...

  3. python opencv图片放大 缩小_Python OpenCV之图片缩放的实现(cv2.resize)

    OpenCV函数原型: cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation) 参数解释: InputArra ...

  4. Python OpenCV:利用滚动条移动图片,利用鼠标缩放图片

    Python OpenCV:利用滚动条移动图片,利用鼠标缩放图片 一.实现目标 二.实现背景 三.实现方法 四.运行环境 五.运行代码 六.运行结果 七.不足 八.参考 一.实现目标   在OpenC ...

  5. python使用opencv换照片底色

    第一次使用opencv,遇到了很多问题,记录一下 安装问题 代理 由于pip使用了代理而电脑代理没开,导致pip install opencv-python时一直报错连接不上代理 解决办法: 使用pi ...

  6. python换照片底色_Python 利用OpenCV给照片换底色的示例代码

    OpenCV的全称是:Open Source Computer Vision Library.OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和M ...

  7. python opencv 得到图片路径image_path的宽wide、高heigh和深度deep

    python opencv 得到图片路径image_path的宽wide.高heigh和深度deep 图片路径是:'1.jpg' 下面是具体代码: import cv2 #得到图片路径image_pa ...

  8. python opencv 等比例调整(缩放)图片分辨率大小代码 cv2.resize()

    # -*- coding: utf-8 -*- """ @File : 200113_等比例调整图像分辨率大小.py @Time : 2020/1/13 13:38 @A ...

  9. python opencv 如何获取图像的尺寸(宽高)(分辨率)(大小)img.shape

    示例,获取文件夹中一张名为IMG_20200403_203742.jpg图片的分辨率 # -*- coding: utf-8 -*- """ @File : 如何获取图像 ...

最新文章

  1. ASP.NET MVC 3 Razor 多国语言参考解决方案 补充四
  2. Netbeans and Remote Host for C/C++ Developing
  3. mysql查询特定时间数据视频_mysql查询特定时间段内的数据
  4. 深度学习机器配置 装机指南:从GPU到显示器,全套硬件推荐
  5. C++尽量以const,enum,inline替换#define
  6. 笔记-JavaWeb学习之旅2
  7. 八数码c语言编程深度搜索,广度优先搜索解 八数码, 求意见, 求bug/
  8. 二叉树类型笔试面试题大总结(含代码)
  9. 圆上的定理 —— 圆周角定理与相交弦定理
  10. mac homebrew安装php5.3,mac mini brew安装了php54,但是我的工作php还是5.3.15?
  11. 现代软件工程—构建之法---第四章:练习与讨论
  12. Git基本操作(学习笔记)
  13. 效率篇-定时任务管理系统,替代crontab
  14. 什么是UNIX时间戳? 时间戳有什么用?
  15. Android NDK jni开发,适当的给Android 代码加密
  16. mysql count(*)使用索引和成本计算
  17. 广州融媒体峰会现场直播中,BirdDog Full NDI应用有哪些优点?难点?如何解决?
  18. 自己定义ViewGroup实现仿淘宝的商品详情页
  19. 而今迈步从头越|nacos逼我在mac上重新安装java8与环境变量的配置
  20. PDF加密文件的解密和打印

热门文章

  1. Python:正则表达式re模块
  2. php mongodb execute,php简单操作mongodb
  3. linux文件移出目录命令_Linux 文件与目录管理详解
  4. python 正则表达式贪婪模式与非贪婪模式
  5. 使用spring initializr ( 4.快速创建springboot工程 )(入门结束)
  6. git服务器搭建问题
  7. 音频编辑大师 3.3 注冊名 注冊码
  8. Unity3D 中 2D_Toolkit插件下载 和 导入方法
  9. UVa 10051 Tower of Cubes(类似LIS)
  10. EF-Entity Framework 相关技术点收集贴