Python详细讲解图像处理的而两种库OpenCV和Pillow

目录
  • 一、简介
    • 1.1 图像处理-OpenCV
    • 1.2 图像处理- PIL和Pillow
  • 二、 常用图像类型
    • 2.1 二值图像
    • 2.2 灰度图像
    • 2.3 RGB图像
    • 2.4 常用颜色空间简介
  • 三、OpenCV图像读写与显示
    • 3.1 读入图像
    • 3.2 显示图像
    • 3.3 写出图像
  • 四、图像几何变换
    • 4.1 图像平移
    • 4.2 图像旋转
  • 4.3 图像缩放

一、简介

实现计算机视觉任务的过程中,不可避免地需要对图像进行读写操作以及图像预处理操作,下面介绍两个常用的Python图像处理库:OpenCV和Pillow。

OpenCV全称是由英特尔公司资助的开源计算机视觉库。

  • 它由一系列C函数和少量C++类所组成,实现图像处理和计算机视觉方面的很多通用算法,例如特征检测与跟踪、运动分析、目标分割与识别以及3D重建等。
  • OpenCV作为基于C/C++语言编写的跨平台开源软件,可以运行在Linux、Windows、Android和MacOS操作系统上,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

1.1 图像处理-OpenCV

OpenCV是模块结构的,有以下主要模块。

  • 【core】–核心功能模块,包含内容有:OpenCV基本数据结构、动态数据结构、绘图函数、数组操作相关函数、辅助功能与系统函数和宏、与OpenGL的互操作。
  • 【imgproc】–图像处理模块,包含内容有:线性和非线性的图像滤波、图像的几何变换、图像转换、直方图相关、结构分析和形状描述、运动分析和对象跟踪、特征检测、目标检测等内容。
  • 【features2D】–2D功能模块,包含以下内容:特征检测和描述、特征检测器、描述符提取器等内容。
  • 【highGUI】–高层GUI图形用户界面,包含:媒体的I/O输入输出、视频捕捉、图像和视频的编码解码、图形交互界面的接口等内容。

1.2 图像处理- PIL和Pillow

作为Python2的第三方图像处理库是Pillow的前身。随着Python3的更新,PIL移植到Python3更名为Pillow。与OpenCV一样,Pillow也是模块结构,主要包括以下结构。

  • 【Image】–图像功能模块,包含内容有:读写图像、图像混合、图像放缩、图像裁切、图像旋转。
  • 【ImageFilter】–图像滤波功能模块,包含内容有:各类图像滤波核。
  • 【ImageEnhance】–图像增强功能模块,包含内容有:色彩增强、亮度增强、对比度增强、清晰度增强。
  • 【ImageDraw】–图像绘画功能模块,包含内容有:绘制几何形状、绘制文字。

二、 常用图像类型

2.1 二值图像

二值图像只有黑白两种颜色,如图所示。图像中的每个像素只能是黑或白,没有中间的过渡。因此二值图像的像素值只能为0或1,0表示黑色,1表示白色。

2.2 灰度图像

  • 灰度图像只表达图像的亮度信息没有颜色信息,如(a)图所示。
  • 灰度图像的每个像素点上只包含一个量化的灰度级(即灰度值)。
  • 像素点的亮度水平如(b)图所示,通常使用1字节(8位二进制数)来存储灰度值,因此用正整数表示灰度值的范围是0~255。

2.3 RGB图像

  • RGB(Red、Green、Blue)图像如(a)图,可以看成是由多个RGB像素点组成。
  • 每个彩色像素点分别由R、G、B三种颜色空间组成如(b)图,本质是3维数组。
  • 在RGB颜色空间中,任意色光都可以用R、G、B三色不同分量的相加混合而成。

2.4 常用颜色空间简介

实际应用中常用的颜色空间很多,通常使用3个独立的变量对颜色进行描述,例如RGB、HSV、YUV等。

