经常需要使用 Python 对图像做处理,那就免不了使用一些图像处理库,特地写了这篇博客记录一下常用的图像处理库。
Open Source Computer Vision, 其更广为人知的名字是OpenCV,是 Intel 开源计算机视觉库,由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV 使用 C/C++ 开发,同时也提供了 Python、Java、MATLAB 等其他语言的接口。本文主要是对 OpenCV-Python 的接口进行描述。
此处为相应的文档链接:[英文] [中文]
由 OpenCV 支持的主要格式有:
需要辅助库的格式有:
-读取图像并显示图像
import cv2
# 读取图像,默认读入彩色图像
# cv2.imread(path,flag = cv2.IMREAD_COLOR)
# cv2.IMREAD_COLOR:加载彩色图像。任何形象的透明度将被忽略。这是默认的标志。
# cv2.IMREAD_GRAYSCALE:以灰度模式加载图像
# cv2.IMREAD_UNCHANGED:加载包含Alpha通道的图像
# 除了上面这三个标志,你可以简单地传递整数 1,0,-1。
img = cv2.imread('example.jpg') # 当该图像不存在时,返回 None
# 显示图像
cv2.namedWindow('example',cv2.WINDOW_NORMAL) # 创建窗口
cv2.imshow('example',example) # 在指定窗口中显示图像
cv2.waitKey(0) # 等待键盘输入,若传入参数为0,则程序将无限制等待用户的案件事件,否则,程序等待所传入参数对应的毫秒时间后,跳出循环。
# 如果程序想响应某个按键,可这样写 :
# if waitKey(0)==Keyvalue:
# pass
cv2.destroyAllWindows() # 删除所有建立的窗口,若需删除指定窗口,则使用cv2.destroyWindow(),并传入指定窗口的名称。
-保存图像
import cv2
# 读取图像
img = cv2.imread('example.jpg')
# 保存图像
# 还可以指定保存图像的品质或压缩率
# 对于 jpg 图像,cv2.imwrite(path,img,[cv2.IMWRITE_JPEG_QUALITY,90]),参数范围为 0~100
# 对于 png 图像,cv2.imwrite(path,img,[cv2.IMWRITE_PNG_COMPRESSION,5]),参数范围为 0~9
cv.imwrite('example.png')
-转换图像格式
import cv2
img = cv2.imread('example.jpg')
# 由 RGB 转为 灰度图
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 由 RGB 转为 HSV
img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
-图像坐标轴
注意:在 OpenCV 中,RGB 图像的通道顺序为 BGR。
OpenCV 所读进来的图像本身就是一个 np.ndarray 实例,其维度为 (height,width,channels),其原点坐标位于图像的左上角。
-常用方法
import cv2
# 读取图像
img = cv2.imread('example.jpg')
# 图像缩放
# cv2 的图像维度一般以 (height,width,channel)存在,但 resize 不同,以(width,height,channel)存在,且默认采用双线性插值。
# 可选参数 nninterpolation 的取值范围:
# cv2.INTER_NEAREST 最近邻插值
# cv2.INTER_LINEAR 双线性插值(默认设置)
# cv2.INTER_AREA 使用像素区域关系进行重采样。 它可能是图像抽取的首选方法,因为它会产生无云纹理的结果。 但是当图像缩放时,它类似于 INTER_NEAREST方法。
# cv2.INTER_CUBIC 4x4像素邻域的双三次插值
# cv2.INTER_LANCZOS4 8x8像素邻域的Lanczos插值
img = cv2.resize(img,(width,height))
# 通道分离
b,g,r = cv2.split(img)
# 合并通道
img = cv2.merge((b,g,r))
# 复制图像
img = img.copy()
# 获取ROI
ROI = img[top:low,left:right]
# 由 PIL 格式转化为 OpenCV 格式
img = cv2.cvtColor(numpy.asarray(image),cv2.COLOR_RGB2BGR)
Python Imaging Library ,或者叫 PIL,简略来说, 是Python图像操作的核心库。
不幸的是,它的开发陷入了停滞,最后一次更新是2009年,只支持到 Python 2.7。
不过,目前仍存在一个活跃的 PIL 开发分支,叫做 Pillow。它很容易安装,运行在虽有的主流操作系统上,而且支持Python 3.x。
此处为相应的文档链接:[英文] [中文]
from PIL import Image
# 读取图像
# Image.open() 返回 Image 类的实例,不需要指定图像格式,由文件内容自动确定图像格式。
img = Image.open('example.jpg')
# 显示图像
img.show()
# Image 类有5个属性,分别如下所示:
# format : 返回图像的格式(PNG,JPG,None等,。如果图像不是从文件读取的,它的值就是 None。
# mode : 返回图像的模式,常用模式有 L (luminance) 表示灰度图像, RGB 表示真彩色图像, CMYK 表示出版图像。
# size : 返回 (width, height),宽度和高度,单位都是px。
# palette : 仅当 mode 为 P 时有效,返回 ImagePalette 实例。
# info : 以字典的形式返回实例的信息。
from PIL import Image
# 读取图像
img = Image.open('example.jpg')
# 保存图像
# 调用 Image 类的函数 save,save(filename,format) 函数以特定的图像格式保存图像。
# 若不指定图像格式,save() 方法会根据文件扩展名来选择相应的图像格式。
img.save('OtherExample.jpg')
from PIL import Image
img = Image.open('example.jpg')
# 由 RGB 模式转为 L 模式,即将彩色图像转为灰度图像
img = img.convert('L')
import numpy as np
from PIL import Image
# 读取图像
img = Image.open('example.jpg')
# 将 Image 实例转换为 np.ndarray 实例
img = np.array(img)
# 将 np.ndarray 实例转换为 Image 实例
img = Image.fromarray(img)
import numpy as np
from PIL import Image
# 读取图像
img = Image.open('example.jpg')
print(img.size) # 输出:(400,200)
# 将 Image 实例转换为 np.ndarray 实例
img = np.array(img)
print(img.shape)# 输出:(200,400,3)
from PIL import Image
# 读取图像
img = Image.open('example.jpg')
# 图像缩放
img = img.resize((width, height))
# 带 ANTIALIAS 滤镜缩放结果的图像缩放
img = img.resize((width, height),Image.ANTIALIAS)
# 通道分离
r, g, b = img.split()
# 合并通道
img = Image.merge("RGB", (b, g, r))
# 复制图像
img = img.copy()
# 获取 ROI
ROI = img.crop((left,upper,right,lower))
# 由 OpenCV 格式转化为 PIL 格式
image = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
Matplotlib 应该是 Python 2D-绘图领域使用最广泛的套件,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。
Matplotlib 的功能和 Matlab 中的画图的功能十分类似,但是 Matlab 进行画图相对来说比较复杂,所以使用 Python 中的 Matplotlib 来画图比较方便。
此处为相应的文档链接:[英文] [中文]
读取图像并展示图像
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
# 读取图像
lena = mpimg.imread('example.png')
# 展示图像
plt.figure("Image") # 设置窗口名称,窗口大小可通过可选参数 figsize 进行设置
plt.imshow(img) # 绘制图像,若图像为灰度图,应这样写:plt.imshow(img,cmap='gray')
plt.axis('on') # 显示坐标轴,若不想展示坐标轴,应这样写:plt.axis('off')
plt.title('image') # 设置图像名称
plt.show() # 展示图像
img = Image.open(os.path.join('images', '2007_000648' + '.jpg'))
gray = img.convert('L')
r,g,b = img.split()
img_merged = Image.merge('RGB', (r, g, b))
# 同时展示多副图像
plt.figure("Other Image")
plt.suptitle('Multi_Image')
plt.subplot(2,2,1), plt.title('1'), plt.imshow(img),plt.axis('off')
plt.subplot(2,2,2), plt.title('2'), plt.imshow(img),plt.axis('off')
plt.subplot(2,2,3), plt.title('3'), plt.imshow(img),plt.axis('off')
plt.subplot(2,2,4), plt.title('4'), plt.imshow(img),plt.axis('off')
plt.show()
# 保存图像
plt.savefig("example.jpg")
常用函数
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
# 绘制函数
# 绘制单个函数:
plot([x], y, [format1])
# 绘制多个函数:
plot([x], y, [format1], [x2], y2, [format2], ..., [xn], [yn], [formatn])
# 绘制多个函数并对每个函数进行区分:
plot([x], y, [format1], [label1], [x2], y2, [format2], [label2], ..., [xn], [yn], [formatn], [labeln])
# 可选参数 [format] 是一个字符串来定义图的基本属性如:颜色(color),点型(marker),线型(linestyle),
# 具体形式 format = '[color][marker][line]'
# format 接收的是每个属性的单个字母缩写,例如:
# plot(x, y, 'bo-') # 蓝色圆点实线
# 绘制直方图
plt.bar(x, y)
# plt.bar(left, height, width=0.8, bottom=None, **kwargs)
# left,height,width,bottom这四个参数确定了柱体的位置和大小。
# 默认情况下,left为柱体的居中位置(可以通过align参数来改变left值的含义),即:
# (left - width / 2, bottom)为左下角位置
# (left + width / 2, bottom + height)为右上角位置
参考资料:
如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!
作者信息:
知乎:没头脑
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink