【AI基础】OpenCV,PIL,Skimage你pick谁

opencv-python +ski-image实现指静脉的LBP(局部二进制模式)特征提取 LBP: 我对original LBP的理解是:对一个灰度图像的每个像素,用这个像素周围一格或者N格的其他像素做比较,最后将这周围(一般是8个)得到的比较结果串起来得到一个8位二进制的串,用这个8位二进制数在一个同等大小的矩阵中的同等位置替代原来像素信息,遍历整个图像即可得到这副图像的LBP图像。原理上来说,original LBP 具有灰度不变性。而如果用一个圆形的8个(或者更多)等分点来代替... 阅读详情

文章首发于微信公众号《与有三学AI》

【AI基础】OpenCV,PIL,Skimage你pick谁

如何对图像进行处理是深度学习图像处理的基础,我们常常需要对图像进行读取、保存、缩放、裁剪、旋转、颜色转换等基本操作。

本文将讲解如何利用opencv、PIL、 scikit-image等进行图像处理,并比较它们之间微小的差异。

 

01 三大包的基础操作

本节讲解如何利用opencv、PIL、 scikit-image等工具进行图像读取、图像保存、图像缩放、裁剪、旋转、颜色转换等基本操作。

下面将基于下面这张图片演示如何对图形进行基本的处理

1.1 利用PIL处理图像                            

我们首先从读取图片开始,很多图像处理库(如opencv、skimage)都以imread()读取图片,但是PIL用open方法。

 如果我们想要使用PIL来处理图像,必须先导入Image模块,这是进行一切操作的前提。导入方法如下:

from PIL import Image

读取一幅图像

#我的图片是保存在d盘picture文件夹下

img = Image.open('d:/picture/cat.jpg')

执行上述代码返回的结果如下:

怎样才能可视化这个图像呢?

我们需要调用matplotlib这个库,如果没有matplotlib.pyplot中的show()方法,图像只会在内存中,我们当然看不见了。话不多说,代码如下

from PIL import Image

import matplotlib.pyplot as plt

img = Image.open('d:/picture/cat.jpg')

plt.imshow(img)
plt.show()

结果如下:

查看图片信息

哈哈!图片我们已经看到了,这是万里长征的第一步。如果我们想要了解图片格式,大小应该怎么办呢?方法如下:

print(img.format)#查看图片格式

print(img.size)#查看图片大小

print(img.mode)#查看图片模式

我只列举了常用的三个其实还有很多,可以自行搜索

更改图像形式

使用PIL中的crop()方法可以从一幅图像中裁剪指定区域,该区域使用四元组来指定,四元组的的坐标依次是(b1,a1,b2,a2),通常一张图片的左上角为0。示意图如下:

 

如何对图像进行裁剪,具体代码如下:

裁剪后的图片

调整图片尺寸和旋转

我们可以使用resize()来调整图片尺寸,该方法的参数是一个元组,用来指定图像的大小,代码如下:

#把图片的尺寸改为400x400,tuple里面是图像的weight和height

Img2 = img1.resize((400,400))

调整大小后的图片

要旋转一幅图像,可以使用逆时针方法表示角度,调用rotate()方法,代码如下:

img2 = img1.rotate((45))

旋转后的图片

对图像旋转(旋转90度的整数倍)和翻转也可以用transpose,方法如下:

#左右对换。

img2=img1.transpose(Image.FLIP_LEFT_RIGHT) 

#上下对换。

img2=img1.transpose(Image.FLIP_TOP_BOTTOM)  

#旋转 90 度角。注意只能旋转90度的整数倍

img2=img1.transpose(Image.ROTATE_90)  

左右翻转

上下翻转

图像颜色变化

PIL中可以使用convet()方法来实现图像一些颜色的变化,convert()函数会根据传入参数的不同将图片变成不同的模式。在PIL中有9种模式,如下表所示:

下面我们以灰度图像为例,将目标图像转换成灰度图像,方法如下:

img1 = img.convert('F')#将图片转化为32位浮点灰色图像,结果如下图:

