【Python】 Python 使用 Pillow 处理图像:几何变换

Python 使用 Pillow 处理图像:几何变换

pillow库操作切片、旋转、滤镜、输出文字、调色板等功能一应俱全。

1. 几何变换

Image 包含调整图像大小 resize() 和旋转 rotate() 的方法。前者采用元组给出新的大小,后者采用逆时针方向的角度。

调整大小并逆时针旋转 45度

from PIL import Image
from matplotlib import pyplot as plt
im=Image.open(‘./L1020120.JPG’)
o = im.resize((128, 128))
outfile= o.rotate(45)
plt.imshow(outfile)
plt.show()
在这里插入图片描述

要以90度为单位旋转图像,可以使用 rotate() 或 transpose() 方法。后者也可用于围绕其水平轴或垂直轴翻转图像。

FLIP_LEFT_RIGHT 水平左右翻转

Image.FLIP_TOP_BOTTOM 垂直上下翻转

Image.ROTATE_90 逆时针90度

Image.ROTATE_180 逆时针180度

Image.ROTATE_270 逆时针270度

更多的api可以查看官方文档和源码。

2. 剪贴,粘贴、合并图像

Image类包含允许您操作图像中的区域的方法。如:要从图像中复制子矩形图像使用 crop() 方法。

从图像复制子矩形

1.截取矩形图像

im=Image.open(‘L1020120.JPG’)
box = (100, 100, 400, 500)
region = im.crop(box)
plt.imshow(region)
plt.show()
_images/sec03_pillow-geom_5_0.png
定义box元组,图像基于左上角为(0,0)的坐标,box 坐标为 (左,上,右,下)。注意,坐标是基于像素。示例中为 300 * 400 像素。

2.先将复制的内容颠倒180度,在原图上粘贴子矩形图像

粘贴时要注意几点。选择好想要粘贴的位置,paste() 方法的两个参数依次是处理后的图片;以及图片的位置,同样为(左,上,右,下),不过,他们的值的间距为图片的像素(也就是确定好左上角的点后,分别加上像素值),不可调整。

将我们复制的图片旋转180度

region = region.transpose(Image.ROTATE_180)
定义要粘贴的位置。

box = (100, 100, 400, 500)
将子图(region) 粘贴(paste)回原图时,粘贴位置 box 的像素与宽高必须吻合。而原图和子图的 mode 不需要匹配,Pillow会自动处理。

im.paste(region, box)
plt.imshow(im)
plt.show()
_images/sec03_pillow-geom_11_0.png
region = region.transpose(Image.ROTATE_180)
box = (200, 200, 500, 600)
im.paste(region, box)
plt.imshow(im)
plt.show()
在这里插入图片描述

3.移动图像

移动图像就是将图片复制再粘贴。看起就像移动。

image_path = ‘L1020120.JPG’
im = Image.open(image_path)
设置想要偏转的像素值。

delta=200
xsize, ysize = im.size
print(im.size)
(1000, 734)
移动图片通常都是在X轴的方向上进行处理,我们设置的偏移值为200个像素,比X轴的值小所以可以直接处理,但是如果是移动2000个像素呢,可能就会出现错误,所以我们对他进行求余处理,也就是将图片移动了多个周期,依旧是2000时,我们需要移动的就是144个像素。

delta = delta % xsize
if delta == 0:
plt.imshow(im)
plt.show()
将确定好的位置复制下来,在重新组成一幅图片,视觉上看就像是图片在移动。

part1 = im.crop((0, 0, delta, ysize))
part2 = im.crop((delta, 0, xsize, ysize))
im.paste(part1, (xsize - delta, 0, xsize, ysize))
im.paste(part2, (0, 0, xsize - delta, ysize))
plt.imshow(im)
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/175831.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将VS工程转为Qt的pro工程及VS安装Qt插件后没有create basic .pro file菜单问题解决

