Python 如何进行图像处理(OpenCV, PIL)

news2024/9/28 13:20:52

图像处理是计算机视觉的重要组成部分,它涉及对数字图像进行分析、修改和处理。在Python中,OpenCV和Pillow(PIL是Pillow的前身)是两个非常流行的图像处理库。

一、OpenCV简介

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它提供了数百种用于图像和视频处理的函数。OpenCV使用C++语言编写,但提供了多种编程语言的绑定,其中Python绑定非常流行。

1.1 安装OpenCV

在Python中使用OpenCV,可以通过pip安装:

pip install opencv-python

1.2 基本操作

1.2.1 读取和显示图像
import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')

# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,cv2.imread()函数用于读取图像,cv2.imshow()函数用于显示图像,cv2.waitKey(0)用于等待用户按键,cv2.destroyAllWindows()用于关闭所有窗口。

1.2.2 图像的基本属性
# 获取图像属性
height, width, channels = image.shape
print(f"高度: {height}, 宽度: {width}, 通道: {channels}")

image.shape返回图像的高度、宽度和通道数。

1.2.3 图像保存
cv2.imwrite('saved_image.jpg', image)

cv2.imwrite()函数用于保存图像。

1.3 图像处理操作

1.3.1 转换颜色空间

OpenCV提供了多种颜色空间转换的方法,常用的包括BGR到灰度(Grayscale)、BGR到HSV(Hue, Saturation, Value)等。

# BGR到灰度
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# BGR到HSV
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
1.3.2 图像的几何变换

几何变换包括缩放、旋转、平移等。