下面再使用skimage和opencv对图像进行基本操作,只附上具体实现代码和注释,效果和上面的其实没什么差别。

1.2 使用skimage对图像处理                  

#导入io模块

from skimage import io

#以彩色模式读取图片

img=io.imread('d:/picture/cat.jpg')

#以灰色图像模式读取图片

img=io.imread('d:/picture/cat.jpg',as_grey=True)

#将图片保存在c盘,picture文件夹下

io.imsave('c:/picture/cat.jpg')

#将图片的大小变为500x500

img1 = transform.resize(img, (500,500))

#缩小为原来图片大小的0.1

img2 = transform.rescale(img, 0.1) 

#缩小为原来图片行数一半,列数四分之一

img3 = transform.rescale(img, [0.5,0.25])

#放大为原来图片大小的2倍

img4 =transform.rescale(img, 2)

#旋转60度,不改变大小

img5 =transform.rotate(img, 60)

#旋转60度,同时改变大小

img6=transform.rotate(img, 60,resize=True) 

#将图片调暗,。如果gamma大于1,新图像比原图像暗,如果gamma<1,新图像比原图像亮

img7= exposure.adjust_gamma(img, 4) 

#将图片调亮

img8= exposure.adjust_gamma(img, 0.3)

1.3使用opencv对图像进行处理 

#导入opencv

import cv2

#读取图片返回的是numpy.array格式

#cv2.imread共两个参数,第一个参数为要读入的图片文件名,第二个参数为如何读取图片,包括cv2.IMREAD_COLOR:读入一副彩色图片;cv2.IMREAD_GRAYSCALE:以灰度模式读入图片;cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道。

img = cv2.imread('d:/picture/cat.jpg')

#获取图片属性

print(img.shape)#返回图片的长,宽和通道数

#保存图片,共两个参数,第一个为保存文件名,第二个为读入图片

cv2.imwrite('c:/picture/cat4.jpg',img)

#创建一个窗口显示图片,共两个参数,第一个参数表示窗口名字,可以创建多个窗口中,但是每个窗口不能重名;第二个参数是读入的图片。

cv2.imshow()

#键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入

cv2.waitKey()

#删除建立的全部窗口

cv2.destroyAllWindows()

删除指定的窗口

cv2.destroyWindows()

#opencv中图像彩色空间变换函数cv2.cvtColor

cv2.cvtColor(input_image,fiag)

参数一: input_image表示将要变换色彩的图像ndarray对象 
参数二: 表示图像色彩空间变换的类型,以下介绍常用的两种: 
· cv2.COLOR_BGR2GRAY: 表示将图像从BGR空间转化成灰度图,最常用 
· cv2.COLOR_BGR2HSV: 表示将图像从RGB空间转换到HSV空间 
如果想查看参数flag的全部类型,请执行以下程序便可查阅,总共有274种空间转换类型:

import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)

 

02 比较细节差异

2.1读取方式上的不同

我们首先从读取图片开始,PIL用open方法来读取图片,但opencv、skimage都以imread()读取图片。

2.2读进来内容的差异

opencv读进来的图片已经是一个numpy矩阵了,彩色图片维度是(高度,宽度,通道数)。数据类型是uint8;

opencv对于读进来的图片的通道排列是BGR,而不是主流的RGB!谨记!

opencV存储的格式:BGR

PIL读进来的图像是一个对象,而不是我们所熟知的numpy 矩阵

PIL储存的格式

针对PIL读进来的图像是一个对象,那么如何才能将读进来的图片转为矩阵呢,方法如下:

from PIL import Image
import numpy as np
img1 = Image.open('d:/picture/cat.jpg')
arr = np.array(img1)

转换后的格式

skimage读取一张图像时也是以numpy array形式读入skimage的存储格式是RGB。如下图所示:

skimage的存储格式RGB

skimage有一个巨大的不同是读取灰度图时其图像的矩阵的值被归一化了,注意注意!

我们skimage先看读取灰度图的方式,代码如下:

from skimage import io
img=io.imread('d:/picture/cat.jpg',as_grey=True)