目录 1. 前言 2. VS工程转为pro工程 3. 没有create basic .pro file菜单 1. 前言 很多小伙伴包括本人,如果是在Windows下开发Qt程序,偏好用Visual Studio外加装个Qt插件进行Qt开发,毕竟Visual Studio确实是功能强大的IDE,但有时…

SpringCloud微服务:Ribbon负载均衡

目录 负载均衡策略: 负载均衡的两种方式: 饥饿加载 1. Ribbon负载均衡规则 规则接口是IRule 默认实现是ZoneAvoidanceRule,根据zone选择服务列表,然后轮询 2.负载均衡自定义方式 代码方式:配置灵活,但修…

Linux--makefile

一、makefile的作用 makefile是一个文件,是围绕依赖关系和依赖方法的自动化编译工具 一个工程中的源文件有很多,按照不同的类型、功能、模块放在不同的目录中。而makefile定义了一系列的规则来指定,那些文件需要先编译,那些文件…

【算法与数据结构】93、LeetCode复原 IP 地址

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:参照【算法与数据结构】131、LeetCode分割回文串的思路,需要将IP字符串进行分割&#xff0…

JVM虚拟机:垃圾回收之三色标记

本文重点 在前面的课程中我们已经学习了垃圾回收器CMS和G1,其中CMS和G1中的mixedGC都存在四个过程,这四个过程中有一个过程叫做并发标记,也就是说程序一边运行,一边标记垃圾。这个过程最困难的是:如果在标记垃圾的时候,如果对象的引用关系发生了改变,此时应该如何处理?…

【分布式】CAP理论详解

一、CAP理论概述 在分布式系统中,CAP是指一组原则,它们描述了在网络分区(Partition)时,分布式系统能够提供的保证。CAP代表Consistency(一致性)、Availability(可用性)和…

【Python】上市公司数据进行经典OLS回归实操

一、题目二、数据合并、清洗、描述性统计1、数据获取2、数据合并3、选择董监高薪酬作为解释变量的理论逻辑分析 三、多元回归模型的参数估计、结果展示与分析1、描述性统计分析2、剔除金融类上市公司3、对所有变量进行1%缩尾处理4、0-1标准化,所有解释变量5、绘制热…

让公有云服务“宁安如梦”的“定心丸”在哪里?

电视剧《宁安如梦》正在热播中,该剧讲述了主人公在经历人生的重大风险后,重获新生再活一遍,以确定性的方式抵御和化解原有的重大风险。然而,在现实的生活中,却没有这样的重来机会。 2023年11月13日,Gartne…

AI歌姬,C位出道,基于PaddleHub/Diffsinger实现音频歌声合成操作(Python3.10)

懂乐理的音乐专业人士可以通过写乐谱并通过乐器演奏来展示他们的音乐创意和构思,但不识谱的素人如果也想跨界玩儿音乐,那么门槛儿就有点高了。但随着人工智能技术的快速迭代,现在任何一个人都可以成为“创作型歌手”,即自主创作并…

2024上海国际智能驾驶技术展览会(自动驾驶展)

2024上海国际智能驾驶技术展览会 2024 Shanghai International Autonomous driving Expo 时间:2024年3月26-28日 地点:上海跨国采购会展中心 随着科技的飞速发展,智能驾驶已经成为了汽车行业的重要趋势。在这个时代背景下,汽车不…

分类预测 | MATLAB实现基于Isomap降维算法与改进蜜獾算法IHBA的Adaboost-SVM集成多输入分类预测

分类预测 | MATLAB实现基于Isomap降维算法与改进蜜獾算法IHBA的Adaboost-SVM集成多输入分类预测 目录 分类预测 | MATLAB实现基于Isomap降维算法与改进蜜獾算法IHBA的Adaboost-SVM集成多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 Isomap-Adaboost-IHBA-…

创造者设计模式

Bike package com.jmj.pattern.builder.demo01;public class Bike {private String frame;//车架private String seat;//车座public String getFrame() {return frame;}public void setFrame(String frame) {this.frame frame;}public String getSeat() {return seat;}public…