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)
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)
b,g,r = cv2.split(img) #通道分离
merge_img = cv2.merge((b,g,r))
#数组的切片操作
roi = img[100:300,30:350,:]
#缩放
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) #负值:-垂直+水平翻转
对图像进行滤波,可以有两种效果:一种是平滑滤波,用来抑制噪声;另一种是微分算子,可用来检测边缘和特征提取。
#中值滤波
img_medianBlur=cv2.medianBlur(img,5)
#均值滤波
img_Blur=cv2.blur(img,(5,5))
#高斯滤波
img_GaussianBlur=cv2.GaussianBlur(img,(7,7),0)
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'保存
img.format
图像格式;img.mode
图像类型,L为灰度图,RGB为真彩色,RGBA含有透明度通道。
注意:
img.size
返回的是图像的宽高(w,h)
,不包含通道;而opencv与matplotlib中返回的是图像的像素总数。
gary = Image.open('image.jpg').convert('L')
#通道的分离合并
r,g,b = img.split()
img = Image.merge('RGB',(r,g,b))
#复制图像
img_copy = img.copy()
roi = img.crop((200,300,400,500))# (左、上、右、下)即左上角和右下角像素点的坐标'x'与'y'
#缩放
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)#左右翻转
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()
由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指定平滑半径,也就是模糊的程度。
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')
img_r = img[:,:,0] #取单通道-r通道
plt.imshow(img_r)
plt.show()
输出并不是灰度图,得到灰度图需要添加cmap = 'Greys_r'
参数
plt.imshow(img_r,cmap='Greys_r')
plt.show()
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)
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)#灰度转彩色
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度,同时改变大小
skimage库中通过filters模块进行滤波操作。
from skimage import filters
edges = filters.sobel(img)
edges = filters.roberts(img)
from skimage import feature
edges1 = feature.canny(img) #sigma=1
edges2 = feature.canny(img,sigma=3)#sigma=3
filt_real,filt_fake = fileters.gabor_filter(img,frequency=0.4)
edges = filters.gaussian(img,sigma=0.4)
skimage.morphology
模块来设置滤波器的形状,滤波器越大,图像越模糊。from skimage.morphology import disk
edges = filters.median(img,disk(5))
import skimage.io as io
from skimage import data_dir
path='c:/pic/*.jpg:d:/pic/*.png'
img_coll = io.ImageCollection(path)
path
是两个路径合在一起的字符串,中间由:
隔开,可以再添加其他路径。
import os
os.rename(oldname,newname)#oldname,newname为文件名或者路径,需包含文件后缀。
欢迎指正错误,请评论区留言。