读取的结果如下图所示,明显看到被归一化了!

我们再看opencv和PIL读取灰度图时会不会被归一化呢?代码和对比如下:

opencv读取灰度图

import cv2
img=cv2.imread('d:/picture/cat.jpg',cv2.IMREAD_GRAYSCALE)

opencv读取灰度图格式

PIL读取灰度图

from PIL import Image
import numpy as np
img1 = Image.open('d:/picture/cat.jpg').convert('L')
arr = np.array(img1)

PIL读取灰度图格式

从上面的对比可以看出skimage读取灰度图时的巨大不同就是其图像的矩阵的值被归一化了!!!

 

03 总结

总的来说OpenCV、Skimage、PIL各有千秋。各种框架中进行进行混用,所以我们都必须要掌握,而且要注意区分他们之间微小的差异。

感谢各位看官的耐心阅读,不足之处希望多多指教。后续内容将会不定期奉上,欢迎大家关注有三公众号 有三AI!

 

Python计算机视觉实战:从图像处理到目标检测 计算机视觉作为人工智能的核心分支,通过算法让计算机具备理解图像和视频的能力。其技术原理主要基于数字图像处理、特征提取和深度学习,在工业质检、医疗诊断、自动驾驶等领域展现出巨大价值。OpenCV和PyTorch等工具库为计算机视觉开发提供了强大支持,其中图像分类、目标检测和人脸识别是三大核心任务。本文以Python为开发语言,详细讲解从基础图像处理到YOLO目标检测的完整技术路线,包含大量可运行的代码示例和工程实践技巧,特别适合转行开发者和计算机视觉初学者系统学习。 阅读详情

相关推荐

OpenCV与Skimage的初步学习

skimage与opencv简单操作的一些初步对比

waxdysys的博客 1173

skimage

skimage的简介       skimage即是Scikit-Image。基于python脚本语言开发的数字图片处理包,比如PIL,Pillow, opencv, scikit-image等。      PIL和Pillow只提供最基础的数字图像处理,功能有限;opencv实际上是一个c++库,只是提供了python接口,更新速度非常慢。scikit-image是基于scipy的一款图像处理包,它将...

syz201558503103的博客 885

算法实战应用案例精讲-【图像处理】使用scikit-image做图像处理(附python代码实现)

scikit-image 是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,是非常好的数字图像处理工具。其全称是scikit-image SciKit (toolkit for SciPy) ,对 scipy.ndimage 进行了扩展,提供了更多的图片处理功能。最后总结一下,绘制和显示图片常用到的函数有:函数名功能调用格式figure创建一个显示窗口imshow绘制图片show显示窗口plt.show()subplot划分子图title。

qq_36130719的博客 821

【CV】图像分析用 OpenCV 与 Skimage,哪一个更好?

这两种算法在它们可以检测到的和不能检测到的方面都有其起伏。OpenCV 是用 C++ 在后端进行编程的,并作为一个机器学习包,来分析 Python 中的图像模式。Skimage 也称为 S...

fengdu78的博客 1184

详解python opencv、scikit-image和PIL图像处理库比较

主要介绍了详解python opencv、scikit-image和PIL图像处理库比较,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

软硬件协同设计的大小端问题

缘起 最近需要在soc系统内做协处理器,加速AES加密运算,寄存器一次读取32bit,AES一次处理128bit,因此在数据拼接的时候,需要考虑大小端的问题,特来记录一番。 一、什么是大小端 大小端的问题发生在寄存器和内存间传递数据,这点非常重要,很多地方简单地说是数据存储方式,其实不准确。追根溯源,大小端问题是在设计load,store指令的时候考虑的,因此本质是寄存器和内存交互的问题,其他地方不会发生。 比如c语言里定义一个变量int a=ox1234,那么查看在线汇编平台的对应汇编代码: # 给2号寄

http://www.icfgblog.com/ 614

skimage图像处理(全)

skimage(全称scikit-image):是一个基于 scipy 和 numpy 构建的,专注于图像处理和计算机视觉的Python库。提供了一系列用于图像处理函数,包括图像滤波、边缘检测、图像分割、特征提取、图像配准等。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 6190

