精华内容
下载资源
问答
  • Python各类图像库的图片读写...我最常用的图像库当然是opencv,很强大很好用,但是opencv也有一些坑,不注意的话也会出大麻烦。近期我也在看一些别人写的代码,因为个人习惯不一样,他们在做深度学习时用于图片读...

    Python各类图像库的图片读写方式总结

    最近在研究深度学习视觉相关的东西,经常需要写python代码搭建深度学习模型。比如写CNN模型相关代码时,我们需要借助python图像库来读取图像并进行一系列的图像处理工作。我最常用的图像库当然是opencv,很强大很好用,但是opencv也有一些坑,不注意的话也会搞出大麻烦。近期我也在看一些别人写的代码,因为个人习惯不一样,他们在做深度学习时用于图片读取的图像库各不相同,从opencv到PIL再到skimage等等各种库都有,有些库读进来的图片存储方式也不太一样,如果不好好总结这些主流图像读写库特点的话,以后看代码写代码都会遇坑无数。这篇文章就总结了以下主流Python图像库的一些基本使用方法和需要注意的地方:

    1. opencv
    2. PIL(pillow)
    3. matplotlib.image
    4. scipy.misc
    5. skimage

    opencv: cv2.imread

    opencv作为我最常用的图像处理库,当然第一个介绍,并且介绍得比较全面。毋庸置疑,opencv是今天介绍得所有图像库中最全面也最强大的库,如果我们只想掌握一个图像库,我觉得opencv库肯定是最适合不过了。

    图片读取操作

    import cv2
    import numpy as np
    
    #读入图片:默认彩色图,cv2.IMREAD_GRAYSCALE灰度图,cv2.IMREAD_UNCHANGED包含alpha通道
    img = cv2.imread('1.jpg')
    cv2.imshow('src',img)
    print(img.shape) # (h,w,c)
    print(img.size) # 像素总数目
    print(img.dtype)
    print(img)
    cv2.waitKey()

    值得注意的是,opencv读进来的图片已经是一个numpy矩阵了,彩色图片维度是(高度,宽度,通道数)。数据类型是uint8。

    #gray = cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE) #灰度图
    #cv2.imshow('gray',gray)
    #也可以这么写,先读入彩色图,再转灰度图
    src = cv2.imread('1.jpg')
    gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    cv2.imshow('gray',gray)
    print(gray.shape)
    print(gray.size)
    print(gray)
    cv2.waitKey()

    上面提到了两种获取灰度图的方式,读进来的灰度图的矩阵格式是(高度,宽度)。

    #注意,计算图片路径是错的,Opencv也不会提醒你,但print img时得到的结果是None
    img2 = cv2.imread('2.jpg')
    print(img2)

    #如何解决“读到的图片不存在的问题”? #加入判断语句,如果为空,做异常处理
    img2 = cv2.imread('2.jpg')
    if img2 == None:
        print('fail to load image!')

    图片矩阵变换

    opencv读入图片的矩阵格式是:(height,width,channels)。而在深度学习中,因为要对不同通道应用卷积,所以会采取另一种方式:(channels,height,width)。为了应对该要求,我们可以这么做

    #注意到,opencv读入的图片的彩色图是一个channel last的三维矩阵(h,w,c),即(高度,宽度,通道)
    #有时候在深度学习中用到的的图片矩阵形式可能是channel first,那我们可以这样转一下
    print(img.shape)
    img = img.transpose(2,0,1)
    print(img.shape)

    在深度学习搭建CNN时,往往要做相应的图像数据处理,比如图像要扩展维度,比如扩展成(batch_size,channels,height,width)。

    对于这种要求,我们可以这么做。

    #有时候还要扩展维度,比如有时候我们需要预测单张图片,要在要加一列做图片的个数,可以这么做
    img = np.expand_dims(img, axis=0)
    print(img.shape)

    上面提到的是预测阶段时预测单张图片的扩展维度的操作,如果是训练阶段,构建batch,即得到这种形式:(batch_size,channels,height,width)。我一般喜欢这么做

    data_list = [] 
    loop:
        im = cv2.imread('xxx.png')
        data_list.append(im)
    data_arr = np.array(data_list)

    这样子就能构造成我们想要的形式了。

    图片归一化

    #因为opencv读入的图片矩阵数值是0到255,有时我们需要对其进行归一化为0~1
    img3 = cv2.imread('1.jpg')
    img3 = img3.astype("float") / 255.0  #注意需要先转化数据类型为float
    print(img3.dtype)
    print(img3)

    存储图片

    #存储图片
    cv2.imwrite('test1.jpg',img3) #得到的是全黑的图片,因为我们把它归一化了
    #所以要得到可视化的图,需要先*255还原
    img3 = img3 * 255
    cv2.imwrite('test2.jpg',img3)  #这样就可以看到彩色原图了

    opencv大坑之BGR

    opencv对于读进来的图片的通道排列是BGR,而不是主流的RGB!谨记!

    #opencv读入的矩阵是BGR,如果想转为RGB,可以这么转
    img4 = cv2.imread('1.jpg')
    img4 = cv2.cvtColor(img4,cv2.COLOR_BGR2RGB)

    访问像素

    #访问像素
    print(img4[10,10])  #3channels
    print(gray[10,10]) #1channel
    img4[10,10] = [255,255,255]
    gray[10,10] = 255
    print(img4[10,10])  #3channels
    print(gray[10,10]) #1channel

    ROI操作

    #roi操作
    roi = img4[200:550,100:450,:]
    cv2.imshow('roi',roi)
    cv2.waitKey()

    通道操作

    #分离通道
    img5 = cv2.imread('1.jpg')
    b,g,r = cv2.split(img5)
    #合并通道
    img5 = cv2.merge((b,g,r))
    #也可以不拆分
    img5[:,:,2] = 0  #将红色通道值全部设0

    PIL:PIL.Image.open

    图片读取

    from PIL import Image
    import numpy as np

    PIL即Python Imaging Library,也即为我们所称的Pillow,是一个很流行的图像库,它比opencv更为轻巧,正因如此,它深受大众的喜爱。

    图像读写

    PIL读进来的图像是一个对象,而不是我们所熟知的numpy 矩阵。

    img = Image.open('1.jpg')
    print(img.format) 
    print(img.size) #注意,省略了通道 (w,h)
    print(img.mode)  #L为灰度图,RGB为真彩色,RGBA为加了透明通道
    img.show() # 显示图片

    灰度图的获取

    gray = Image.open('1.jpg').convert('L')
    gray.show()

    #读取不到图片会抛出异常IOError,我们可以捕捉它,做异常处理
    try:
        img2 = Image.open('2.jpg')
    except IOError:
        print('fail to load image!')

    #pillow读进来的图片不是矩阵,我们将图片转矩阵,channel last
    arr = np.array(img3)
    print(arr.shape)
    print(arr.dtype)
    print(arr)

    灰度图的转化与彩图转化一样

    arr_gray = np.array(gray)
    print(arr_gray.shape)
    print(arr_gray.dtype)
    print(arr_gray)

    存储图片

    #矩阵再转为图像
    new_im = Image.fromarray(arr)
    new_im.save('3.png')

    图像操作

    #分离合并通道
    r, g, b = img.split()
    img = Image.merge("RGB", (b, g, r))
    img = img.copy() #复制图像

    ROI获取

    img3 = Image.open('1.jpg')
    roi = img3.crop((0,0,300,300)) #(左上x,左上y,右下x,右下y)坐标
    roi.show()

    matplotlib:matplotlib.image.imread

    matplotlib是一个科学绘图神器,用的人非常多。

    import matplotlib.pyplot as plt
    import numpy as np
    image = plt.imread('1.jpg')
    plt.imshow(image)
    plt.show()

    #也可以关闭显示x,y轴上的数字
    image = plt.imread('1.jpg')
    plt.imshow(image)
    plt.axis('off')
    plt.show()

    #plt.imread读入的就是一个矩阵,跟opencv一样,但彩图读进的是RGB,与opencv有区别
    print(image.shape) # (h,w,c)
    print(image.size)
    print(image.dtype) 
    print(image)

    im_r = image[:,:,0] #红色通道
    plt.imshow(im_r)
    plt.show()
    #此时会发现显示的是热量图,不是我们预想的灰度图,可以添加 cmap 参数解决
    plt.imshow(im_r,cmap='Greys_r')
    plt.show()
    
    

    #与opencv结合使用
    import cv2
    im2 = cv2.imread('1.jpg')
    plt.imshow(im2)
    plt.axis('off')
    plt.show()
    #发现图像颜色怪怪的,原因当然是我们前面提到的RGB顺序不同的原因啦,转一下就好
    im2 = cv2.cvtColor(im2,cv2.COLOR_BGR2RGB)
    plt.imshow(im2)
    plt.axis('off')
    plt.show()
    #所以无论用什么库读进图片,只要把图片改为矩阵,那么matplotlib就可以处理了

    #再试一试pillow和matplotlib结合
    from PIL import Image
    im3 = Image.open('1.jpg')
    im3 = np.array(im3)
    plt.figure(1)
    plt.imshow(im3)
    plt.axis('off')
    #存储图像,注意,必须在show之前savefig,否则存储的图片一片空白
    plt.savefig('timo.jpg')
    plt.show()

    #最后以一个综合例子总结matplotlib最基本的图片显示技巧吧
    im_lol1 =  plt.imread('lol.jpg')
    im_lol2 =  plt.imread('1.jpg')
    figure = plt.figure(figsize=(20,10)) # 调整显示图片的大小
    '''
    figsize参数:指定绘图对象的宽度和高度,单位为英寸;dpi参数指定绘图对象的分辨率,
    即每英寸多少个像素,缺省值为80。因此本例中所创建的图表窗口的宽度为8*80 = 640像素
    '''
    plt.axis("off")#不显示刻度 
    ax = figure.add_subplot(121) # 图片以1行2列的形式显示
    plt.axis('off')
    ax.imshow(im_lol1) #第一张图
    ax.set_title('lol image 1')#给图片加titile 
    ax = figure.add_subplot(122) 
    plt.axis('off')
    ax.imshow(im_lol2) 
    ax.set_title('lol image 2')#给图片加titile 
    
    plt.savefig('twp.jpg')
    plt.show()

    scipy.misc:scipy.misc.imread

    from scipy import misc
    import matplotlib.pyplot as plt
    im = misc.imread('1.jpg')
    print(im.dtype)
    print(im.size)
    print(im.shape)
    misc.imsave('misc1.png',im)
    plt.imshow(im)
    plt.show()
    print(im)

    可以看到,有warining,提示我们imread和imsave在后来的版本将会被弃用,叫我们使用imageio.imread和imageio.imwrite。

    我们根据她的提示,使用imageio模块进行图片读写,warning也就没有了。

    import imageio
    im2 = imageio.imread('1.jpg')
    print(im2.dtype)
    print(im2.size)
    print(im2.shape)
    plt.imshow(im)
    plt.show()
    print(im2)
    imageio.imsave('imageio.png',im2)

    skimage:skimage.io.imread

    from skimage import io
    
    im = io.imread('1.jpg')
    print(im.shape) # numpy矩阵,(h,w,c)
    print(im.dtype)
    print(im.size)
    io.imshow(im)
    io.imsave('sk.png',im)
    print(im)
    

    图像也是以numpy array形式读入。

    灰度图的获取方式:

    im2 = io.imread('1.jpg',as_grey=True)  #读入灰度图
    print(im2.dtype)
    print(im2.size)
    print(im2.shape)
    io.imshow(im2)
    io.imsave('sk_gray.png',im2)
    io.show()
    print(im2)
    

    可以看到,灰度图像的矩阵的值被归一化了,注意注意!

    也可以以这种方式获得灰度图:

    from skimage import color
    im3 = io.imread('1.jpg')
    im3 = color.rgb2grey(im3)
    print(im3.dtype)
    print(im3.size)
    print(im3.shape)
    io.imshow(im3)
    io.show()
    
    '''
    skimage.color.rgb2grey(rgb)
    skimage.color.rgb2hsv(rgb)
    skimage.color.rgb2lab(rgb)
    skimage.color.gray2rgb(image)
    skimage.color.hsv2rgb(hsv)
    skimage.color.lab2rgb(lab)
    
    '''

    总结

    1. 除了opencv读入的彩色图片以BGR顺序存储外,其他所有图像库读入彩色图片都以RGB存储。
    2. 除了PIL读入的图片是img类之外,其他库读进来的图片都是以numpy 矩阵。
    3. 各大图像库的性能,老大哥当属opencv,无论是速度还是图片操作的全面性,都属于碾压的存在,毕竟他是一个巨大的cv专用库。下面那张图就是我从知乎盗来的一张关于各个主流图像库的一些性能比较图,从测试结果看来,opencv确实胜出太多了。

    展开全文
  • Python各类图像库的图片读写方式总结 转载:Python各类图像库的图片读写方式总结 ...我最常用的图像库当然是opencv,很强大很好用,但是opencv也有一些坑,不注意的话也会出大麻烦。近期我也在看一...

    Python各类图像库的图片读写方式总结

    转载:Python各类图像库的图片读写方式总结

           最近在研究深度学习视觉相关的东西,经常需要写python代码搭建深度学习模型。比如写CNN模型相关代码时,我们需要借助python图像库来读取图像并进行一系列的图像处理工作。我最常用的图像库当然是opencv,很强大很好用,但是opencv也有一些坑,不注意的话也会搞出大麻烦。近期我也在看一些别人写的代码,因为个人习惯不一样,他们在做深度学习时用于图片读取的图像库各不相同,从opencv到PIL再到skimage等等各种库都有,有些库读进来的图片存储方式也不太一样,如果不好好总结这些主流图像读写库特点的话,以后看代码写代码都会遇坑无数。这篇文章就总结了以下主流Python图像库的一些基本使用方法和需要注意的地方:

    1. opencv

    2. PIL(pillow)

    3. matplotlib.image

    4. scipy.misc

    5. skimage

     

     

    opencv: cv2.imread

    opencv作为我最常用的图像处理库,当然第一个介绍,并且介绍得比较全面。毋庸置疑,opencv是今天介绍得所有图像库中最全面也最强大的库,如果我们只想掌握一个图像库,我觉得opencv库肯定是最适合不过了。

    图片读取操作

    import cv2
    import numpy as np
    
    #读入图片:默认彩色图,cv2.IMREAD_GRAYSCALE灰度图,cv2.IMREAD_UNCHANGED包含alpha通道
    img = cv2.imread('1.jpg')
    cv2.imshow('src',img)
    print(img.shape) # (h,w,c)
    print(img.size) # 像素总数目
    print(img.dtype)
    print(img)
    cv2.waitKey()

    值得注意的是,opencv读进来的图片已经是一个numpy矩阵了,彩色图片维度是(高度,宽度,通道数)。数据类型是uint8。

    #gray = cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE) #灰度图
    #cv2.imshow('gray',gray)
    #也可以这么写,先读入彩色图,再转灰度图
    src = cv2.imread('1.jpg')
    gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    cv2.imshow('gray',gray)
    print(gray.shape)
    print(gray.size)
    print(gray)
    cv2.waitKey()

    上面提到了两种获取灰度图的方式,读进来的灰度图的矩阵格式是(高度,宽度)。

    #注意,计算图片路径是错的,Opencv也不会提醒你,但print img时得到的结果是None
    img2 = cv2.imread('2.jpg')
    print(img2)

    #如何解决“读到的图片不存在的问题”? #加入判断语句,如果为空,做异常处理
    img2 = cv2.imread('2.jpg')
    if img2 == None:
        print('fail to load image!')

    图片矩阵变换

    opencv读入图片的矩阵格式是:(height,width,channels)。而在深度学习中,因为要对不同通道应用卷积,所以会采取另一种方式:(channels,height,width)。为了应对该要求,我们可以这么做

    #注意到,opencv读入的图片的彩色图是一个channel last的三维矩阵(h,w,c),即(高度,宽度,通道)
    #有时候在深度学习中用到的的图片矩阵形式可能是channel first,那我们可以这样转一下
    print(img.shape)
    img = img.transpose(2,0,1)
    print(img.shape)

    在深度学习搭建CNN时,往往要做相应的图像数据处理,比如图像要扩展维度,比如扩展成(batch_size,channels,height,width)。

    对于这种要求,我们可以这么做。

    #有时候还要扩展维度,比如有时候我们需要预测单张图片,要在要加一列做图片的个数,可以这么做
    img = np.expand_dims(img, axis=0)
    print(img.shape)

    上面提到的是预测阶段时预测单张图片的扩展维度的操作,如果是训练阶段,构建batch,即得到这种形式:(batch_size,channels,height,width)。我一般喜欢这么做

    data_list = [] 
    loop:
        im = cv2.imread('xxx.png')
        data_list.append(im)
    data_arr = np.array(data_list)

    这样子就能构造成我们想要的形式了。

    图片归一化

    #因为opencv读入的图片矩阵数值是0到255,有时我们需要对其进行归一化为0~1
    img3 = cv2.imread('1.jpg')
    img3 = img3.astype("float") / 255.0  #注意需要先转化数据类型为float
    print(img3.dtype)
    print(img3)

    存储图片

    #存储图片
    cv2.imwrite('test1.jpg',img3) #得到的是全黑的图片,因为我们把它归一化了
    #所以要得到可视化的图,需要先*255还原
    img3 = img3 * 255
    cv2.imwrite('test2.jpg',img3)  #这样就可以看到彩色原图了

    opencv大坑之BGR

    opencv对于读进来的图片的通道排列是BGR,而不是主流的RGB!谨记!

    #opencv读入的矩阵是BGR,如果想转为RGB,可以这么转
    img4 = cv2.imread('1.jpg')
    img4 = cv2.cvtColor(img4,cv2.COLOR_BGR2RGB)

    访问像素

    #访问像素
    print(img4[10,10])  #3channels
    print(gray[10,10]) #1channel
    img4[10,10] = [255,255,255]
    gray[10,10] = 255
    print(img4[10,10])  #3channels
    print(gray[10,10]) #1channel

    ROI操作

    #roi操作
    roi = img4[200:550,100:450,:]
    cv2.imshow('roi',roi)
    cv2.waitKey()

    通道操作

    #分离通道
    img5 = cv2.imread('1.jpg')
    b,g,r = cv2.split(img5)
    #合并通道
    img5 = cv2.merge((b,g,r))
    #也可以不拆分
    img5[:,:,2] = 0  #将红色通道值全部设0

     

     

    PIL:PIL.Image.open

    图片读取

    from PIL import Image
    import numpy as np

    PIL即Python Imaging Library,也即为我们所称的Pillow,是一个很流行的图像库,它比opencv更为轻巧,正因如此,它深受大众的喜爱。

    图像读写

    PIL读进来的图像是一个对象,而不是我们所熟知的numpy 矩阵。

    img = Image.open('1.jpg')
    print(img.format) 
    print(img.size) #注意,省略了通道 (w,h)
    print(img.mode)  #L为灰度图,RGB为真彩色,RGBA为加了透明通道
    img.show() # 显示图片

    灰度图的获取

    gray = Image.open('1.jpg').convert('L')
    gray.show()

    #读取不到图片会抛出异常IOError,我们可以捕捉它,做异常处理
    try:
        img2 = Image.open('2.jpg')
    except IOError:
        print('fail to load image!')

    #pillow读进来的图片不是矩阵,我们将图片转矩阵,channel last
    arr = np.array(img3)
    print(arr.shape)
    print(arr.dtype)
    print(arr)

    灰度图的转化与彩图转化一样

    arr_gray = np.array(gray)
    print(arr_gray.shape)
    print(arr_gray.dtype)
    print(arr_gray)

    存储图片

    #矩阵再转为图像
    new_im = Image.fromarray(arr)
    new_im.save('3.png')

    图像操作

    #分离合并通道
    r, g, b = img.split()
    img = Image.merge("RGB", (b, g, r))
    img = img.copy() #复制图像

    ROI获取

    img3 = Image.open('1.jpg')
    roi = img3.crop((0,0,300,300)) #(左上x,左上y,右下x,右下y)坐标
    roi.show()

     

     

    matplotlib:matplotlib.image.imread

    matplotlib是一个科学绘图神器,用的人非常多。

    import matplotlib.pyplot as plt
    import numpy as np
    image = plt.imread('1.jpg')
    plt.imshow(image)
    plt.show()

    #也可以关闭显示x,y轴上的数字
    image = plt.imread('1.jpg')
    plt.imshow(image)
    plt.axis('off')
    plt.show()

    #plt.imread读入的就是一个矩阵,跟opencv一样,但彩图读进的是RGB,与opencv有区别
    print(image.shape) # (h,w,c)
    print(image.size)
    print(image.dtype) 
    print(image)

    im_r = image[:,:,0] #红色通道
    plt.imshow(im_r)
    plt.show()
    #此时会发现显示的是热量图,不是我们预想的灰度图,可以添加 cmap 参数解决
    plt.imshow(im_r,cmap='Greys_r')
    plt.show()
    
    

    #与opencv结合使用
    import cv2
    im2 = cv2.imread('1.jpg')
    plt.imshow(im2)
    plt.axis('off')
    plt.show()
    #发现图像颜色怪怪的,原因当然是我们前面提到的RGB顺序不同的原因啦,转一下就好
    im2 = cv2.cvtColor(im2,cv2.COLOR_BGR2RGB)
    plt.imshow(im2)
    plt.axis('off')
    plt.show()
    #所以无论用什么库读进图片,只要把图片改为矩阵,那么matplotlib就可以处理了

    #再试一试pillow和matplotlib结合
    from PIL import Image
    im3 = Image.open('1.jpg')
    im3 = np.array(im3)
    plt.figure(1)
    plt.imshow(im3)
    plt.axis('off')
    #存储图像,注意,必须在show之前savefig,否则存储的图片一片空白
    plt.savefig('timo.jpg')
    plt.show()

    #最后以一个综合例子总结matplotlib最基本的图片显示技巧吧
    im_lol1 =  plt.imread('lol.jpg')
    im_lol2 =  plt.imread('1.jpg')
    figure = plt.figure(figsize=(20,10)) # 调整显示图片的大小
    '''
    figsize参数:指定绘图对象的宽度和高度,单位为英寸;dpi参数指定绘图对象的分辨率,
    即每英寸多少个像素,缺省值为80。因此本例中所创建的图表窗口的宽度为8*80 = 640像素
    '''
    plt.axis("off")#不显示刻度 
    ax = figure.add_subplot(121) # 图片以1行2列的形式显示
    plt.axis('off')
    ax.imshow(im_lol1) #第一张图
    ax.set_title('lol image 1')#给图片加titile 
    ax = figure.add_subplot(122) 
    plt.axis('off')
    ax.imshow(im_lol2) 
    ax.set_title('lol image 2')#给图片加titile 
    
    plt.savefig('twp.jpg')
    plt.show()

     

     

    scipy.misc:scipy.misc.imread

    from scipy import misc
    import matplotlib.pyplot as plt
    im = misc.imread('1.jpg')
    print(im.dtype)
    print(im.size)
    print(im.shape)
    misc.imsave('misc1.png',im)
    plt.imshow(im)
    plt.show()
    print(im)

    可以看到,有warining,提示我们imread和imsave在后来的版本将会被弃用,叫我们使用imageio.imread和imageio.imwrite。

    我们根据她的提示,使用imageio模块进行图片读写,warning也就没有了。

    import imageio
    im2 = imageio.imread('1.jpg')
    print(im2.dtype)
    print(im2.size)
    print(im2.shape)
    plt.imshow(im)
    plt.show()
    print(im2)
    imageio.imsave('imageio.png',im2)

     

     

    skimage:skimage.io.imread

    from skimage import io
    
    im = io.imread('1.jpg')
    print(im.shape) # numpy矩阵,(h,w,c)
    print(im.dtype)
    print(im.size)
    io.imshow(im)
    io.imsave('sk.png',im)
    print(im)
    

    图像也是以numpy array形式读入。

    灰度图的获取方式:

    im2 = io.imread('1.jpg',as_grey=True)  #读入灰度图
    print(im2.dtype)
    print(im2.size)
    print(im2.shape)
    io.imshow(im2)
    io.imsave('sk_gray.png',im2)
    io.show()
    print(im2)
    

    可以看到,灰度图像的矩阵的值被归一化了,注意注意!

    也可以以这种方式获得灰度图:

    from skimage import color
    im3 = io.imread('1.jpg')
    im3 = color.rgb2grey(im3)
    print(im3.dtype)
    print(im3.size)
    print(im3.shape)
    io.imshow(im3)
    io.show()
    
    '''
    skimage.color.rgb2grey(rgb)
    skimage.color.rgb2hsv(rgb)
    skimage.color.rgb2lab(rgb)
    skimage.color.gray2rgb(image)
    skimage.color.hsv2rgb(hsv)
    skimage.color.lab2rgb(lab)
    
    '''

     

    总结

    1. 除了opencv读入的彩色图片以BGR顺序存储外,其他所有图像库读入彩色图片都以RGB存储。
    2. 除了PIL读入的图片是img类之外,其他库读进来的图片都是以numpy 矩阵。
    3. 各大图像库的性能,老大哥当属opencv,无论是速度还是图片操作的全面性,都属于碾压的存在,毕竟他是一个巨大的cv专用库。下面那张图就是我从知乎盗来的一张关于各个主流图像库的一些性能比较图,从测试结果看来,opencv确实胜出太多了。

     

     

     

    转:Python各种图像库的图像的基本读写方式

    目前主流的图像库有几下几种:

    1. OpenCV      

    2. PIL(Pillow)     

    3. matplotlib.image    

    4. skimage      

    5. scipy.misc

    结论:以上图片库中当属OpenCV最为强大,成熟。

     

    1 OpenCV

    1.1 OpenCV 图像的读取与储存

    import cv2
    #读取图像 直接是numpy矩阵格式
    img = cv2.imread('horse.jpg',1) # 0表示读入灰色图片,1表示读入彩色图片
    cv2.imshow('image',img) # 显示图像
    print(img.shape)   # (height,width,channel)
    print(img.size)    # 像素数量
    print(img.dtype)   # 数据类型
    print(img)         # 打印图像的numpy数组,3纬数组
    
    #储存图像
    # 当前目录储存
    cv2.write(‘horse1.jpg',img)
    # 自定义储存
    cv2.write(‘/path_name/’ + str(image_name) + '.jpg',img)
              
    cv2.waitKey()

    1.2 OpenCV 图像灰化处理

     

    import cv2
    #方法一
    img = cv2.imread('horse.jpg',0) # 0表示读入灰色图片,或者使用cv2.IMREAD_GRATSCALE 替代0
    cv2.imshow('gray image',img)
    
    #方法二
    img = cv2.imread('horse.jpg')
    gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imshow('gray image',gray_img)
    
    print(gray_img.shape) # (height, width)
    print(gray_img.size)  # 像素数量
    print(gray_img)       # 打印图像的numpy数组,2维
    cv2.waitKey()

    1.3 OpenCV 矩阵格式变换

    Why?:OpenCV的矩阵格式 (height, width, channels) -->> 深度学习矩阵类型可能是 (channels,height,width)

    import cv2
    import numpy as np
    img = cv2.imread('horse.jpg',1)
    cv2.imshow('image',img)
    # 矩阵格式的变换
    print(img.shape)
    img = img.transpose(2,0,1) #变换函数 
    print(img.shape)

     

    # 矩阵扩展 (batch_size, channels, height, width) 预测单张图片的操作
    # 加一列作为图片的个数
    img = np.expand_dims(img, axis=0) #使用numpy函数
    print(img.shape)
    # 训练阶段构建batch
    data_lst = []
    loop:
        img = cv2.imread('xxx.jpg')
        data_lst.append(img)
    data_arr = np.array(data_lst)

    1.4 OpenCV 图片归一化 (Data Normalization)

    import cv2
    # 为了减少计算量,需要把像素值0-255转换到0-1之间
    img = cv2.imread('horse.jpg')
    img = img.astype('float') / 255.0 # 先转化数据类型为float
    print(img.dtype)
    print(img)

    1.5 OpenCV BRG转换为RGB

    import cv2
    img = cv2.imread('horse.jpg')
    img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) # 转为RGB format
    print(img)

    1.6 OpenCV 访问像素点

    import cv2
    img = cv2.imread('horse.jpg')
    gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 转为Gray image
    print(img[4,4])        # 3 channels
    print(gray_img[4,4])   # 1 channel

    1.7 OpenCV 感兴趣区域剪切(ROI)

    import cv2
    img = cv2.imread('horse.jpg')
    print(img.shape)
    roi = img[0:437,0:400] # [y:height,x:width]
    
    cv2.imshow('roi',roi)
    cv2.waitKey()

    2 PIL

    2.1 PIL 图像读取与储存

    from PIL import Image
    import numpy as np
    #图像读取
    img = Image.open('horse.jpg')
    print(img.format) # 图片格式
    print(img.size)   # (width,height)
    print(img.mode)   # 图片通道类型
    
    #将图像转化为矩阵格式
    arr = np.array(img)
    print(arr.shape)
    print(arr.dtype)
    
    #图像储存
    new_img = Image.fromarray(arr)
    new_img.save('test.jpg')
    
    img.show()

    2.2 PIL 图像灰化处理 

     

    #图像灰化处理
    gray = Image.open('horse.jpg').convert('L')
    gray_arr = np.array(gray)
    print(gray_arr.shape) # (height,width)
    print(gray_arr.dtype)
    print(gray_arr)
    gray.show()

    2.3 PIL 感兴趣区域剪切

    # 感兴趣区域剪切
    img = Image.open('horse.jpg')
    roi = img.crop((0,0,200,200)) # (左上x,左上y,右下x,右下y)
    roi.show()

    2.4 通道操作

    # 通道处理
    r,g,b = img.split() #分离
    img = Image.merge("RGB",(b,g,r)) #合并
    img = img.copy() #复制

     

    3 Matplotlib

    3.1 Matplotlib 读取和存储图片

    import matplotlib.pyplot as plt
    import numpy as np
    # 图像读取为numpy数组格式
    img = plt.imread('horse.jpg')
    
    plt.axis('off') # 关闭刻度显示
    
    print(img.shape) # (height, width, channel)
    print(img.size) # 像素数量
    print(img.dtype)
    
    #储存图片
    plt.savefig('./name.jpg')
    
    figure = plt.figure(figsize=(20,10)) # 调整显示图片的大小
    
    plt.imshow(img)
    plt.show()

    3.2 Matplotlib 图片灰化处理

    #图片灰化处理
    # 平均值发
    img_mean = img.mean(axis=2)
    plt.imshow(img_mean,cmap='gray')
    plt.show()
    
    #最大值法
    img_max = img.max(axis=-1)
    plt.imshow(img_max,cmap='gray')
    plt.show()
    
    #RGB三原色法
    gravity = np.array([0.299,0.587,0.114])
    img_gravity = np.dot(img,gravity)
    plt.imshow(img_gravity,cmap="gray")
    plt.show()

     

    4 skimage

    4.1 skimage 读取和储存图像

    from skimage import io
    #读取图像numpy数组格式
    img = io.imread('horse.jpg')
    print(img.shape)
    print(img.dtype)
    print(img.size)
    #print(img)
    io.imshow(img)
    
    #储存图像
    io.imsave('test.jpg',img)

    4.2 skimage 灰化处理

     

    #图像灰化处理并归一化
    img = io.imread('horse.jpg',as_gray=True)
    print(img.shape)
    print(img.dtype) # 数据类型位float
    print(img.size)
    print(img)
    io.imshow(img)
    io.show()

     

    5 scipy.misc

    5.1 scipy.misc 读取和储存图像

    #在1.2.0 之后统一用imageio模块
    import imageio
    import matplotlib.pyplot as plt
    #读取图片为numpy数组
    img = imageio.imread('horse.jpg')
    print(img.dtype)
    print(img.size)  # 像素数量
    print(img.shape) #(height, width, channels)
    plt.imshow(img)
    plt.show()
    print(img)
    #储存图片
    imageio.imsave('test.jpg',img)

     

    展开全文
  • 基于python图像Gabor变换及特征提取

    千次阅读 多人点赞 2020-10-26 10:18:47
    基于python图像Gabor变换及特征提取1.前言2. “Gabor帮主”简介3.“Gabor帮主”大招之图像变换3.“Gabor帮主”大招之图像特征提取 深圳中兴网信科技有限公司:廖海斌 1.前言 在深度学习出来之前,图像识别领域北有...


    深圳中兴网信科技有限公司:廖海斌

    1.前言

    在深度学习出来之前,图像识别领域北有“Gabor帮主”,南有“SIFT慕容小哥”。目前,深度学习技术可以利用CNN网络和大数据样本搞事情,从而取替“Gabor帮主”和“SIFT慕容小哥”的江湖地位。但,在没有大数据和算力支撑的“乡村小镇”地带,或是对付“刁民小辈”,“Gabor帮主”可以大显身手,具有不可撼动的地位。IT武林中,有基于C++和OpenCV,或是基于matlab的Gabor图像变换与特征提取源代码,但大多招数花哨。而基于Python语言的Gabor图像变换和特征提取却很少见。本博主在实现基于Python语言的Gabor图像变换和特征提取中发现其确实比OpenCV或matlab务实,话少人狠,特和大家分享。

    2. “Gabor帮主”简介

    “Gabor帮主”最厉害的武器是Gabor滤波器,其最主要使用优势体现在对物体纹理特征的提取上。Gabor滤波器对于图像的亮度和对比度变化以及图像姿态变化具有较强的鲁棒性,并且它表达的是对图像识别最为有用的局部特征,故在计算机视觉及纹理分析领域中得到广泛的应用。Gabor滤波器可以提取不同方向和不同尺度的上的特征,并且进行随意组合,变幻莫测。下图为4个方向(0o,45o,90o,135o)和6个尺度(7,9,11,13,15,17),组合生成的24个Gabor滤波核。
    在这里插入图片描述

    3.“Gabor帮主”大招之图像变换

    所谓Gabor图像变换就使用Gabor滤波器对图像进行滤波操作(相当于CNN中的卷积操作)得到新的图像。每个滤波核与图像滤波之后得到:
    在这里插入图片描述
    其中,λ为波,它的值以像素为单位指定,通常大于等于2。但不能大于输入图像尺寸的五分之一;
    θ为方向,指定了Gabor函数并行条纹的方向,它的取值为0到2π;
    ϕ为相位偏移,它的取值范围为−π到π。其中,0、π度分别对应中心对称的center-on函数和center-off函数,而-π/2和π/2对应反对称函数;
    γ为长宽比,空间纵横比,决定了Gabor函数形状的椭圆率,当γ=1时,形状是圆的,当γ<1时,形状随着平行条纹方向而拉长,通常该值为0.5;
    σ表示Gabor函数的高斯因子的标准差,它的值不能直接设置,它仅随着带宽b变化,带宽值必须是正实数,通常为1,此时,标准差和波长的关系为:σ=0.56λ;带宽(b):Gabor滤波器的半响应空间频率带宽:在这里插入图片描述
    x’,y’的值为:在这里插入图片描述
    gabor滤波核是复数形式,因此可以把它分开成实部和虚部:
    在这里插入图片描述
    在这里插入图片描述
    弄清以上公式原理后,大家也可以自己尝试利用Python把Gabor变换实现,源代码我这里就不贴了,如果大家感兴趣,可以参考https://www.cnblogs.com/wojianxin/p/12574089.html。其实,skimage包中就有封装好的gabor变换函数,可以直接调用。因此,这里介绍一种简单偷懒的方式。从skimage中导入filters(from skimage import filters)后,便可调用gabor函数了,其函数说明如下:
    skimage.filters.gabor(image, frequency, theta=0, bandwidth=1, sigma_x=None, sigma_y=None, n_stds=3, offset=0, mode=‘reflect’, cval=0)
    1)函数返回:
    Gabor变换后的实部和虚部real,imag;大小与输入图像尺寸相同。
    2)函数参数:
    图像(image):二维数组输入图像(灰度图像);
    频率(frequency):浮点谐波函数的空间频率,控制尺度;在这里插入图片描述
    ,在图像特征提取领域通常取5个不同尺度在这里插入图片描述
    方向(theta):float,可选的弧度方向,如果为0,则谐波处于x方向;在这里插入图片描述
    ,在图像特征提取领域通常取8个不同方向u=[0,1,2,3,4,5,6,7]。
    带宽(bandwidth):浮点,可选由过滤器捕获的带宽。对于固定带宽,sigma_x和sigma_y将随着频率的增加而降低,如果用户设置了sigma_x和sigma_y,则该值将被忽略;标准偏差(sigma_x,sigma_y):float,x和y方向上的可选标准偏差;
    内核的线性大小(n_stds):标量,可选内核的线性大小为n_stds(默认为3)标准偏差;偏移量(offset):浮点数,可选项以弧度表示的谐波函数的相位偏移;模式(mode):{‘constant’,‘near’,‘reflect’,‘mirror’,‘wrap’},可选用于将图像与内核进行卷积的模式,传递给ndi.convolve;cval:标量,可选值如果卷积模式为’不变’,该参数被传递给ndi.convolve。
    3)源代码如下:

    import matplotlib.pyplot as plt
    from skimage import filters,io,color
    import numpy as np
    
    filename='D:/lena.jpg'
    img = io.imread(filename)#读取图像
    img_gray = color.rgb2gray(img)#RGB转灰度
    frequency=0.6
    #调用gabor函数
    real, imag = filters.gabor(img_gray, frequency=0.6,theta=45,n_stds=5)
    #取模图像
    img_mod=np.sqrt(real.astype(float)**2+imag.astype(float)**2)
    #图像显示
    plt.figure()
    plt.subplot(2,2,1)
    plt.imshow(img_gray,cmap='gray')
    plt.subplot(2,2,2)
    plt.imshow(img_mod,cmap='gray')
    plt.subplot(2,2,3)
    plt.imshow(real,cmap='gray')
    plt.subplot(2,2,4)
    plt.imshow(imag,cmap='gray')
    plt.show()
    

    4)运行结果如下:
    左上角为原图,右上角为变换后的模图像,左下角为变换后实部图像,右下角为变换后虚部图像)
    5)注意事项
    ①通过theta参数调不同方向,这里输入是弧度,不是角度。②通过frequency参数调不同尺度变化。
    6)利用skimage生成gobor卷积核:gabor_kernel
    skimage.filters.gabor_kernel(frequency, theta=0, bandwidth=1, sigma_x=None, sigma_y=None, n_stds=3, offset=0)
    函数返回:返回2D Gabor滤波器内核,包含实部与虚部。
    参数与skimage.filters.gabor()函数相同。
    源代码如下:

    import matplotlib.pyplot as plt
    from skimage import filters
    gk = filters.gabor_kernel(frequency=0.1,theta=np.pi*30/180.0,n_stds=5)
    mod=np.sqrt(gk.real.astype(float) ** 2 + gk.imag.astype(float) ** 2)
    plt.figure()
    plt.subplot(1,3,1)
    plt.imshow(gk.real*255,cmap='gray')
    plt.subplot(1,3,2)
    plt.imshow(gk.imag*255,cmap='gray')
    plt.subplot(1,3,3)
    plt.imshow(mod*255,cmap='gray')
    plt.show()
    

    运行结果如下:
    在这里插入图片描述
    注意事项:①参数n_stds=3并不是说滤波核大小为(3,3),滤波核大小由参数frequency、theta、n_stds三个参数共同决定。②gabor_kernel函数返回是带有实部和虚部的复矩阵。③theta是弧度,不是角度

    3.“Gabor帮主”大招之图像特征提取

    Gabor滤波器可以在频域上不同尺度、不同方向上提取相关的特征。另外,Gabor函数与人眼的作用相仿,所以经常用作纹理识别上,并取得了较好的效果。Gabor特征提取一般包括取模、特征降维、特征归一化和特征选取等操作:
    取模:skimage.filters.gabor()函数返回的是图像变换后的实部和虚部,在图像识别领域一般使用其模作为图像特征在这里插入图片描述
    2)特征降维:skimage.filters.gabor()函数返回值大小和原图像一样;另外,图像识别领域一般使用8个方向和5个尺度的gabor滤波器,得到40幅变换图像;导致提取的图像特征维度(40幅图像特征串联)比较高。因此,需要对取模图像进行降维处理。最简单的方法就是对每个模图像进行下采样,如使用Opencv中的resize函数cv2.resize(img,(0,0),fx=1/4,fy=1/4)。
    3)特征归一化:
    在机器学习领域中,不同评价指标(即特征向量中的不同特征就是所述的不同评价指标)往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。其中,最典型的就是数据的归一化处理。简而言之,归一化的目的就是使得预处理的数据被限定在一定的范围内。本博主介绍一种Z-score标准化方法:
    当一化公式:在这里插入图片描述
    其中μ为所有样本数据的均值,σ为所有样本数据的标准差。
    b)本方法要求原始数据的分布可以近似为高斯分布,否则归一化的效果会变得很糟糕;
    c)应用场景:在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,Z-score standardization表现更好。
    4)特征选取
    经过以上三步后,可以将各模图像特征串联起来作为输入图像的特征向量。但此时得到的特征向量存在大量冗余,最好再进行一次特征降维(特征选取)操作。可以采用PCA或Fisher等线性子空间分析方法。
    5)源代码:

    import cv2
    import numpy as np
    from skimage import filters
    filename='D:/lena.jpg'
    img = cv2.imread(filename)#读图像
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转灰度
    frequency=0.6
    #gabor变换
    real, imag = filters.gabor(img_gray, frequency=0.6,theta=45,n_stds=5)
    #取模
    img_mod=np.sqrt(real.astype(float)**2+imag.astype(float)**2)
    #图像缩放(下采样)
    newimg = cv2.resize(img_mod,(0,0),fx=1/4,fy=1/4,interpolation=cv2.INTER_AREA)
    tempfea = newimg.flatten()#矩阵展平
    tmean = np.mean(tempfea)#求均值
    tstd = np.std(tempfea)#求方差
    newfea = (tempfea - tmean)/tstd#数值归一化
    print(newfea)
    

    夜已深,公司都没有一个人了,空荡荡的。先写到这里吧,第一次在CSDN上发博文,有不到之处请指正,如果您觉得还有点用,请点个赞以支鼓励,不胜感激!!!!

    展开全文
  • 1.前言 在深度学习出来之前,图像识别领域北有“Gabor帮主”,南有“SIFT慕容小哥”。目前,深度学习技术可以利用CNN网络和大数据...本博主在实现基于Python语言的Gabor图像变换和特征提取中发现其确实比OpenCV或mat
  • 我最常用的图像库当然是opencv,很强大很好用,但是opencv也有一些坑,不注意的话也会出大麻烦。近期我也在看一些别人写的代码,因为个人习惯不一样,他们在做深度学习时用于图片读取的图像库各不相同,从opencv到...
  • python图像添加合成透明图片贴纸 经过两天的研究,虽然也有类似的代码,但还是研究了两天才懂! from PIL import Image def s(qyt_code,poster): # 加载需要粘贴的二维码, 最好是带透明通道的! sticker = ...

    python 给图像添加合成透明图片贴纸

    经过两天的研究,虽然也有类似的代码,但还是研究了两天才搞懂!

    from PIL import Image
    
    def s(qyt_code,poster):
        # 加载需要粘贴的二维码, 最好是带透明通道的!
        sticker = Image.open(qyt_code)
        box = (40, 965, 156, 1081)  # base_img的范围区域
        sticker = sticker.resize((box[2] - box[0], box[3] - box[1]))  # 将二维码resize
    
        # 加载poster,作为底图
        back_img = Image.open(poster)
        # 将透明的sticker图覆盖上去,中间透明区域将显示出底图
        back_img.paste(sticker, (box[0], box[1]), sticker)  # 第一个参数表示需要粘贴的图像,中间的是坐标,最后是一个是mask图片,用于指定透明区域。
        back_img.show()
    
    s(".\\images\\qyt_code.png",".\\images\\qyt_poster-blank.png")
    
    
    展开全文
  • 截止到本篇博客,已经第二次听到直方图这个概念了,有必要将其懂。 图像直方图(histogram)是图像统计学特征,用来统计像素值出现的频次,常用在分析图像的基本特征。 创建直方图一般分为两个步骤: 统计数据 ...
  • Python各类图像库的图片读写方式...我最常用的图像库当然是opencv,很强大很好用,但是opencv也有一些坑,不注意的话也会出大麻烦。近期我也在看一些别人写的代码,因为个人习惯不一样,他们在做深度学习时用于图...
  • 我最常用的图像库当然是opencv,很强大很好用,但是opencv也有一些坑,不注意的话也会出大麻烦。近期我也在看一些别人写的代码,因为个人习惯不一样,他们在做深度学习时用于图片读取的图像库各不相同,从opencv到...
  • 在skimage包中,绘制图形用的是draw模块,不要和绘制图像搞混了。 1、画线条 函数调用格式为: skimage.draw.line(r1,c1,r2,c2) r1,r2: 开始点的行数和结束点的行数 c1,c2: 开始点的列数和结束点的列...
  • python 图像直方图

    2013-05-31 23:52:00
    最近要搞图像处理,要做直方图,老师用MFC弄了一大坨代码看着真心蛋疼。。。正好这一段在学python,就拿来用了,非常方便强大,核心代码就几行~ 用了三个模块,PIL,numpy和matplotlib 第一行加一句这个,基本完美...
  • opencv_python图像金字塔

    2018-01-06 09:13:10
    图像金字塔原理不赘述了,网上太多了,直接上代码,做此笔记的主要目的一是备忘,二是看到好多图像金字塔在一张图上显示,感觉很酷,自己就了一下与大家分享。 import cv2 import numpy as np img = cv2....
  • 最近,有一位数据科学的小姐姐Parul Pandey,整理了一份实用Python图像处理工具,内含十大经典Python库。 这份资源中的工具可用于图像处理中的常见任务,包括裁剪、翻转、旋转、图像分割、分类和特征提取、图像...
  • 微信公众号:AI算法与图像处理如果你觉得对你有帮助,欢迎点击右下角的“好看”前言又到了一周最愉快的时间了,虽然周六加班,但是2018年即将结束,新的一年也快来临,很感谢大...
  • python最全的图像拼接

    千次阅读 2019-03-15 18:09:27
    python最全的图像拼接文章目录:一、用matplotlib实现图像的拼接二、用PIL实现图像的拼接1、PIL实现长图的拼接2、PIL实现照片墙拼接 这个图片拼接真的是了很久,尝试了很多种方法,现在都在这里列举一下,与...
  • Python大批量搜索引擎图像爬虫工具

    千次阅读 多人点赞 2020-11-12 16:53:02
    python图像爬虫包 最近在做一些图像分类的任务时,为了扩充我们的数据集,需要在搜索引擎下爬取额外的图片来扩充我们的训练集。人工智能真的是太难了????,居然还要会爬虫。当然网上也有许多python写的爬虫工具,...
  • BoW图像检索Python实战

    千次阅读 2016-04-25 09:05:26
    前几天把HABI哈希图像检索工具包更新到V2.0版本后,小白菜又重新回头来用Python搞BoW词袋模型,一方面主要是练练Python,另一方面也是为了CBIR群开讲的关于图像检索群活动第二期而准备的一些素材。关于BoW,网上

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 262
精华内容 104
关键字:

python搞图像

python 订阅