参考博客原址:https://blog.csdn.net/qq_36941368/article/details/82998296
Python的图像库(Opencv、PIL、matplotlib、skimage)的使用
Opencv
OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
读取操作
注意:
cv2读取的图片通道使按B、G、R排列的,而非RGB顺序。因此工程中opencv库与其他库混用时要注意,可以用img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
转化为RGB通道。
基本读取操作
import cv2
img = cv2.imread('image.jpg') #可读取tif格式图像
if img == None: #判断图像是否存在
print ('This file may not be available')
cv2.imshow('the window name',img)
cv2.waitKey()#在imshow之后如果没有waitKey语句则不会正常显示图像。
CV2.imwrite('new_image.jpg',img)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
img
numpy数组矩阵;img.shape
获取图像的(高,宽,通道数);img.size
图像的像素点数;img.dtype
图像的数据类型(uint8)。
灰度图读取
gray = cv2.imread('image.jpg',cv2.IMREAD_GRAYSCALE) #cv2.IMREAD_UNCHANGED 包含alpha通道(透明度)
#使用颜色转换函数cv2.cvtColor
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- 1
- 2
- 3
通道操作
b,g,r = cv2.split(img) #通道分离
merge_img = cv2.merge((b,g,r))
- 1
- 2
ROI操作
#数组的切片操作
roi = img[100:300,30:350,:]
- 1
- 2
图像处理
缩放与旋转
#缩放
img_resize = cv2.resize(img,(h,w)) #w,宽;h,高
#旋转 opencv中目前没有现成函数直接用来图像旋转,是用仿射变换函数warpAffine来实现的。
#cv2.getRotationMatrix2D() 参数1:旋转中心点;参数2:旋转角度;参数3:缩放大小。输出:旋转矩阵
Matrix = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
img_rotate = cv2.warpAffine(img,MMatrix,(cols,rows))
#翻转cv2.flip(img,filpcode)
img_filp=cv2.flip(img,0) #0:-垂直翻转
img_filp=cv2.flip(img,1) #1:-水平翻转
img_filp=cv2.flip(img,-1) #负值:-垂直+水平翻转
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
图像滤波
对图像进行滤波,可以有两种效果:一种是平滑滤波,用来抑制噪声;另一种是微分算子,可用来检测边缘和特征提取。
#中值滤波
img_medianBlur=cv2.medianBlur(img,5)
#均值滤波
img_Blur=cv2.blur(img,(5,5))
#高斯滤波
img_GaussianBlur=cv2.GaussianBlur(img,(7,7),0)
- 1
- 2
- 3
- 4
- 5
- 6
PIL
PIL(Python Imaging Library),即Pillow,相比opencv更为轻巧。Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、show等功能。
读取操作
PIL读取图片获得的不是矩阵,而是Image格式,可以利用numpy进行转化。
基本读取操作
from PIL import Image
import numpy as np
#读取图像
img = Image.open('image.jpg') #可以读取tif格式图片
img.show() #显示图像
img_arr = np.array(img) #3维矩阵
#存储图像
new_img = Image.fromarray(img_arr)
new_img.save('newimage.jpg') #如果不转矩阵可直接用'.save'保存
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
img.format
图像格式;img.mode
图像类型,L为灰度图,RGB为真彩色,RGBA含有透明度通道。
注意:
img.size
返回的是图像的宽高(w,h)
,不包含通道;而opencv与matplotlib中返回的是图像的像素总数。
灰度图读取
gary = Image.open('image.jpg').convert('L')
- 1
通道操作
#通道的分离合并
r,g,b = img.split()
img = Image.merge('RGB',(r,g,b))
#复制图像
img_copy = img.copy()
- 1
- 2
- 3
- 4
- 5
ROI获取
roi = img.crop((200,300,400,500))# (左、上、右、下)即左上角和右下角像素点的坐标'x'与'y'
- 1
图像处理
缩放与旋转
#缩放
img_resize = img.resize((h,w))
#旋转
img_r90 = img.rotate(90) #旋转90度
img_transpose_tb = img.transpose(Image.FLIP_TOP_BOTTOM)#上下翻转
img_transpose_lr = img.transpose(Image.FLIP_LEFT_RIGHT)#左右翻转
- 1
- 2
- 3
- 4
- 5
- 6
图像增强
PIL的ImageEnhance类专门用于图像增强处理,可以增强(减弱)图像的亮度、对比度、色度、以及锐度。
from PIL import Image
from PIL import ImageEnhance
#原始图像
img = Image.open('image.jpg')
#亮度增强
img_bright = ImageEnhance.Brightness(imag)
brightness = 3
image_brighted = img_bright.enhance(brightness)
image_brighted.show()
#色度增强
img_color = ImageEnhance.Color(img)
color = 2
image_colored = img_color.enhance(color)
image_colored.show()
#对比度增强
img_contrast = ImageEnhance.Contrast(img)
contrast = 3
image_contrasted = img_contrast.enhance(contrast)
image_contrasted.show()
#锐度增强
img_sharp = ImageEnhance.Sharpness(img)
sharpness = 2
image_sharped = img_sharp.enhance(sharpness)
image_sharped.show()
- 1
- 2
- 3
- 4
- 5
- 图像滤波
由PIL中的ImageFilter类实现。
from PIL import ImageFilter #模糊滤波 img_blur = img.filter(ImageFilter.BLUR) #轮廓滤波 img_contour = img.filter(ImageFilter.CONTOUR) #细节滤波 img_detail = img.filter(ImageFilter.DETAIL) #边界增强滤波 img_edge_enhance = img.filter(ImageFilter.EDGE_ENHANCE) #锐化滤波 img_sharp = img.filter(ImageFilter.SHARPEN) #高斯模糊滤波 img_gauss = img.filter(ImageFilter.GaussianBlur(radius=2)) # radius指定平滑半径,也就是模糊的程度。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
matplotlib
Matplotlib是一个Python 2D绘图库,它可以在不同的平台上以各种硬拷贝格式和交互环境生成发布质量数据。Matplotlib可以用于Python脚本、Python和IPython shell、Jupyter notebook、web应用服务器和四个图形用户界面工具包。对于简单的绘图,pyplot模块提供了一个类似于matlab的接口,特别是与IPython结合使用时。对于power用户,您可以通过面向对象的界面或通过MATLAB用户熟悉的一组函数来完全控制线样式、字体属性、轴属性等.
图像读取
基本读取操作
import matplotlib.pyplot as plt
import numpy as np
img = plt.imread('image.jpg') #可以读取tif文件
plt.imshow(img)
#plt.axis('off') #关闭坐标轴上的数字
plt.show()
plt.savefig('new_img.jpg')
- 1
- 2
- 3
- 4
- 5
灰度图
img_r = img[:,:,0] #取单通道-r通道
plt.imshow(img_r)
plt.show()
- 1
- 2
- 3
输出图像示例:
输出并不是灰度图,得到灰度图需要添加cmap = 'Greys_r'
参数
plt.imshow(img_r,cmap='Greys_r')
plt.show()
- 1
- 2
灰度图:
skimage
scikit-image是一组用于图像处理和计算机视觉的算法。“skimage”的主要包只提供了一些用于转换图像数据类型的实用程序;大多数功能程序存在其子包中。读取功能包含在io模块中。
读取操作
基本读取操作
可以读取tif格式图片,保存之前要将数据转换成uint8,否则会报错。
from skimage import io
img = io.imread('image.jpg')
io.imshow(img)
io.show()
io.imsave('new_img.jpg',img)
- 1
- 2
- 3
- 4
- 5
- 6
灰度图读取
img_grey = io.imread('image.jpg',as_grey=True)
print(img_grey.dtype) #float64 原因加入as_grey参数后,imread将灰度图的矩阵值归一化。
#可以用skimage中的color模块得到灰度图
img_grey = color.rgb2grey(img) #彩色转灰度
skimage.clolor.grey2rgb(img_grey)#灰度转彩色
- 1
- 2
- 3
- 4
- 5
图像处理
图像缩放与旋转
from skimage import transform
#resize
img_resize = transform.resize(img,(h,w)) #(h,w)新图像尺寸
#rescale #按比例缩放
img_r1 = transform.rescale(img,0.1) #将图像高宽缩小为原图片大小的0.1倍
img_r2 = transform.rescale(img,[0.5,0.2])#高缩小到0.5倍,宽缩小到0.2倍
#旋转rotate
img_90 = transform.rotate(img,90) #旋转90度不改变大小
img_30 = transform.rotate(img,30,resize=True)#旋转30度,同时改变大小
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
图像滤波
skimage库中通过filters模块进行滤波操作。
- sobel算子,sobel算子可以用来检测边缘
from skimage import filters
edges = filters.sobel(img)
- 1
- 2
- roberts算子,用于检测边缘
edges = filters.roberts(img)
- 1
- canny算子,用于提取边缘特征,在feature模块内,通过修改sigma的值来调整效果,sigma越小线条越细。
from skimage import feature
edges1 = feature.canny(img) #sigma=1
edges2 = feature.canny(img,sigma=3)#sigma=3
- 1
- 2
- 3
- gabor滤波,用于边缘检测和纹理特征提取,通过调整frequency值来调整滤波效果,返回一对边缘结果,一个是用真实滤波核的滤波结果,另一个是想象滤波核的滤波结果。
filt_real,filt_fake = fileters.gabor_filter(img,frequency=0.4)
- 1
- gaussian滤波,多维滤波器,平滑滤波,可以消除高斯噪声,通过调节sigma的值来调整滤波效果,sigma越大,图像越模糊。
edges = filters.gaussian(img,sigma=0.4)
- 1
- median滤波,中值滤波,平湖滤波,消除噪声。需要用
skimage.morphology
模块来设置滤波器的形状,滤波器越大,图像越模糊。
from skimage.morphology import disk
edges = filters.median(img,disk(5))
- 1
- 2
图像批处理操作
- 从不同文件夹里读取不同格式的图片:
import skimage.io as io
from skimage import data_dir
path='c:/pic/*.jpg:d:/pic/*.png'
img_coll = io.ImageCollection(path)
- 1
- 2
- 3
- 4
path
是两个路径合在一起的字符串,中间由:
隔开,可以再添加其他路径。
- 批量重命名
import os
os.rename(oldname,newname)#oldname,newname为文件名或者路径,需包含文件后缀。
- 1
- 2