高分三号SAR影像超精细条带数据预处理实战:从原始数据到地理编码的完整操作指南

本文提供了高分三号SAR影像超精细条带数据预处理的完整实战指南。详细介绍了从原始数据导入、多视处理、滤波去噪、DEM准备到地理编码与辐射定标的完整流程,帮助用户利用SARscape软件将原始SAR数据转化为可用于分析的地理编码产品。

tree8的博客 579

PIL,Skimage,OpenCV对图像处理的差异

一, PIL,Skimage,OpenCV是对图像处理的一些常用的库,一般进行深度学习前,都需要把图像或图片转换成数组ndarray格式,再按照tensor形式送入网络模型进行训练,在进入网络前,进行图片的读取,预处理(缩放,截取,增强,添加噪声等)操作必不可少。一般的图像处理PIL,Skimage都可以完成,但是复杂的图像处理还是需要更专业的OpenCV库。 二,PIL,Skimage,Open...

qq_43258953的博客 2120

Basilisk vs. STK:开源航天仿真工具在Windows上的实战体验与生态对比

本文对比了开源航天仿真工具Basilisk与商业软件STK在Windows平台上的实战体验与生态差异。从技术架构、安装配置、使用成本、功能覆盖、社区生态到适用场景,全面分析了二者的优劣势,为航天工程师和研究人员提供选型参考。Basilisk在性能和扩展性上表现突出,而STK在可视化与专业模块上更具优势。

weixin_30632089的博客 589

UE5实战技巧:TextRender高效集成中文字体与材质优化

本文针对UE5中TextRender组件显示中文的常见问题,提供了一套完整的实战解决方案。详细讲解了如何通过手动创建字体资产、精准控制字符集来优化性能,并重点介绍了通过调整材质中的Lerp节点参数(如设为-85, 92)来解决中文字体显示残缺和边缘模糊等核心难题,帮助开发者实现高效且美观的中文文本渲染。

weixin_28040125的博客 383

使用 SKimage 的图像预处理

介绍图像是视觉对象的二维表示,例如照片、绘画或素描。在数字成像中,图像存储为像素值数组,其中每个像素代表图像亮度和颜色的样本。每个像素的颜色可以由一个或多个通道表示,如传统彩色图像中的红色、绿色和蓝色 (RGB) 通道。在本文中,你将学习各种图像预处理技术。图像可以使用计算机算法进行处理,以改变它们的外观或提取信息。图像处理技术包括调整大小、裁剪、旋转、过滤和阈值化等操作。这些操作是对像素值执行的...

深度学习与计算机视觉 1611

树莓派上基于ONNXRuntime与Qt的C++模型部署实战指南

本文详细介绍了在树莓派上使用ONNXRuntime与Qt进行C++模型部署的完整流程。从环境配置、依赖安装到交叉编译优化,再到Qt界面集成与ARM架构性能调优,提供了实战指南和常见问题解决方案,帮助开发者高效完成边缘设备上的AI应用部署。

ik6789012的博客 340

基于skimage的数字图像处理(一)——基础

Python与数字图像处理入门(基于skimage)

洲洲如梦的博客 1万+

关于对鱼眼相机图片进行畸变校正的两种思路

鱼眼畸变主要表现为径向畸变(Radial Distortion),图像中心正常,边缘向外拉伸。畸变模型通常基于入射角θ\thetaθ(光线与光学轴夹角)和图像半径rrr的关系。等距投影(Equidistant Projection)rdfθrd​fθ,其中rdr_drd​为畸变图像半径,fff为焦距,θ\thetaθ为入射角。等立体角投影(Equisolid Angle Projection)rd2fsin⁡θ2rd​2fsinθ/2。

qq_45670407的博客 1548

《RT-Thread入门与实战》第1章:RT-Thread概述与核心优势

2006年由熊谱翔发起2017年成立上海睿赛德电子科技公司2021年成为国内首个通过ISO 26262 ASIL-D认证的RTOS。

