简单图像处理——旋转、缩放、保存

2023-11-01

简单图片处理

一、实验要求

对任意一幅图片分别设计以下两个功能函数:
1)任意放大或缩少多少倍。显示图片,存储图片。
2)对图片实现任意的旋转。显示图片,存储图片。
并调用上面两个函数,测试实现放大2倍和旋转45度。

二、实验准备

  1. opencv库:opencv-python,该库使用import cv2命令导入python程序。cv2.resize命令可以实现图片的放大缩小。
    cv2.resize中的interpolation - 插值方法介绍:
    1)INTER_NEAREST - 最近邻插值法(Nearest Interpolation)
    最近邻插值也称近端插值,是一种在一维或多维空间上进行多变元插值的简单方法。插值是一种通过已知的、离散的数据点,在范围内推求新数据点的过程或方法。最近邻插值算法选择距离所求数据点最近点的值,并且根本不考虑其他相邻点的值,从而产生一个分段常数的内插值来作为所求数据点的值。原理图如下。
    在这里插入图片描述

2)INTER_LINEAR - 双线性插值法(默认)
双线性插值算法也是resize函数中默认使用的插值算法。双线性插值,也被称为双线性内插。双线插值是对线性插值在二维坐标系上的扩展,用于对双变量函数进行插值,其核心思想是在两个方向上分别进行一次线性插值。
3)INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
区域插值算法主要分两种情况,缩小图像和放大图像的工作原理并不相同。如果图像缩小的比例是整数倍,在调用INTER_LINEAR_EXACT插值算法时,如果图像的宽和高的缩小比例都是2,而且图像的通道数不是2,实际上会调用INTER_AREA。在调用INTER_LINEAR时,如果图像的宽和高的缩小比例都是2,实际上是会调用INTER_AREA。INTER_AREA实际上是个box filter,类似于均值滤波器。如果放大图像的比例是整数倍,与最近邻插值相似。如果放大的比例不是整数倍,则会采用线性插值。
4)INTER_CUBIC - 基于4x4像素邻域的3次插值法
双三次插值又称立方卷积插值,它是一种更加复杂的插值方式。该算法利用待采样点周围16个点的灰度值作三次插值,不仅考虑到4个直接相邻点的灰度影响,而且考虑到各邻点间灰度值变化率的影响。三次运算可以得到更接近高分辨率图像的放大效果,但也导致了运算量的急剧增加。这种算法需要选取适当的插值基函数来拟合数据。
5)INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值
通常根据确定参与计算的像素权重的方式来分类各种图像interpolation algorithm。Lanczos算法用到的数学公式如下:
简言之,我们使用lanczos算法的主要作用就是由其确定各个参与计算的像素值的权重。
2. imutils库:在opencv基础上对一些方法进行了再次加工,使这些方法更加简单易用,安装该包依赖于NumPy、Opencv和matplotlib。该库中旋转功能操作为imutils.rotate_bound。

三、实验代码分析

1.图片缩放函数,包含对图片的放大和缩小功能,显示图片并存图片,代码如下:

#图片缩放函数
def Changesize(road,orf_name,sav_name,mulp): 
    image = cv2.imread(road+'\\'+orf_name) #读取显示图片
    cv2.imshow(orf_name,image)
    cv2.waitKey() #回车继续
    x,y = image.shape[0:2]#读取大小
    # 开始放缩
    image = cv2.resize(image,(int(y*mulp),int(x*mulp)),interpolation=cv2.INTER_LINEAR)   #双线性插值法(默认)
    cv2.imshow(sav_name,image) # 显示放缩结果
    #保存图片
    cv2.imwrite(road+'\\'+sav_name,image)
    cv2.waitKey() #回车继续
    cv2.destroyAllWindows()

2.图片旋转函数,包含对图片的旋转,显示并存储图片,代码如下:

#图片旋转函数
def Rotate(road,orf_name,sav_name,angle):
    image = cv2.imread(road+'\\'+orf_name) #读取显示图片
    cv2.imshow(orf_name,image)
    cv2.waitKey()
    #旋转图片
    image = imt.rotate_bound(image,angle)  
    cv2.imshow(sav_name,image)# 显示旋转图片
    cv2.waitKey()
    #保存图片
    cv2.imwrite(road+'\\'+sav_name,image)
    cv2.destroyAllWindows()

3.主函数:

if __name__ == "__main__":   
    small = 0.6   #缩小倍数    
    big = 2       #放大倍数    
    angle = 45    #旋转角度    
    pic_name = 'sy4.jpg'        #图片名   
    pic_road = 'D:\Python3.9\py_ex4'   #存放路径    
    Changesize(pic_road,pic_name,'Small.jpg',small) #缩小    
    Changesize(pic_road,pic_name,'Big.jpg',big)     #放大    
    Rotate(pic_road,pic_name,'Rotate.jpg',angle)    #旋转

4.导入库:

import cv2
import imutils as imt
import numpy as np

四、实验结果

1.图片的放大及缩小后的结果
(1)缩小0.6倍(其中“sy4.jpg”为原图,“Small.jpg”为缩小后的图片)在这里插入图片描述
(2)放大2倍(其中“sy4.jpg”为原图,“Big.jpg”为放大后的图片)在这里插入图片描述
2.图片旋转 45°(其中“sy4.jpg”为原图,“Rotate.jpg”为旋转后的图片)在这里插入图片描述
3.图片存储结果
在相应的存储目录下找到到已经经过缩小、放大和旋转的图片,如下如所示。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单图像处理——旋转、缩放、保存 的相关文章

随机推荐

  • 【VHDL】计数器实现2-4-8分频

    计数器实现2 4 8分频 分频器 对较高频率的信号进行分频 得到较低频率的信号 本质是计数器 类似于2 4 8分频的问题有以下两个特点 一 二的指数倍 二 占空比为50 一般的解决方式 定义一个数据 按照标准逻辑位计数 对其最低位 低位 次
  • 数据截断的一个例子

    下面看一个例子 include
  • SpringBoot集成Redisson

    依赖包
  • 深入浅出AXI协议(2)——通道及信号

    一 前言 在之前的文章中 我们主要介绍了什么是AXI协议 AXI协议的特点与优点 然后对于AXI协议非常重要的五通道结构进行了介绍 了解了5个通道各自的作用 本文我们继续AXI协议的学习 我们将讨论5个通道的具体内容和相对应的信号 这一部分
  • YOLOX代码、预测(使用摄像头实时预测)及其添加SE注意力前后的实验结果

    1 代码获取 https github com Le0v1n ml code tree main ObjectDetection YOLOX 如果代码对你有用 请star一下 2 预测 2 1 图片预测 下载权值文件 https githu
  • SprongBoot项目整合Druid实现数据监控功能

    web程序普遍的都会涉及到数据库的操作 为了提高系统的性能 在数据库操作上 几乎千篇一律的使用了数据库连接池技术 数据库连接池有很多选择 c3p dhcp proxool等 druid作为一名后起之秀 凭借其出色的性能 也逐渐印入了大家的眼
  • 服务器网页500错误修复工具,HTTP500错误是什么?如何修复

    500 Internal Server Error是一个非常普通的HTTP状态代码 表示网站的服务器出了点问题 但是服务器不能更准确地说明的问题是什么 您可以通过以下几种常见方式来查看HTTP 500错误 500内部服务器错误 HTTP 5
  • Seaborn中文教程

    Seaborn介绍 Seaborn属于Matplotlib的一个高级接口 为我们进行数据的可视化分析提供了极大的方便 博主是为了入门Kaggle比赛而学习的Seaborn 下面是博主的学习过程 希望可以和大家一起分享 Step 1 安装Se
  • 和月薪5W的阿里程序员聊过后,才知道自己一直在打杂...

    前几天和一个朋友聊面试 他说上个月同时拿到了腾讯和阿里的offer 最后选择了阿里 阿里内部将员工一共分为了14个等级 P6是资深工程师 P7是技术专家 其中P6和P7就是一个分水岭了 P6是最接近P7的不持股员工 P7开始就是持股员工 由
  • vue 使用播放器插件 vue-video-player

    1 安装 cnpm install save vue video player 2 在main js入口文件中引入 import VideoPlayer from vue video player require video js dist
  • 生成timeuuid_UUID生成唯一的16位随机数

    Copyright c 2003 2011 Oracle and or its affiliates All rights reserved packagejava util import java security A class tha
  • 【Windows】Word文档中的Endnote“乱码”

    打开一个Word文档 发现文中用Endnote插入的参考文献全部都乱了 最后找到了症结所在 快捷键 Alt F9 OK了
  • 在telnet下操作memcache详解(操作命令详解)

    在定位问题 测试等时候经常需要对memcache的数据进行一些操作 但是其本身没有自带的客户端 所以只能通过telnet来进行操作 通过telnet连接memcache 复制代码代码如下 telnet 127 0 0 1 11211 mem
  • 使用vim编写C/C++程序

    一 准备工作 1 安装vim 已安装则忽略 sudo apt get install vim 2 安装C的编译器gcc和C 的编译器g 已安装则忽略 sudo apt get install gcc sudo apt get install
  • 用pyhtml2pdf(python)包自动从html生成pdf

    用pyhtml2pdf python 包自动从html生成pdf 1 pyhtml2pdf的使用 代码示例 运行代码需要先安装拓展库 pip install pyhtml2pdf 更多详情 请参见官网 https www cnpython
  • 这些自动化测试框架知识你还不知道?

    这些自动化测试框架知识你还不知道 无论是在自动化测试实践 还是日常交流中 经常听到一个词 框架 之前学习自动化测试的过程中 一直对 框架 这个词知其然不知其所以然 最近看了很多自动化相关的资料 加上自己的一些实践 算是对 框架 有了一些理解
  • android动态刷新主页,Android手把手教大家制作APP首页(下拉刷新、自动加载)

    一 概述 作为一名三年Android开发经验的程序员 今天和大家一起实战一款APP的首页功能 这个首页在我们平时接触中还是很常见的 虽然页面简单 但是里面涉及的功能点还是挺多的 代码如有不足的还望各路同仁指点一二 页面中使用的开发库 整个首
  • 多元线性回归-最小二乘法 最大似然估计

    一 引言 设随机变量 y y y与一般变量 x 1 x 2
  • 【程序】【必须】PID位置环控制,代码+调参

    前面两篇博文已经实现了电机测速和PID速度环控制 在这篇博文中 我们主要说明位置环的代码怎么写以及PID参数怎么调 1 位置环代码实现 写完速度环后位置环就很简单了 在串级PID中 内环的控制量一般是外环控制量的微分 在我们这里 外环是控制
  • 简单图像处理——旋转、缩放、保存

    简单图片处理 一 实验要求 对任意一幅图片分别设计以下两个功能函数 1 任意放大或缩少多少倍 显示图片 存储图片 2 对图片实现任意的旋转 显示图片 存储图片 并调用上面两个函数 测试实现放大2倍和旋转45度 二 实验准备 opencv库