PIL,Skimage,OpenCV对图像处理的差异

一, PIL,Skimage,OpenCV是对图像处理的一些常用的库,一般进行深度学习前,都需要把图像或图片转换成数组ndarray格式,再按照tensor形式送入网络模型进行训练,在进入网络前,进行图片的读取,预处理(缩放,截取,增强,添加噪声等)操作必不可少。一般的图像处理PIL,Skimage都可以完成,但是复杂的图像处理还是需要更专业的OpenCV库。

二,PIL,Skimage,OpenCV针对图像的简单处理:open,resize,show操作,来认识不同图像库对图像处理上的一些不同。在深度学习中,避免数据预处理阶段的一些错误发生。
图像一般有彩色图(RGB or RGBA),灰度图(gray)
1.PIL 图像读取,缩放,显示,转ndarray:
优点:彩图与灰度图都可以读取,自己可以区分,不用操作者指定mode。颜色通道默认为RGB或RGBA的顺序
缺点:数据不能直接用于深度学习,需要ndarray转换。
注意:PIL默认显示为图像的宽高,经过ndarray转化后,变化高宽(行列)


    from PIL import Image
import numpy as np
#image = Image.open('test_rgba.png') # 图片读取RGBA
#image = Image.open('test_rgb.png') # 图片读取RGB
image = Image.open('test_gray.GIF') # 图片读取gray
print(type(image)) # out: PIL.JpegImagePlugin.JpegImageFile
print(image.size)  # out:  (宽度, 高度)
print(image.mode) # out: 'RGBA' or 'RGB' or 'L'

#print(image.shape) #'ImageFile' object has no attribute 'shape' 重点注意
#因为读取图片后为PIL格式,并非ndarray格式,不具有shape的属性
# resize w*h
image = image.resize((200,100),Image.NEAREST) #图片缩放
#Image.NEAREST,Image.BOX,Image.BILINEAR,Image.HAMMING,Image.BICUBIC,Image.LANCZOS 6中缩放算法
print(image.size) # out: (200,100)
image.show() #显示图片

#ndarray化,for后续放入网络
image = np.array(image) # image = np.array(image)默认是uint8
#image1 = np.array(image,dtype=np.float32)
#image = np.asarray(image) # image = np.array(image)默认是uint8
print(image.dtype)  #默认是uint8
print(image.shape) # out: (100,200,4) or (100,200,3) or (100,200)变成(高,宽),因为ndarray为先行,后列

  1. Skimage图像读取,缩放,显示:
    a.彩图用as_gray=True,因为灰度转换的关系,输出dtype(‘float64’),而且通道数从3变成1,如果本身是灰度图,输出为dtype(‘uint8’)
    b.灰度图用as_gray=False or True,输出都为dtype(‘uint8’),而且通道数都为单通道 。
    c.所以,一般情况下,选择as_gray=False对于彩色图片与灰度图都一样适用。图像的读取都不受影响。
    优点:有个as_gray参数可以设定,彩色可以直接转换为灰度图(float64)
    缺点:不希望转换灰度时,切记参数设定为as_gray=False。
import skimage
from skimage import io,transform
import numpy as np
import matplotlib.pyplot as plt

#################################################################################################
#彩图用as_grey=True,因为灰度转换的关系,输出dtype('float64'),而且通道数从3变成1,如果本身是灰度图,输出为dtype('uint8')
#灰度图用as_grey=False or True,输出都为dtype('uint8'),而且通道数都为单通道
#所以,一般情况下,as_grey=False对于彩色图片与灰度图都一样适用。
################################################################################################

#image = io.imread('test_rgba.png',as_gray=False)#彩图读取
#image = io.imread('test_rgba.png',as_gray=True)#彩图读取
#image = io.imread('test_gray.GIF',as_gray=True) #灰度图读取
image = io.imread('test_gray.GIF',as_gray=False) #灰度图读取
# 第一个参数是文件名可以是网络地址,第二个参数默认为False,True时为灰度图
print(type(image)) # out: ndarray
print(image.dtype) # out: dtype('uint8')
print(image.shape) # out: (300, 400, 4) or (300, 400, 3) or (300, 400)  (h,w,c)
#io.imshow(image) #显示图片
#plt.show()
# h*w
image = transform.resize(image,(100, 200),order=0) # 图片缩放
#resize后image范围又变成[0-1]
print(image.dtype) # out: dtype('float64')
print(image.shape) # out: (100, 200, 4) or (100, 200, 3) or (100, 200)  (h,w,c)
#print(image)
io.imshow(image)#显示图片
plt.show()
'''
resize函数接口
resize(image, output_shape, order=1, mode='constant', cval=0, clip=True, preserve_range=False)
order : int, optional
        The order of interpolation. The order has to be in the range 0-5:
         - 0: Nearest-neighbor
         - 1: Bi-linear (default)
         - 2: Bi-quadratic
         - 3: Bi-cubic
         - 4: Bi-quartic
         - 5: Bi-quintic
'''
  1. OpenCV 图像读取,缩放,显示:
    cv2.imread共两个参数,第一个参数为要读入的图片文件名,第二个参数为如何读取图片IMREAD_COLOR:以彩色BGR模式读入图片,可以用1表示;
    IMREAD_GRAYSCALE:以灰阶图读入一副彩色图片,可以用0表示;
    IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道,可以用-1表示。默认是1. 同时OpenCV不支持GIF格式的图片。
import cv2
import numpy as np

#cv2.imread共两个参数,第一个参数为要读入的图片文件名,第二个参数为如何读取图片
#cv2.IMREAD_COLOR:以彩色BGR模式读入图片,可以用1表示;
#cv2.IMREAD_GRAYSCALE:以灰阶图读入一副彩色图片,可以用0表示;
#cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道,可以用-1表示。

image = cv2.imread('test.png',1) #彩图读取
#image = cv2.imread('test_rgb.png') #彩图读取
#image = cv2.imread('test_gray.GIF') #彩图读取
print(type(image)) # out: numpy.ndarray
print(image.dtype) # out: dtype('uint8')
print(image.shape) # out: (300, 400, 3) (h,w,c) 和skimage类似
print(image) # BGR

# w*h
image = cv2.resize(image,(100,200),interpolation=cv2.INTER_LINEAR) # 图片缩放,也有多种算法
print(image.dtype) # out: dtype('uint8')
print(image.shape) # out: (100, 200, 3)


#图片的显示
cv2.namedWindow("Image")
cv2.imshow("Image",image)
cv2.waitKey(0)
cv2.destroyAllWindows()

你可能感兴趣的:(AI,图像的处理)