# 缩放
resized_image = cv2.resize(image, (width//2, height//2))

# 旋转
center = (width // 2, height // 2)
rotation_matrix = cv2.getRotationMatrix2D(center, 45, 1.0)
rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))

# 平移
M = np.float32([[1, 0, 50], [0, 1, 50]])
shifted_image = cv2.warpAffine(image, M, (width, height))

在这些操作中,cv2.resize()用于缩放,cv2.getRotationMatrix2D()cv2.warpAffine()用于旋转,平移使用变换矩阵实现。

1.3.3 图像滤波

滤波是图像处理中常用的技术,用于平滑图像、增强边缘等。

# 高斯模糊
blurred_image = cv2.GaussianBlur(image, (5, 5), 0)

# 边缘检测
edges = cv2.Canny(image, 100, 200)

cv2.GaussianBlur()函数用于高斯模糊,cv2.Canny()函数用于Canny边缘检测。

1.3.4 形态学操作

形态学操作包括膨胀、腐蚀、开运算和闭运算等。

kernel = np.ones((5,5), np.uint8)

# 腐蚀
eroded_image = cv2.erode(image, kernel, iterations=1)

# 膨胀
dilated_image = cv2.dilate(image, kernel, iterations=1)

这些操作常用于去噪、填充或移除对象的细小缺陷。

二、Pillow简介

Pillow(PIL)是一个友好的Python图像处理库,支持打开、操作和保存多种格式的图像文件。它继承了PIL的优点,并且增加了一些新功能和修复了一些旧问题。

2.1 安装Pillow

使用pip安装Pillow:

pip install pillow

2.2 基本操作

2.2.1 读取和显示图像
from PIL import Image

# 读取图像
image = Image.open('path_to_image.jpg')

# 显示图像
image.show()
2.2.2 图像的基本属性
print(image.format, image.size, image.mode)

format是图像格式,size是图像的尺寸(宽度和高度),mode是图像的颜色模式(如RGB, L)。

2.2.3 图像保存
image.save('saved_image.jpg')

2.3 图像处理操作

2.3.1 转换颜色模式
# 转换为灰度图像
gray_image = image.convert('L')
2.3.2 图像的几何变换
# 缩放
resized_image = image.resize((width//2, height//2))

# 旋转
rotated_image = image.rotate(45)

# 翻转
flipped_image = image.transpose(Image.FLIP_LEFT_RIGHT)

Pillow的几何变换方法简单易用,可以实现图像的缩放、旋转和翻转等操作。

2.3.3 图像滤波

Pillow提供了多种滤波器,用于模糊、锐化等操作。

from PIL import ImageFilter

# 模糊滤波
blurred_image = image.filter(ImageFilter.BLUR)

# 边缘增强
edge_enhance_image = image.filter(ImageFilter.EDGE_ENHANCE)
2.3.4 图像绘制

Pillow还支持在图像上绘制形状、文本等。

from PIL import ImageDraw, ImageFont

# 创建一个绘图对象
draw = ImageDraw.Draw(image)

# 绘制矩形
draw.rectangle(((50, 50), (150, 150)), outline="red")

# 绘制文本
font = ImageFont.truetype("arial.ttf", 20)
draw.text((60, 60), "Hello", font=font, fill="blue")

三、OpenCV和Pillow的比较

  • 功能范围:OpenCV功能更强大,特别是在高级计算机视觉任务如对象检测、特征匹配和图像分割等方面。Pillow则更适合于简单的图像处理任务。
  • 性能:OpenCV通常比Pillow更快,因为它是用C++编写的,并且在Python中有高度优化的绑定。
  • 易用性:Pillow更符合Python的习惯用法,代码简洁,适合初学者;OpenCV的API更为复杂,但功能更强大。

OpenCV和Pillow都是强大的图像处理工具,各有优劣。对于高级的图像处理任务,如特征检测、视频处理和机器学习,OpenCV是首选。而对于简单的图像操作如格式转换、基本几何变换和滤波,Pillow更易用且足够强大。选择合适的工具可以大大简化开发过程,提高工作效率。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【文心智能体】梗图七夕版,一分钟让你看懂如何优化prompt,以及解析低代码工作流编排实现过程和零代码结合插件实现过程,依然是干货满满,进来康康吧

目录 背景什么是梗图梗图概念梗图结构 低代码开发最小运行单元大模型链提示词模板文心模板输出效果 测试工具链HTTP请求工具 梗图工具链全流程 梗图优化Prompt提示词优化后梗图结构提示词前后对比优化前效果优化后效果API接口BOS图片水印 梗图插件格式说明构思插件清单文件定义…

21天学通C++:理解智能指针、IO流、异常处理

理解智能指针 管理堆(或自由存储区)中的内存时,C程序员并非一定要使用常规指针,而可使用智能指针。 什么是智能指针 简单地说,C智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能…

Spring通过注解优雅实现工厂模式

Spring通过注解优雅实现工厂模式 工厂模式作为开发者,应该都是耳熟能详的,在课本上、在网络上都会有无数的案例,是一个简单、确十分好用的设计模式。但是实现它的方法有很多,早年见过最多的就是用 if 判断类型,然后返回…

Docker部署Minio并配置域名访问

Docker部署Minio并配置域名访问 1、拉取镜像 docker pull minio/minio:RELEASE.2024-08-03T04-33-23Z-cpuv12、启动容器 # 创建数据目录 mkdir /data/minio # 创建配置目录 mkdir /root/.minio # 启动容器(如果不配置域名访问MINIO_BROWSER_URL、MINIO_SERVER_URL可以不用配…

springboot书画在线学习网站-计算机毕业设计源码11849

摘 要 本篇论文旨在设计和开发基于SpringBoot的书画在线学习网站,提供用户便捷的学习方式和丰富的学习资源。在该系统中,用户可以通过网站浏览书画的相关内容,包括诗公告消息、书画资讯、课程信息等。同时,系统还将提供书画的学习…

第七在线联手深服协:以科技之力,绘就时尚 AI 智能商品管理新篇章

7月30日,在深圳,一场堪称行业精英云集、科技锋芒毕露的“科技赋能时尚前沿沙龙”圆满落幕。这场盛会由 7thonline 第七在线与深圳服装行业协会(简称“深服协”)携手打造,深度聚焦 AI 智能商品管理在时尚天地的创新运用…

Liunx 小程序之进度条

Liunx 小程序之进度条 效果前提条件回车和换行缓冲区倒计时 进度条纯进度条模拟下载的进度条Progressbar.hProgressbar.cmain.cmakefile 效果 先来看效果,这其实是一个动态的进度条,后有源码,运行即可: 前提条件 在制作之前有两…

springboot仓库人力资源管理系统-计算机毕业设计源码45130

摘 要 仓库人力资源管理系统作为一种先进的信息技术工具,在企业中扮演着重要的角色。本文旨在深入探讨SpringBoot仓库人力资源管理系统的各项功能及其优势,以及对企业运营所带来的深远影响。 首先,我们详细探讨了SpringBoot仓库人力资源管理…

Opencv学习-图像变换

1. 图像连接 图像连接是指将两个具有相同高度或者宽度的图像连接在一起,图像的下(左)边缘是另一个图像的上(右)边缘。图像连接常在需要对两幅图像内容进行对比或者内容中存在对应信息时显示 对应关系时使用。例如&…

全国十大起名大师排行榜,中国最厉害三个起名大师是谁?

全国十大起名大师排行榜,中国最厉害三个起名大师是谁? 山东济南最受欢迎的起名大师有多位,其中较为知名的包括: ‌颜廷利,被誉为山东济南最出名的起名大师之一,还是现代山东文化名人,通过魔方解…

人工智能时代下,国产服务器操作系统如何加快发展?

人工智能时代下,国产服务器操作系统如何加快发展? 云智融合浪潮下,服务器操作系统产业未来发展将走向何方?英特尔和龙蜥的合作,能为国产操作系统的发展带来什么?双方如何通过合作布局“云AI”时代的未来&am…

配有知识库的AI助手与大模型问答相比,各有哪些优缺点?

1. 配有知识库支持的AI助手 优点: 精确性:知识库是由专业人员整理和维护的,其中的信息通常是经过验证和准确的。因此,配有知识库的AI助手可以提供准确的答案,并且在特定领域的问题上表现良好。可控性:知识…

合并重叠的区间

这一题不能用差分数组&#xff0c;因为 [1 , 4] [5, 6] 这个就会被合并&#xff0c;正确的做法就是先排序 bool cmp(vector<int> a, vector<int> b) {if (a[0] < b[0]) return 1;if (a[0] b[0]) return a[1] < b[1];return 0; } class Solution { public:ve…

Python酷库之旅-第三方库Pandas(065)

目录 一、用法精讲 256、pandas.Series.sparse方法 256-1、语法 256-2、参数 256-3、功能 256-4、返回值 256-5、说明 256-6、用法 256-6-1、数据准备 256-6-2、代码示例 256-6-3、结果输出 257、pandas.DataFrame.sparse方法 257-1、语法 257-2、参数 257-3、功…

分享一个基于人脸识别的小区物业管理系统Spring Boot(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

我花了一天时间,搭了个专属知识库,部署上线了,手把手教,不信你学不会

自动开了这个号以后&#xff0c;陆陆续续写了很多干货文章&#xff0c;一方面是可以帮助自己梳理思路&#xff0c;另一方面也方便日后查找相关内容。 但是&#xff0c;我想检索某个关键词是在之前哪篇文章写过的&#xff0c;就有点捉急了。CSDN 还好&#xff0c;可以检索到相关…

Python 算法交易实验77 QTV200日常推进-经典策略

说明 最初(去年7月)快快上了一版&#xff0c;到现在差不多正好一年。总体上当时做的还是蛮粗糙的&#xff0c;没有考虑模式&#xff0c;只是简单的用判别模型做了一道。 过去的一年&#xff0c;显然不是特别好的一年。我知道的大部分还是以亏损居多。这版策略竟然没有亏钱&am…

【C++11】:lambda表达式function包装器

目录 前言一&#xff0c;可变参数模板1.1 简单认识1.2 STL容器中的empalce系列相关接口 二&#xff0c;lambda表达式2.1 lambda表达式语法2.2 探索lambda底层 三&#xff0c;包装器3.1 function包装器3.2 bind 四&#xff0c;类的新功能4.1 默认成员函数4.2 关键字default4.3 关…

c++数据保存到.csv文件中,并用opencv离线仿真显示

测试可能不是很方便&#xff0c;希望采集一次数据后期还可以使用&#xff0c;这里提供一个案例&#xff1a; 数据写入fosepose.csv //write.cpp #include <iostream> #include <fstream> #include <iomanip> #include <cstdint> #include <chrono…

达梦数据库的系统视图v$sql_plan

达梦数据库的系统视图v$sql_plan 达梦数据库的V$SQL_PLAN视图主要用于显示缓存中的SQL执行计划信息&#xff0c;在 ini 参数 USE_PLN_POOL !0 时才统计。通过查询这个视图&#xff0c;用户可以获取到缓存中的SQL语句的执行计划&#xff0c;这对于监控和分析数据库中的SQL执行情…