一个图像的不同的颜色空间是可以转换的,cv2.cvtColor可以实现颜色的转换。

• cv2.COLOR_BGR2GRAY

• cv2.COLOR_BGR2RGB

• cv2.COLOR_BGR2HSV

• cv2.COLOR_BGR2YUV

• cv2.COLOR_BGR2HLS

三、OpenCV图像读写与显示

通过OpenCV库对数字图像进行处理时,涉及到的基础操作包括读取、显示、写出图像文件。

在OpenCV库中,图像数据是以NumPy数组的形式存在。

3.1 读入图像

在python的OpenCV中,通过cv2.imread()函数读入图像数据,其基本使用格式如下。cv2.imread(filename, flags)

在默认情况下通过cv2.imread()

函数读入图像数据为3通道的彩色图,像素值为8位的非负整数,图像数据以NumPy中ndarray的方式存在。

如果定义了cv2.imread()读入模式为cv2.IMREAD_GRAYSCALE那么读入图像为单通道的灰度图。

需要注意的是,通过OpenCV读入彩色图像数据的颜色通道顺序为BGR(蓝、绿、红)并非常用的RGB(红、绿、蓝)顺序。

在OpenCV中,读取到的图像数组维度可以表示为:

(高,宽,通道数)即(height, width, channel)。OpenCV图像坐标与常规的数学坐标有区别,左上角位置为坐标原点。

• 在Windows【画图】工具中,帽檐红点坐标为(248, 102),但在OpenCV中像素位置应为(102, 248)。

• X轴 == 列位置 == 图像宽

• Y轴 == 行位置 == 图像高

3.2 显示图像

  • 在OpenCV中,通过cv2.imshow()函数显示图像数据,其基本使用格式如下。
  • cv2.imshow(winname, img)
  • 在OpenCV中,通过cv2.waitKey()函数设置图片窗口显示时长,其基本使用格式如下。
  • cv2.waitKey([,delay])
  • waitKey作用是图像显示时等待用户按键触发,如果用户按键触发或时间超过了设置的时间则退出图片展示。
  • cv2.waitKey(0)的作用是令程序一直停留在显示图像的状态。如果没有增加cv2.waitKey(0),那么程序运行完毕后,图像显示窗口会自动关闭,即一闪而逝。

3.3 写出图像

  • 在OpenCV中,通过cv2.write()函数保存图像数据,其基本使用格式如下。
  • cv2.imwrite(filename, img)
import cv2
import matplotlib.pyplot as plt
import numpy
# 读写图像
img = cv2.imread(filename='lena.jpg', flags=cv2.IMREAD_GRAYSCALE)
img.shape
# (377, 373)
img.dtype
# dtype('uint8')
# 图像展示
cv2.imshow(winname='lena', mat=img)
cv2.waitKey(0)
# 图像保存
cv2.imwrite(filename='test_img.jpg', img=img)

四、图像几何变换

4.1 图像平移

图像平移变换将一幅图像中的所有像素点都按照给定的偏移量在水平方向(沿x轴方向)或垂直方向(沿y轴方向)移动,是图像几何变换中较为简单的一种变换。

图像平移原理示意图如下图所示。

假设对点P_0 (x_0,y_0 )进行平移后得到点P(x,y),其中x方向的平移量为∆x,y方向的平移量为∆y ,则点P(x,y)的坐标如下式。

利用齐次坐标表示图像平移变换前后点P_0 (x_0,y_0 )到点P(x,y)的关系如下式所示。

实现步骤:

1. 定义平移变换矩阵: 例如:np.float32([[1,0,50], [0,1,100]])

• [1,0,50]表示在x轴方向移动50个单位

• [0,1,100]表示在y轴方向移动100个单位

2. 执行转换:cv2.warpAffine (src, M, dsize)

通过OpenCV实现图像平移操作,结果如下图所示,(a)为原图和(b)为平移后图像。

