目前接触过的python图像处理代码涉及到多种的图像库,其中最常用的当属opencv和PIL。惭愧的是,以前只是拿来用,却一直迷惑为什么不同的代码会选择不同的图像库、这些图像库的联系和区别又是什么,这些迷惑也迟迟没有解决。现在,我终于要好好整理一下了!
Python的图像处理库
OpenCV
OpenCV是一个开源的计算机视觉库,该项目由Intel发起,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,还提供了Python、Ruby、MATLAB以及其他语言的接口。OpenCV的设计目标是执行速度尽量快,主要关注实时应用,帮助开发人员更便捷地设计更复杂的计算机视觉相关应用程序。
1. 安装
最简单直接的方式:
$ pip install opencv-python
2. 图像读取
import cv2
img = cv2.imread('image.jpg') #读取图像,默认得到的是一个BGR模式的彩色图像,存储为numpy矩阵
#opencv在读取图像时,若path错误,仅会返回None,而不会报错
#img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #将颜色模式从BGR转化成RGB
cv2.imwrite('new_image.jpg',img) #保存图像,仍是以正常读入图像的色彩保存
cv2.imshow('window_name',img) #将图像以窗口的形式显示在屏幕上
cv2.waitKey() #在imshow之后如果没有waitKey语句则不会正常显示图像,程序等待用户触发按键操作
cv2.destroyAllWindows() #销毁所有创建的窗口
为什么OpenCV读取的图像格式是BGR?
答: OpenCV在1999年由Intel建立,当时主流的摄像头制造商和软件供应商提供的摄像头采集的图像的通道排列顺序为BGR,另外对于图片,位图BMP是最简单的,也是Windows显示图片的基本格式,其文件扩展名为*.BMP。在Windows下,任何格式的图片文件(包括视频播放)都要转化为位图才能显示出来,各种格式的图片文件也都是在位图格式的基础上采用不同的压缩算法生成的,值得注意的是位图BMP的格式就是BGR。正是基于BGR在当时被广泛使用,于是早期OpenCV开发者就选择BGR颜色格式,这也就成为了一种规范一直用到现在。
3. 图像属性
h,w,c = img.shape #tuple的第一维度是图像高度,对应numpy行数;第二维度是宽度,对应numpy列数;第三维度是通道数。
print('图像的像素: ',img.size) #如果img.shape=(224,224,3),则输出224*224*3=150528
print('图像的数据类型: ',img.dtype) #uint8
4. 图像处理
#平滑处理/图像模糊
img_Blur = cv2.blur(img,(5,5)) #均值滤波,5×5邻域
img_medianBlur = cv2.medianBlur(img,5) #中值滤波
img_GaussianBlur = cv2.GaussianBlur(img,(7,7),0) #高斯滤波
img_bilateral = cv2.bilateralFilter(img,9,75,75) #双边滤波,颜色和空间双线性3×3滤波
#形态学处理
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) #矩形结构
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) #椭圆结构
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5)) #十字形结构
kernel = np.ones((5, 5), np.uint8) #自定义kernel
erosion = cv2.erode(img, kernel) #腐蚀
dilation = cv2.dilate(img, kernel)