当前位置: 首页 > news >正文

图像基本变换

缩放与裁剪

裁剪

图像的裁剪,是指将图像的某个区域切割出来。

一些常见的应用场景包括:

* 感兴趣区域提取

* 去除无用信息

* 图像增强

* 纠偏:去除不规则部分,将图像变得更加整齐

事实上,图像裁剪的裁剪通常就是一个numpy矩阵切片的过程。

其中的关键内容在于,获取目标区域的坐标。

给定一个512*512的lena图像,想要裁剪出以原图中心点为中心的,320*320的图像,代码如下所示:

import cv2
import matplotlib.pyplot as pltimg = cv2.imread('./dataset/lena.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.axis('off')
plt.show()
# numpy切片
h, w = img.shape[:2]
cropped_img = img[h // 2 - 160: h // 2 + 160, w // 2 - 160: w // 2 + 160, :]
plt.imshow(cropped_img)
plt.show()#PIL库
from PIL import Image
cropped_img = img.crop((512 // 2 - 320 // 2, 512 // 2 - 320 // 2,  # 左上角坐标512 // 2 + 320 // 2, 512 // 2 + 320 // 2)) # 右下角坐标
plt.imshow(cropped_img)
plt.show()

缩放

cv2.resize(img, dsize=(, ), interpolation=cv2.INTER_AREA)

在resize函数的参数中,第一个参数为待缩放图片,第二个参数为缩放后的尺寸。

第三个参数为插值方法,共包括:

* cv2.INTER_NEAREST:最近邻插值。

* cv2.INTER_LINEAR:双线性插值。

* cv2.INTER_CUBIC:双立方插值。

* cv2.INTER_AREA:区域插值。

* cv2.INTER_LANCZOS4:Lanczos插值

以上插值方法特点不同,下面展示其中区别

img = cv2.imread('./dataset/lena.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
resized_img_1 = cv2.resize(img, dsize=(256, 384), interpolation=cv2.INTER_AREA)
plt.imshow(resized_img_1)
plt.show()

插值

* 最近邻插值: 源图像中距离新像素位置最近的像素赋值给新像素。

* 例如,图像缩放了fx和fy倍,那么新图像中的像素坐标$x', y'$对应原图坐标为$f_xx, f_yy$

* 优点:速度快

* 缺点:未考虑周围像素,锯齿严重

* 双线性插值:从周围四个像素共同加权计算像素值,距离越近权重越大,距离越远权重越小

* 优点:平滑

* 速度慢

大部分使用

* 双立方插值:新图像的每个点,都参考了周围16个点的信息

* 两个基本步骤:

- 计算周围16个点的像素值

- 拟合函数计算最终像素值

* 优点:保留图像细节信息

* 缺点:计算量大,耗时长

* 区域重采样:按区域计算新像素

* 每个像素都选取一个固定大小的区域

* 每个区域通过一定算法计算一个新的像素值

* 优点:保真,不易出现伪影

* lanczos:造了一个核函数,计算新像素

* 优点:更加平滑的采样结果

* 缺点:计算成本高

其中,a为核半径,在目标像素的a范围内,通过公式计算新的像素值。

target_img = img[240: 272, 240: 272, :]
# plt.imshow(target_img)
# plt.show()nearest = cv2.resize(target_img, (768, 768), interpolation=cv2.INTER_NEAREST)
linear = cv2.resize(target_img, (768, 768), interpolation=cv2.INTER_LINEAR)
cubic = cv2.resize(target_img, (768, 768), interpolation=cv2.INTER_CUBIC)
area = cv2.resize(target_img, (768, 768), interpolation=cv2.INTER_AREA)
lanczos = cv2.resize(target_img, (768, 768), interpolation=cv2.INTER_LANCZOS4)
fig, ax = plt.subplots(nrows=1, ncols=5, figsize=(12,12))
print(ax)
ax[0].imshow(nearest)
ax[1].imshow(linear)
ax[2].imshow(cubic)
ax[3].imshow(area)
ax[4].imshow(lanczos)ax[0].axis('off')
ax[1].axis('off')
ax[2].axis('off')
ax[3].axis('off')
ax[4].axis('off')plt.show()

仿射变换和透视变换

1. 仿射变换

https://blog.csdn.net/weixin_51571728/article/details/124434728

对于二维平面来说,仿射变换就是将一个点,通过**线性变换**映射到另一个二维平面中的点。

平行原则:原来是平行线,仿射后也是平行线

直线原则:原来是直线,仿射以后也是直线

与之相对的,**非线形变换**不是仿射变换,因为其不满足仿射变换的线性性质。

一个典型的非仿射变换为透视变换

对于矩阵来说,仿射变换的结果,可以表示为矩阵的乘积

仿射变换通常包含以下几种操作

* 平移:沿着x,y方向移动图像

* 旋转:围绕中心点旋转图像

* 缩放:缩放到指定大小

* 错切:在平面上将图像斜切一定角度

仿射变换可用于图像对齐、图像矫正、图像增强等。

图像旋转

图像旋转是一种特殊的仿射变换

PIL中,图像旋转有专用的函数接口img.rotate(角度,center=[ , ]),示例如下:

import PIL.Image as Image
import matplotlib.pyplot as pltimg = Image.open('E:/notebook/3c.png')
# 绕中心点逆时针转45度
rotated_img = img.rotate(45, center=[img.width // 2, img.height // 2])
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2)
ax1.imshow(img)
ax2.imshow(rotated_img)
ax1.axis('off')
ax2.axis('off')
plt.show()

OpenCV提供了更加便捷灵活的函数方法:

首先,通过指定的中心和旋转角度,定义旋转矩阵:cv2.getRotationMatrix2D((旋转中心), 角度, 缩放比例)

其次,根据旋转矩阵,进行仿射变换,实现旋转:cv2.warpAffine(img, 旋转矩阵, (运算后矩阵的大小也就是输出图片的尺寸) )https://blog.csdn.net/m0_51545690/article/details/123959995

import cv2
img = cv2.imread('E:/notebook/3c.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
M = cv2.getRotationMatrix2D((img.shape[0] // 2, img.shape[1] // 2), 45, 1)
# print(M) # 旋转矩阵
#[[   0.70710678    0.70710678 -102.64170235]
# [  -0.70710678    0.70710678  208.20101013]]
# # 得到矩阵后得用到图像的仿射变换函数才可以进行最终图像的变化
rotate_img = cv2.warpAffine(img, M, (512,512))
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2)
ax1.imshow(img)
ax2.imshow(rotate_img)
ax1.axis('off')
ax2.axis('off')
plt.show()

不依赖第三方库,将一个图像按照中心点,缩小为原面积的四分之一。

import cv2
img = cv2.imread('E:/notebook/lena.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
def resize(image):# image是读取用opencv读取完毕的numpy矩阵# 输出为仿射变换后的矩阵,注意要将其转化为适合图像的数据类型# 此处撰写代码M = np.array([[.5, 0, 0],[0, .5, 0]])# 首先,将图像的平面坐标扩展出一个1,可直接相乘img_matrix = np.array([[i, j, 1] for j in range(512) for i in range(512)])img_matrix = img_matrix.T# 其次,乘以矩阵得到新的坐标rotated_img_matrix = np.dot(M, img_matrix)rotated_img_matrix = np.rint(rotated_img_matrix).astype(int)# 最后,按照新坐标填补像素resized_image = np.zeros_like(img)for i in range(512):for j in range(512):num = i * 512 + jx = rotated_img_matrix[1, num]y = rotated_img_matrix[0, num]if 0 < x < 512 and 0 < y < 512:resized_image[x, y] = img[i, j]return resized_image
final_img = resize(img)
plt.imshow(final_img)
plt.show()

2. 透视变换

原理:https://blog.csdn.net/m0_43609475/article/details/112847314

区别于仿射变换,透视变换是通过变换矩阵对图像进行变形,来实现视角的转换。

在透视变换中,不仅会发生平移或者旋转,也会发生图像形变。

仿射变换需要三点求解仿射矩阵,而透视变换则需要四点标定,来获得变换矩阵

常见应用:鱼眼畸变校正、鸟瞰视角变换

opencv函数

getPerspectiveTransform([左上],[左下],[右上],[右下]四个坐标)

warpPerspective(img, 旋转矩阵, 输出图片大小)

例:将图像变为正对镜头的视角

import cv2img = cv2.imread('E:/notebook/grid.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
print(img.shape)
M = cv2.getPerspectiveTransform(np.float32([[410, 392], [506, 677], [828, 283], [897, 635]]), np.float32([[0, 0], [0, 980], [1272, 0], [1272, 980]]))
print(M)
plt.imshow(img)
plt.show()
project_img = cv2.warpPerspective(img, M, (1272, 980))
plt.imshow(project_img)
plt.show()

https://blog.csdn.net/m0_51653200/article/details/127361624

相关文章:

图像基本变换

缩放与裁剪裁剪图像的裁剪&#xff0c;是指将图像的某个区域切割出来。一些常见的应用场景包括&#xff1a;* 感兴趣区域提取* 去除无用信息* 图像增强* 纠偏&#xff1a;去除不规则部分&#xff0c;将图像变得更加整齐事实上&#xff0c;图像裁剪的裁剪通常就是一个numpy矩阵切…...

基于文心一言的底层视觉理解,百度网盘把「猫」换成了「黄色的猫」

随着移动互联网的一路狂飙&#xff0c;手机已经成为人们的新器官。出门不带钥匙可以&#xff0c;不带手机却是万万不可以的。而手机上&#xff0c;小小的摄像头也越来越成为各位「vlogger」的口袋魔方。每天有超过数亿的照片和视频被上传到百度网盘中&#xff0c;这些照片和视频…...

安卓开发的环境配置教程

文章目录事先准备&#xff1a;下载 JDK、Gradle下载安装 Android Studio下载安装 Android SDK下载安装 ADB笔者的环境&#xff1a; Java 17.0.1 Gradle 8.0.1 Android Studio Electric Eel | 2022.1.1 Patch 1 Windows 10 教育版 64位 事先准备&#xff1a;下载 JDK、Gradl…...

【Spring Cloud Alibaba】Spring Cloud Alibaba 搭建教程

文章目录教程适用版本一、简介主要功能组件开源地址二、开始搭建1.项目搭建与依赖管理2.服务注册与发现&#xff08;Nacos安装&#xff09;3.创建服务提供者4.创建服务消费者5.创建服务消费者(Feign)6.添加熔断机制&#xff08;Sentinel&#xff09;7.Sentinel熔断器仪表盘监控…...

关于自动机器学习flaml训练时的一些报错

一、版本背景flaml 1.1.3sciket-learn 0.23.0二、一路报错2.1、SyntaxError: future feature annotations is not definedTraceback (most recent call last):File "C:/Users/dell/Desktop/AI/run.py", line 151, in <module>model.autoMlArgs(queryDf,targe…...

【计算机视觉】消融实验(Ablation Study)是什么?

文章目录一、前言二、定义三、来历四、举例说明一、前言 我第一次见到消融实验&#xff08;Ablation Study&#xff09;这个概念是在论文《Faster R-CNN》中。 消融实验类似于我们熟悉的“控制变量法”。 假设在某目标检测系统中&#xff0c;使用了A&#xff0c;B&#xff0…...

Java毕业论文参考文献参考例子整理

[1]李庆民.基于java的软件agent开发环境的分析[J].数字技术与应用,2017,01:189.    [2]籍慧文.Web应用开发中JAVA编程语言的应用探讨[J].科技创新与应用,2017,07:90.    [3]卜令瑞.基于Java软件项目开发岗位的企业实践总结报告[J].职业,2016,32:124-125.    [4]肖成金,吕…...

C++ Primer第五版_第六章习题答案(21~30)

文章目录练习6.21练习6.22练习6.23练习6.24练习6.25练习6.26练习6.27练习6.28练习6.29练习6.30练习6.21 编写一个函数&#xff0c;令其接受两个参数&#xff1a;一个是int型的数&#xff0c;另一个是int指针。函数比较int的值和指针所指的值&#xff0c;返回较大的那个。在该函…...

SLAM算法之HectorSLAM,Gmapping,KartoSLAM,CoreSLAM和LagoSLAM

文章将介绍使用的基于机器人操作系统&#xff08;ROS&#xff09;框架工作的SLAM算法。 在ROS中提供的五种基于2D激光的SLAM算法分别是&#xff1a;HectorSLAM&#xff0c;Gmapping&#xff0c;KartoSLAM&#xff0c;CoreSLAM和LagoSLAM。当然最后还有比较经典的google开源的ca…...

phpstorm断点调试

环境&#xff1a;win10phpstorm2022phpstudy8lnmp 1、phpinfo(); 查看是否安装xdebug&#xff0c;没有走以下流程 2、phpstudy中切换不同版本php版本&#xff0c;有些版本不支持xdebug&#xff08;如php8.0.2&#xff09;&#xff0c;有些已经自带了&#xff08;如php7.3.9&a…...

做一个前端网页送给女朋友~轮播图+纪念日

文章目录1. 轮播图框架2. 轮播图大盒子实现1. 盒子及图片的可视化2. 将图片重叠起来并放入轮播图盒子中...相对定位与绝对定位3. 添加左右按钮4. 点击按钮跳转图片5. 鼠标离开图片轮播图按钮隐藏6. 添加小圆点按钮7. 点击小圆点跳转图片并且该小圆点变色8. 自动轮播9. 最后一步…...

CSDN 编程竞赛三十九期题解

竞赛总览 CSDN 编程竞赛三十九期&#xff1a;比赛详情 (csdn.net) 竞赛题解 题目1、圆小艺 最近小艺酱渐渐变成了一个圆滑的形状球&#xff0c;小艺酱开始变得喜欢上球&#xff01;小艺酱得到n个同心圆。小艺酱对着n个同心圆进行染色&#xff0c;相邻的圆范围内不能有相同的…...

ChatGPT来了你慌了吗?

文章目录一、ChatGPT是什么&#xff1f;一、ChatGPT到底多强大&#xff1f;三、各平台集成了ChatGPT插件&#xff1a;四、ChatGPT能否取代程序员&#xff1f;一、ChatGPT是什么&#xff1f; ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&…...

Dijkstra 算法

Dijkstra 算法&#xff08; 迪杰斯特拉算法&#xff09;&#xff0c; 又叫最短路径算法&#xff0c; 这是常见的图论中的最短路径算法&#xff0c; 由 Edsger W.Dijkstra 在 1959 年发表。 这种算法能够给定一个图中的源节点&#xff08; Source Node&#xff09;&#xff0c; …...

EIgamal 算法实现与解读

EIgamal 算法实现与解读 数学知识1.求原根2.求逆元快速幂求解EIgamal 算法1. Elgamal密钥产生2. Elgamal加密3. Elgamal解密效果如下:数学知识 1.求原根 如果g是p的原根,就是g^(p-1) = 1 (mod P)当且仅当指数为p-1的时候成立.(这里P是素数) 简单来说,g^i mod p ≠ g^j m…...

静态通讯录动态通讯录制作详解

&#x1f355;在本期的博客我们来向大家介绍一下静态通讯录的书写以及怎样将我们的静态通讯录更改为动态的模式。 &#x1f354;静态通讯录的创建 &#x1f355;就像是我们之前进行的完整程序逻辑的书写一样我们同样创建三个文件&#xff0c;两个 .c 文件&#xff0c;一个 .h 文…...

2023最新最详细【接口测试总结】

序章 ​ 说起接口测试&#xff0c;网上有很多例子&#xff0c;但是当初做为新手的我来说&#xff0c;看了不不知道他们说的什么&#xff0c;觉得接口测试&#xff0c;好高大上。认为学会了接口测试就能屌丝逆袭&#xff0c;走上人生巅峰&#xff0c;迎娶白富美。因此学了点开发…...

【java基础】Stream流的各种操作

文章目录基本介绍流的创建流的各种常见操作forEach方法filter方法map方法peek方法flatMap方法limit和skip方法distinct方法sorted方法收集结果收集为数组&#xff08;toArray&#xff09;收集为集合&#xff08;collect&#xff09;收集为Map关于流的一些说明&#xff08;终结操…...

【Python练习】序列结构

目录 一、实验目标 二、实验内容...

CDN加速缓存的定义与作用

一、CDN的含义CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。CDN是在原有互联网的基础上再构建虚拟分发网络&#xff0c;利用部署在各地的边缘节点服务器&#xff0c;充分发挥其负载均衡、内容分发智能调度等功能&#xff0c;让用户能够就地拉取数据&#x…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...