在Python中,用于做图像处理的常用库有matplotlib, PIL, OpenCV。下面将对其进行一一介绍:
一、matplotlib
matplotlib操作方式类似于matlab,我本人较为喜欢的图像处理库。
1.显示图片
import matplotlib.pyplot as plt #用于显示的类
import matplotlib.image as mpimg #用于读取图片的类
lena = mpimg.imread('example1.jpg') #输出的是ndarray类型,un
rows = lena.shape[0] #图片的rows
cols = lena.shape[1] #图片的cols
print(rows, cols)
plt.imshow(lena) #显示图片
plt.axis('off') #不显示坐标轴
plt.show() #输出
2.显示图像某个区域与通道的信息
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
lena = mpimg.imread('example1.jpg')
lena_1 = lena[:200,:300,0] # 横向0-200,纵向0-300,R通道数值(0为R,1为G,2为B)
plt.subplot(121)
plt.imshow(lena_1) #显示的是伪彩色的热力图
plt.subplot(122)
plt.imshow(lena_1, cmap='Greys_r') #显示真实灰色图
plt.show()
3.将RGB转换成灰度图
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np #与
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from scipy import misc
import numpy as np
lena = mpimg.imread('example1.jpg')
#缩小
lena_new_d = misc.imresize(lena, 0.5) #第二个参数如果是小数,则为百分比,如果是tuple,则为输出图像的尺寸
#放大
lena_new_u = misc.imresize(lena, 2.0) #注意这里的2.0要写小数形式,如果写整数意味着原始图像尺寸乘以2%
plt.subplot(121)
plt.imshow(lena_new_d)
plt.subplot(122)
plt.imshow(lena_new_u)
#保存matplotlib画出的图像
plt.savefig('lena_new_sz.jpg')
#直接保存array
np.save('lena_new_d', lena_new_d)
np.save('lena_new_u', lena_new_u)
#将array保存为图像
misc.imsave('lena_new_d.jpg', lena_new_d)
misc.imsave('lena_new_u.jpg', lena_new_u)
#直接保存
plt.show()
矩阵运算相关的类def rgb2gray(rgb): return np.dot(rgb[...,:3], [0.299, 0.587, 0.114]) #对应RGB位置的点乘lena = mpimg.imread('example1.jpg')gray = rgb2gray(lena)plt.imshow(gray, cmap='Greys_r')plt.axis('off')plt.show()
4.对图像进行缩放并保存
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from scipy import misc
import numpy as np
lena = mpimg.imread('example1.jpg')
#缩小
lena_new_d = misc.imresize(lena, 0.5) #第二个参数如果是小数,则为百分比,如果是tuple,则为输出图像的尺寸
#放大
lena_new_u = misc.imresize(lena, 2.0) #注意这里的2.0要写小数形式,如果写整数意味着原始图像尺寸乘以2%
plt.subplot(121)
plt.imshow(lena_new_d)
plt.subplot(122)
plt.imshow(lena_new_u)
#保存matplotlib画出的图像
plt.savefig('lena_new_sz.jpg')
#直接保存array
np.save('lena_new_d', lena_new_d)
np.save('lena_new_u', lena_new_u)
#将array保存为图像
misc.imsave('lena_new_d.jpg', lena_new_d)
misc.imsave('lena_new_u.jpg', lena_new_u)
#
plt.show()
5.读取上面保存的数组
import matplotlib.pyplot as plt
import numpy as np
img1 = np.load('lena_new_d.npy')
img2 = np.load('lena_new_u.npy')
plt.subplot(121)
plt.imshow(img1)
plt.subplot(122)
plt.imshow(img2)
plt.show()
二、PIL
PIL是python里标准的图像处理库,可以对显示后的图像进行多种可视化处理操作。
1.显示图片
from PIL import Image #调用PIL类
im = Image.open('example2.jpg') #输出JpegImageFile形式
im.show()
鼠标左键图像窗口显示对其进行图像处理的commands
2.将PIL转换为numpy数组
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
im = Image.open('example2.jpg')
im_array = np.array(im)
plt.imshow(im_array)
plt.show()
3.保存PIL图片
from PIL import Image
im = Image.open('example2.jpg')
im.save('exam2.jpg')
4.将numpy数组转换为PIL类
import matplotlib.image as mping
from PIL import Image
import numpy as np
lena = mping.imread('example2.jpg')
im = Image.fromarray(np.uint8(lena))
im.show()
5.RGB图像转换成灰度图
from PIL import Image
I = Image.open('example2.jpg')
L = I.convert('L')
L.show()
3、OpenCV
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,其提供了Python等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。本人用opencv3.3.0版本。OpenCV+Python3.6开发环境配置见链接:点击打开链接
1.读取图片
import cv2 #调用opencv有关类
im = cv2.imread('example3.jpg') #输出为ndarray类,dtype=uint8
rows = im.shape[0]
cols = im.shape[1]
print(rows, cols)
cv2.namedWindow('img1', 1)
cv2.imshow('img1', im)
cv2.waitKey(0)
2.将OpenCV类转换为numpy类型(虽然两者输出格式同为ndarray,但因为RGB片排列方式不同,则需要对矩阵进行
数学意义上的转换)
import cv2
import matplotlib.pyplot as plt
import numpy as np
im = cv2.imread('example3.jpg')
rows = im.shape[0]
cols = im.shape[1]
im_np = np.zeros([rows, cols, 3], 'uint8') #构建与im相同大小与类型的矩阵
# cv2中矩阵的第三维度数值从0-2一次对应图像的B通道,G通道,R通道
# 而在matplotlib.image中的0-2对应图像的R通道,G通道,B通道
im_np[:,:,0] = im[:,:,2]
im_np[:,:,1] = im[:,:,1]
im_np[:,:,2] = im[:,:,0]
plt.subplot(121)
plt.imshow(im)
plt.subplot(122)
plt.imshow(im_np)
plt.axis("off")
plt.show()
OpenCV类型转换为IPL的方法同二中的4小节。