2301_79143213的博客 987

skimage库安装

kimage是个处理图片的库啊,你平时如果没有用到过,那当你报错如下的时候,你就会想起它来了。就这样: 安装库嘛,一般是在cmd上用下面这个命令嘛: conda install skimage 但是这个命令它报错嘛: 这个意思就是目前找不到这个库嘛。但事实上是有这个库的,它还有一个主页:skimage库的主页。上面写的很清楚了嘛,其实它的大名是ski-image嘛,那就是说,命令应该是这个嘛: conda install scikit-image 这样就可以顺利安装了: 承接Matla

weixin_36670529的博客 1万+

2026最新YOLO26改进:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总

针对YOLO26模型改进痛点,本专栏整理200+实战验证方法,覆盖卷积层、注意力机制等核心模块。 每种方法含原理、性能分析、改进路径及实操流程,代码可直接运行,快速提升模型效果,性价比超高。

魔改工程师的博客 1万+

skimage库简介

skimage(scikit-Image)是基于python开发的数字图片处理包。python常用的图像处理包还有PIL,Pillow, opencv, scikit-image等。PIL和Pillow只提供最基础的数字图像处理,功能有限。opencv是一个c++库,提供了python接口,更新速度非常慢。scikit-image是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理。

xiaoyuzhou1994的博客 2168

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

python安装skimage库出现错误,安装失败的解决办法

python安装skimage库出现错误,安装失败的解决办法

越努力,越幸运 4589

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

图像处理中媲美matlab的python包——scikit-image(skimage)包的用法详解

前言: 基于python的图片处理包还是很多的,比如PIL,Pillow, opencv, scikit-image等。其中,PIL和Pillow只提供最基础的数字图像处理,功能有限;opencv本质上是一个c++库,只是提供了python的接口,官方更新速度非常慢,而且安装很不容易。综合来看,scikit-image是基于scipy的一款图像处理包,它功能非常齐全,同时将图片作为numpy数组进...

weixin_43154228的博客 2231

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

几个图像处理库整理:OpenCV、PIL(pillow)、skimage和GDAL库

主要是图像处理的几个库对数据的读取方式存在差异,有的时候经常搞混,没有概念,所以大致整理一下,一是增强印象,二是整理便于查阅。关于图像读取函数: 我测试的一张图片结果:可见opencv读出的数据是numpy数组类型,数据shape维度是[H,W,C],列(高)和行(宽),读取顺序是BGR,size表示像素数量。主要处理三波段图像或灰度图。 一般要注意中文路径无法读取图片的问题,或换成无中文路径或采用可解析方法,一个查询到的解决办法: 2、Pillow 是 PIL的对Python3支持的一个分支,对Pytho

qq_44442727的博客 4922

安装skimage库经验

安装skimage库经验

PeterClerk的博客 5728

图像分析用 OpenCV 与 Skimage,哪一个更好?

作者 | 小白来源 |小白学视觉这两种算法在它们可以检测到的和不能检测到的方面都有其起伏。OpenCV 是用 C++ 在后端进行编程的,并作为一个机器学习包,来分析 Python 中的图...

AI科技大本营 1182

python skimage图像处理

 基于python脚本语言开发的数字图片处理包,比如PIL,Pillow, opencv, scikit-image等。PIL和Pillow只提供最基础的数字图像处理,功能有限;opencv实际上是一个c++库,只是提供了python接口,更新速度非常慢。scikit-image是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,正好与matlab一样。这里选择Skimage模块...

知道不_zkl的博客 1万+

深入探索 skimage —— 强大的图像处理库

skimageskimage是一个功能强大且易于使用的图像处理库,适合从基础到高级的图像处理任务。在本文中,我们不仅了解了它的核心功能,还通过实战构建了一个简单的图像边缘检测工具。如果你正在从事图像处理相关的项目,skimage将是你不可或缺的利器!

萧鼎的博客 2579
上一篇: 【资源总结】“十大深度学习方向” 专栏
下一篇: 【杂谈】为什么你学了AI,企业却不要你
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值