import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('lena.jpg')
height, width, channel = img.shape
# 图像平移
# 1、定义平移变换矩阵
M = np.float32([[1,0,50], [0,1,100]])
# 2、执行平移变换
img_tran = cv2.warpAffine(src=img, M=M, dsize=(height, width))
cv2.imshow('image translation', img_tran)
cv2.waitKey(0)

4.2 图像旋转

图像旋转(Rotation)是指图像以某一点为中心旋转一定的角度形成一幅新的图像的过程。通常是以图像的中心为圆心旋转,将图像中的所有像素点都旋转一个相同的角度。

图像旋转原理如图所示,将点(x_0,y_0)绕原点o顺时针旋转至点(x_1,y_1 ),其中a为旋转角,r为点(x_0,y_0 )到原点的距离, b为原点o到点(x_0,y_0 )的线段与x轴之间的夹角。在旋转过程中, r保持不变。

设旋转前,x_0、y_0的坐标分别为x_0=r cos⁡b、y_0=r sin⁡b,当旋转a角度后,坐标x_1、y_1的值分别如下式所示。

上式的矩阵的形式如下式所示。

实现步骤:

1. 计算旋转变换矩阵: cv2.getRotationMatrix2D (center, angle, scale)

2. 执行转换:cv2.warpAffine (src, M, dsize)

通过OpenCV实现图像旋转,得到的效果如图所示。

# 图像旋转
# 1、定义旋转变换矩阵
M = cv2.getRotationMatrix2D(center=(height*0.5, width*0.5), # 旋转的中心位置坐标
                            angle=45,   # 旋转的角度
                            scale=0.8   # 缩放比例
                            )
# 2、执行旋转变换
img_rotation = cv2.warpAffine(img, M, dsize=(height,width))
cv2.imshow('image_rotation', img_rotation)
cv2.waitKey(0)

4.3 图像缩放

图像比例缩放是指将给定的图像在x轴方向按比例缩放f_x倍,在y轴方向按比例缩放f_y倍,从而获得一幅新的图像。如果f_x=f_y,即x轴方向和y轴方向缩放的比率相同,此比例缩放为图像的全比例缩放。如果f_x≠f_y,那么图像的比例缩放会改变原始图像的像素间的相对位置,产生几何畸变。

在OpenCV中cv2.resize(src, dsize, fx, fy, interpolation)可以实现图像缩放。

具体实现图像缩放有多种插值方法,OpenCV的resize函数提供了如下5种常见方法。

• 最邻近插值:cv2.INTER_NEAREST

• 双线性插值:cv2.INTER_LINEAR

• 区域插值:cv2.INTER_AREA

• 三次样条插值:cv2.INTER_CUBIC

• Lanczos插值:cv2.INTER_LANCZOS4

# 图像缩放
# 1、直接指定缩放大小
img_res = cv2.resize(img, dsize=(244,244))
img_res.shape
# (244, 244, 3)
cv2.imshow('image_resize', img_res)
cv2.waitKey(0)
# 2、最近邻插值
img_near = cv2.resize(img, dsize=None, fx=1.5, fy=1,
                     interpolation=cv2.INTER_NEAREST)
cv2.imshow('img_near', img_near)
cv2.waitKey(0)

到此这篇关于Python详细讲解图像处理的而两种库OpenCV和Pillow的文章就介绍到这了,更多相关Python图像处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python OpenCV图像处理之图像滤波特效详解

    目录 1分类 2邻域滤波 2.1线性滤波 2.2非线性滤波 3频域滤波 3.1低通滤波 3.2高通滤波 1 分类 图像滤波按图像域可分为两种类型: 邻域滤波(Spatial Domain Filter),其本质是数字窗口上的数学运算.一般用于图像平滑.图像锐化.特征提取(如纹理测量.边缘检测)等,邻域滤波使用邻域算子——利用给定像素周围像素值以决定此像素最终输出的一种算子 频域滤波(Frequency Domain Filter),其本质是对像素频率的修改.一般用于降噪.重采样.图像压缩等. 按

  • python 包之 Pillow 图像处理教程分享

    目录 一.安装 二.打开图片 三.转换格式并保存 四.创建缩略图 五.获取图片属性 六.图片信息 七.调色板 八.画板 九.图片模式 十.模式转换 十一.矩阵模式转换 十二.图片尺寸 十三.通道分离 十四.复制.裁剪.粘贴.合并 十五.几何变换 十六.高级图片处理 十七.滤波器处理 十八.设置透明度合成两张图 十九.设置模式合成两张图 二十.草稿模式 二十一.获取通道名称 二十二.获取包围盒 二十三.获取像素值 二十四.获取图片极值 二十五.指定位置像素值 二十六.获取图像直方图 二十七.内存分

  • 推荐五个常用的python图像处理库

    目录 1. 引言 2. Pillow库 3. Numpy库 4. Scipy库 5. Opencv库 6. Pgmagick库 7. 总结 1. 引言 Python目前是世界上使用最多的编程语言之一.它能够以更少的工作量和更少的代码行数来完成许多事情.它还可以使用很少的代码行来方便地编辑和创建图像.本文重点介绍,在图像处理领域,我们最常使用的一些Python开源库. 2. Pillow库 Pillow是Python中常用的图像处理库之一.它提供了许多操作图像的函数,如调整大小.滤波操作等.这是P

  • Python+OpenCV图像处理之直方图统计

    目录 1. 直方图概述 (1)基本概念 (2)直方图中的术语 2. 直方图绘制 (1)读取图像信息 (2)绘制直方图 3. 掩膜直方图 (1)基本概念 (2)实现代码 4. H-S 直方图 (1)基本概念 (2)绘制二维H-S直方图 1. 直方图概述 (1)基本概念 直方图就是对图像的另外一种解释,它描述了整幅图像的灰度分布.直方图的 x 轴代表灰度值(0~255),y 轴代表图片中同一种灰度值的像素点的数目,所以通过直方图我们可以对图像的亮度.灰度分布.对比度等有了一个直观的认识 (2)直方图

  • Python使用Pillow进行图像处理

    一.概述 PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow. Pillow在PIL的基础上,为Python3增加了更多功能和支持.它支持一系列图像文件格式,如PNG,JPEG,PPM,GIF

  • opencv-python图像处理安装与基本操作方法

    目录 一.安装opencv 二. opencv使用 一.安装opencv 关于opencv的安装,如果是windows系统下使用pycharm,那么直接在在终端使用pip命令或者点击设置-python解释器输入opencv-python即可 如果使用的是conda,那也可以使用pip命令或者conda install 安装在linux下的话更加简单.而且也会少很多无缘无故的bug,推荐使用linux系统.linux下使用终端输入pip或者pip3 install opencv-python即可,

  • Python详细讲解图像处理的而两种库OpenCV和Pillow

    目录 一.简介 1.1 图像处理-OpenCV 1.2 图像处理- PIL和Pillow 二. 常用图像类型 2.1 二值图像 2.2 灰度图像 2.3 RGB图像 2.4 常用颜色空间简介 三.OpenCV图像读写与显示 3.1 读入图像 3.2 显示图像 3.3 写出图像 四.图像几何变换 4.1 图像平移 4.2 图像旋转 4.3 图像缩放 一.简介 实现计算机视觉任务的过程中,不可避免地需要对图像进行读写操作以及图像预处理操作,下面介绍两个常用的Python图像处理库:OpenCV和Pi

  • python 获取剪切板内容的两种方法

    第一种 # -*- coding: utf-8 -*- # @Time : 2020/3/16 21:26 # @File : get_text_from_cupboard_13.py # @Author: Hero Liu # python读取剪切板内容 import win32clipboard as w import win32con def get_text(): w.OpenClipboard() d = w.GetClipboardData(win32con.CF_TEXT) w.C

  • python 实现ping测试延迟的两种方法

    一.python实现ping返回延迟繁琐版 #!/usr/bin/python3.7 # !coding:utf-8 __author__ = 'hsz' __date__ = 'Thu Feb 27 22:41:15 EST 2020' import time import struct import socket import select import sys def chesksum(data): """ 校验 """ n = len(d

  • 通过Python实现电脑定时关机的两种方法

    目录 导语 一.普通人关机 二.程序员关机 1)Pyqt5界面化小程序 ​2)Tkinter界面化小程序 导语 无论家用电脑还是公司的电脑,定时开关机都是一个非常实用的功能,只是一般都不太受关注.定时关机不仅能延长电脑的使用寿命,还能节约超多的电费呢~哈哈哈哈​ 害~这不,周天休假一天,但是公司的电脑大部分的小伙伴儿就开了一天,有时候放长假的时候电脑一开就是几天.这不?隔壁的小姐姐已经被领导发现了,最后的最后这个事情就落到我手里了,开发一个能定时关机的源码项目供大家使用,并互相提醒每个人一定要下

  • python文件读取read及readlines两种方法使用详解

    目录 引言 .read([size])方法 .readlines()方法 引言 with open() as 和open()都是打开,还没有读入文件 假设test.fa的内容如下图所示: ACGACGTAGCGTAGCTACGATCAGCGACGAGCTAGCGACGA .read([size])方法 read([size])方法从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,它返回字符串对象. with open('test.fa') as fa: f = fa

  • Python详细讲解浅拷贝与深拷贝的使用

    目录 1.变量的赋值操作 2.浅拷贝 3.深拷贝 4.总结 1.变量的赋值操作 只是多生成了一个变量,实际上还是指向同一个对象 # -*- coding: utf-8 -*- class CPU: pass class Disk: pass class Computer: def __init__(self, cpu, disk): # 给对象的实例属性进行初始化 self.cpu = cpu self.disk = disk # 变量的赋值 cp1 = Computer(cpu='CPU',

  • Python字符串格式化的方法(两种)

    本文介绍了Python字符串格式化,主要有两种方法,分享给大家,具体如下 用于字符串的拼接,性能更优. 字符串格式化有两种方式:百分号方式.format方式. 百分号方式比较老,而format方式是比较先进的,企图替代古老的方式,目前两者共存. 1.百分号方式 格式:%[(name)][flags][width].[precision]typecode (name)    可选,用于选择指定的key flags        可选,可供选择的值有: + 右对齐:正数的加正号,负数的加负号 - 左

  • Python简单实现安全开关文件的两种方式

    本文实例讲述了Python简单实现安全开关文件的两种方式.分享给大家供大家参考,具体如下: 以下代码经Python3.3测试. 方式1: try: file = open('config.ini', 'w') print("It's a text file", file=file) except IOError as err: print('File error: ' + str(err)) finally: if 'file' in locals(): file.close() 方式

  • python统计中文字符数量的两种方法

    方法一: def str_count(str): '''找出字符串中的中英文.空格.数字.标点符号个数''' count_en = count_dg = count_sp = count_zh = count_pu = 0 for s in str: # 英文 if s in string.ascii_letters: count_en += 1 # 数字 elif s.isdigit(): count_dg += 1 # 空格 elif s.isspace(): count_sp += 1 #

  • python 字典中取值的两种方法小结

    如下所示: a={'name':'tony','sex':'male'} 获得name的值的方式有两种 print a['name'],type(a['name']) print a.get('name'),type(a.get('name')) 发现这两个结果完全一致,并没有任何的差异. 怎么选择这两个不同的字典取值方式呢? 如果字典已知,我们可以任选一个,而当我们不确定字典中是否存在某个键时,我之前的做法如下 if 'age' in a.keys(): print a['age'] 因为不先

随机推荐