• 本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换。 对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”...

    在数字图像处理中,针对不同的图像格式有其特定的处理算法。所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现。本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换。

    对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。

    通过之前的博客对Image模块的介绍,对于PNGBMPJPG彩色图像格式之间的互相转换都可以通过Image模块的open()save()函数来完成。具体说就是,在打开这些图像时,PIL会将它们解码为三通道的“RGB”图像。用户可以基于这个“RGB”图像,对其进行处理。处理完毕,使用函数save(),可以将处理结果保存成PNGBMPJPG中任何格式。这样也就完成了几种格式之间的转换。同理,其他格式的彩色图像也可以通过这种方式完成转换。当然,对于不同格式的灰度图像,也可通过类似途径完成,只是PIL解码后是模式为“L”的图像。

    这里,我想详细介绍一下Image模块的convert()函数,用于不同模式图像之间的转换。

    Convert()函数有三种形式的定义,它们定义形式如下:

    im.convert(mode) image

    im.convert(“P”, **options) image

    im.convert(mode, matrix) image

    使用不同的参数,将当前的图像转换为新的模式,并产生新的图像作为返回值。

    通过博客“Python图像处理库PIL的基本概念介绍”,我们知道PIL中有九种不同模式。分别为1LPRGBRGBACMYKYCbCrIF

    本文我采用的示例图像是图像处理中经典的lena照片。分辨率为512x512lena图片如下:

    一、模式“RGB”转换为其他不同模式

    1、 模式“1

    模式“1”为二值图像,非黑即白。但是它每个像素用8bit表示,0表示黑,255表示白。下面我们将lena图像转换为“1”图像。

    例子:

    
    >>>from PIL import Image
    
    >>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>> lena.mode
    
    'RGB'
    
    >>> lena.getpixel((0,0))
    
    (197, 111, 78)
    
    >>> lena_1 = lena.convert("1")
    
    >>> lena_1.mode
    
    '1'
    
    >>> lena_1.size
    
    (512, 512)
    
    >>>lena_1.getpixel((0,0))
    
    255
    
    >>> lena_1.getpixel((10,10))
    
    255
    
    >>>lena_1.getpixel((10,120))
    
    0
    
    >>>lena_1.getpixel((130,120))
    
    255

     

    图像lena_1的模式为“1”,分辨率为512x512,如下:

    2、 模式“L

    模式“L”为灰色图像,它的每个像素用8bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:

    L = R * 299/1000 + G * 587/1000+ B * 114/1000

    下面我们将lena图像转换为“L”图像。

    例子:

    >>> from PIL importImage
    
    >>> lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>> lena.mode
    
    'RGB'
    
    >>> lena.getpixel((0,0))
    
    (197, 111, 78)
    
    >>> lena_L =lena.convert("L")
    
    >>> lena_L.mode
    
    'L'
    
    >>> lena_L.size
    
    (512, 512)
    
    >>>lena.getpixel((0,0))
    
    (197, 111, 78)
    
    >>>lena_L.getpixel((0,0))
    
    132

    对于第一个像素点,原始图像lena(197, 111, 78),其转换为灰色值为:

    197 *299/1000 + 111 * 587/1000 + 78 * 114/1000 = 132.952PIL中只取了整数部分,即为132

    转换后的图像lena_L如下:

    3、 模式“P

    模式“P”为8位彩色图像,它的每个像素用8bit表示,其对应的彩色值是按照调色板查询出来的。

    下面我们使用默认的调色板将lena图像转换为“P”图像。

    例子:

    
    >>> from PIL importImage
    
    >>> lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>> lena.mode
    
    'RGB'
    
    >>> lena.getpixel((0,0))
    
    (197, 111, 78)
    
    >>> lena_P =lena.convert("P")
    
    >>> lena_P.mode
    
    'P'
    
    >>>lena_P.getpixel((0,0))
    
    62

     

    转换后的图像lena_P如下:

    4、 模式“RGBA

    模式“RGBA”为32位彩色图像,它的每个像素用32bit表示,其中24bit表示红色、绿色和蓝色三个通道,另外8bit表示alpha通道,即透明通道。

    下面我们将模式为“RGB”的lena图像转换为“RGBA”图像。

    例子: 

                                                                                                                                  
    
    >>> from PIL import Image
    
    >>>lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>>lena.mode
    
    'RGB'
    
    >>>lena.getpixel((0,0))
    
    (197,111, 78)
    
    >>>lena_rgba = lena.convert("RGBA")
    
    >>>lena_rgba.mode
    
    'RGBA'
    
    >>>lena_rgba.getpixel((0,0))
    
    (197,111, 78, 255)
    
    >>>lena_rgba.getpixel((0,1))
    
    (196,110, 77, 255)
    
    >>>lena.getpixel((0,0))
    
    (197,111, 78)
    
    >>>lena.getpixel((0,1))
    
    (196,110, 77)

     

    从实例中可以看到,使用当前这个方式将“RGB”图像转为“RGBA”图像时,alpha通道全部设置为255,即完全不透明。

    转换后的图像lena_rgba如下:

    5、 模式“CMYK

    模式“CMYK”为32位彩色图像,它的每个像素用32bit表示。模式CMYK”就是印刷四分色模式,它是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。

    四种标准颜色是:CCyan = 青色,又称为‘天蓝色’或是‘湛蓝’MMagenta = 品红色,又称为‘洋红色’;YYellow = 黄色;KKey Plate(blacK) = 定位套版色(黑色)。

    下面我们将模式为“RGB”的lena图像转换为“CMYK”图像。

    例子:

    
    >>>from PIL import Image
    
    >>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>> lena_cmyk =lena.convert("CMYK")
    
    >>> lena_cmyk.mode
    
    'CMYK'
    
    >>>lena_cmyk.getpixel((0,0))
    
    (58, 144, 177, 0)
    
    >>> lena_cmyk.getpixel((0,1))
    
    (59, 145, 178, 0)
    
    >>>lena.getpixel((0,0))
    
    (197, 111, 78)
    
    >>>lena.getpixel((0,1))
    
    (196, 110, 77)

     

    从实例中可以得知PIL中“RGB”转换为“CMYK”的公式如下:

    C = 255 - R
    M = 255 - G
    Y = 255 - B
    K = 0

    由于该转换公式比较简单,转换后的图像颜色有些失真。

    转换后的图像lena_cmyk如下:

    6、 模式“YCbCr

    模式“YCbCr”为24位彩色图像,它的每个像素用24bit表示。YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化。

    模式“RGB”转换为“YCbCr”的公式如下:

    Y= 0.257*R+0.504*G+0.098*B+16
    Cb = -0.148*R-0.291*G+0.439*B+128
    Cr = 0.439*R-0.368*G-0.071*B+128

    下面我们将模式为“RGB”的lena图像转换为“YCbCr”图像。

    例子:

    
    >>>from PIL import Image
    
    >>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>> lena_ycbcr =lena.convert("YCbCr")
    
    >>>lena_ycbcr.mode
    
    'YCbCr'
    
    >>>lena_ycbcr.getpixel((0,0))
    
    (132, 97, 173)
    
    >>>lena.getpixel((0,0))
    
    (197, 111, 78)

     

    按照公式,Y = 0.257*197+0.564*111+0.098*78+16= 136.877

    Cb= -0.148*197-0.291*111+0.439*78+128= 100.785
    Cr = 0.439*197-0.368*111-0.071*78+128 = 168.097

    由此可见,PIL中并非按照这个公式进行“RGB”到“YCbCr”的转换。

    转换后的图像lena_ycbcr如下:

    7、 模式“I

    模式“I”为32位整型灰色图像,它的每个像素用32bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“I”模式是按照下面的公式转换的:

    I = R * 299/1000 + G * 587/1000 + B * 114/1000

    下面我们将模式为“RGB”的lena图像转换为“I”图像。

    例子:

    
    >>> from PIL import Image
    
    >>>lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>>lena.getpixel((0,0))
    
    (197,111, 78)
    
    >>>lena.getpixel((0,1))
    
    (196,110, 77)
    
    >>> lena_I =lena.convert("I")
    
    >>> lena_I.mode
    
    'I'
    
    >>>lena_I.getpixel((0,0))
    
    132
    
    >>>lena_I.getpixel((0,1))
    
    131
    
    >>> lena_L =lena.convert("L")
    
    >>>lena_L.getpixel((0,0))
    
    132
    
    >>>lena_L.getpixel((0,1))
    
    131

     

    从实验的结果看,模式“I”与模式“L”的结果是完全一样,只是模式“L”的像素是8bit,而模式“I”的像素是32bit

    8、 模式“F

    模式“F”为32位浮点灰色图像,它的每个像素用32bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“F”模式是按照下面的公式转换的:

    F = R * 299/1000+ G * 587/1000 + B * 114/1000

    下面我们将模式为“RGB”的lena图像转换为“F”图像。

    例子:

    
    >>>from PIL import Image
    
    >>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>>lena.getpixel((0,0))
    
    (197, 111, 78)
    
    >>>lena.getpixel((0,1))
    
    (196, 110, 77)
    
    >>> lena_F =lena.convert("F")
    
    >>> lena_F.mode
    
    'F'
    
    >>>lena_F.getpixel((0,0))
    
    132.95199584960938
    
    >>>lena_F.getpixel((0,1))
    
    131.95199584960938

     

    模式“F”与模式“L”的转换公式是一样的,都是RGB转换为灰色值的公式,但模式“F”会保留小数部分,如实验中的数据。

    (未完待续)

    展开全文
  • 经常需要使用 Python 对图像做处理,那就免不了使用一些图像处理库,特地写了这篇博客记录一下常用的图像处理库

    经常需要使用 Python 对图像做处理,那就免不了使用一些图像处理库,特地写了这篇博客记录一下常用的图像处理库。

    目录

    1. OpenCV 速查表
    2. PIL 速查表
    3. Matplotlib 速查表

    1. OpenCV 速查表

    Open Source Computer Vision, 其更广为人知的名字是OpenCV,是 Intel 开源计算机视觉库,由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。
    OpenCV 使用 C/C++ 开发,同时也提供了 Python、Java、MATLAB 等其他语言的接口。本文主要是对 OpenCV-Python 的接口进行描述。
    此处为相应的文档链接:[英文] [中文]

    由 OpenCV 支持的主要格式有:

    • Windows bitmaps(*.bmp、*dib);
    • Portable image formats(.pbm、.pgm、*.ppm);
    • Sun rasters(.sr、.ras);

    需要辅助库的格式有:

    • JPEG(.jpeg、.jpg、*.jpe);
    • JPEG 2000(*.jp2);
    • Portable Network Graphics(*.png);
    • TIFF(.tiff、.tif);
    • WebP(*.webp);

    -读取图像并显示图像

    import cv2
    # 读取图像,默认读入彩色图像
    # cv2.imread(path,flag = cv2.IMREAD_COLOR)
    # cv2.IMREAD_COLOR:加载彩色图像。任何形象的透明度将被忽略。这是默认的标志。
    # cv2.IMREAD_GRAYSCALE:以灰度模式加载图像
    # cv2.IMREAD_UNCHANGED:加载包含Alpha通道的图像
    # 除了上面这三个标志,你可以简单地传递整数 1,0,-1。
    img = cv2.imread('example.jpg') # 当该图像不存在时,返回 None
    # 显示图像
    cv2.namedWindow('example',cv2.WINDOW_NORMAL) # 创建窗口
    cv2.imshow('example',example) # 在指定窗口中显示图像
    cv2.waitKey(0) # 等待键盘输入,若传入参数为0,则程序将无限制等待用户的案件事件,否则,程序等待所传入参数对应的毫秒时间后,跳出循环。
    # 如果程序想响应某个按键,可这样写 :
    # if waitKey(0)==Keyvalue:
    #     pass 
    cv2.destroyAllWindows() # 删除所有建立的窗口,若需删除指定窗口,则使用cv2.destroyWindow(),并传入指定窗口的名称。
    

    -保存图像

    import cv2
    # 读取图像
    img = cv2.imread('example.jpg')
    # 保存图像
    # 还可以指定保存图像的品质或压缩率
    # 对于 jpg 图像,cv2.imwrite(path,img,[cv2.IMWRITE_JPEG_QUALITY,90]),参数范围为 0~100
    # 对于 png 图像,cv2.imwrite(path,img,[cv2.IMWRITE_PNG_COMPRESSION,5]),参数范围为 0~9
    cv.imwrite('example.png')
    

    -转换图像格式

    import cv2
    img = cv2.imread('example.jpg')
    # 由 RGB 转为 灰度图
    img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 由 RGB 转为 HSV
    img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    

    -图像坐标轴
    注意:在 OpenCV 中,RGB 图像的通道顺序为 BGR。
    OpenCV 所读进来的图像本身就是一个 np.ndarray 实例,其维度为 (height,width,channels),其原点坐标位于图像的左上角。

    -常用方法

    import cv2
    # 读取图像
    img = cv2.imread('example.jpg')
    # 图像缩放
    # cv2 的图像维度一般以 (height,width,channel)存在,但 resize 不同,以(width,height,channel)存在,且默认采用双线性插值。
    # 可选参数 nninterpolation 的取值范围:
    # cv2.INTER_NEAREST	最近邻插值
    # cv2.INTER_LINEAR	双线性插值(默认设置)
    # cv2.INTER_AREA	使用像素区域关系进行重采样。 它可能是图像抽取的首选方法,因为它会产生无云纹理的结果。 但是当图像缩放时,它类似于 INTER_NEAREST方法。
    # cv2.INTER_CUBIC	4x4像素邻域的双三次插值
    # cv2.INTER_LANCZOS4	8x8像素邻域的Lanczos插值
    img = cv2.resize(img,(width,height))
    # 通道分离
    b,g,r = cv2.split(img)
    # 合并通道
    img = cv2.merge((b,g,r))
    # 复制图像
    img = img.copy()
    # 获取ROI
    ROI = img[top:low,left:right]
    # 由 PIL 格式转化为 OpenCV 格式
    img = cv2.cvtColor(numpy.asarray(image),cv2.COLOR_RGB2BGR)
    

    2. PIL 速查表

    Python Imaging Library ,或者叫 PIL,简略来说, 是Python图像操作的核心库。
    不幸的是,它的开发陷入了停滞,最后一次更新是2009年,只支持到 Python 2.7。
    不过,目前仍存在一个活跃的 PIL 开发分支,叫做 Pillow。它很容易安装,运行在虽有的主流操作系统上,而且支持Python 3.x。
    此处为相应的文档链接:[英文] [中文]

    • 读取图像,查看图像信息并显示图像
    from PIL import Image
    # 读取图像
    # Image.open() 返回 Image 类的实例,不需要指定图像格式,由文件内容自动确定图像格式。
    img = Image.open('example.jpg')
    # 显示图像
    img.show()
    # Image 类有5个属性,分别如下所示:
    # format : 返回图像的格式(PNG,JPG,None等,。如果图像不是从文件读取的,它的值就是 None。
    # mode : 返回图像的模式,常用模式有 L (luminance) 表示灰度图像, RGB 表示真彩色图像, CMYK 表示出版图像。
    # size : 返回 (width, height),宽度和高度,单位都是px。
    # palette : 仅当 mode 为 P 时有效,返回 ImagePalette 实例。
    # info : 以字典的形式返回实例的信息。
    
    • 保存图像
    from PIL import Image
    # 读取图像
    img = Image.open('example.jpg')
    # 保存图像
    # 调用 Image 类的函数 save,save(filename,format) 函数以特定的图像格式保存图像。
    # 若不指定图像格式,save() 方法会根据文件扩展名来选择相应的图像格式。
    img.save('OtherExample.jpg')
    
    • 转换图像模式
    from PIL import Image
    img = Image.open('example.jpg')
    # 由 RGB 模式转为 L 模式,即将彩色图像转为灰度图像
    img = img.convert('L')
    
    • 图像与张量的转换
    import numpy as np
    from PIL import Image
    # 读取图像
    img = Image.open('example.jpg')
    # 将 Image 实例转换为 np.ndarray 实例
    img = np.array(img)
    # 将 np.ndarray 实例转换为 Image 实例
    img = Image.fromarray(img)
    
    • 图像坐标轴
      由于 PIL 读取图像后并不是直接以 np.ndarray 的形式存在的,而是以 Image 实例的形式所存在。
      所以要想探究图像的坐标轴,我们得先进行图像与张量得转换。
      查阅资料后,可以得知:
      图片坐标和数组坐标是相反的,坐标原点位于左上角。
      图片坐标第一维是横向向右,第二维纵向向下。
      但是数组坐标第一维是纵向向下,第二维横向向右。
    import numpy as np
    from PIL import Image
    # 读取图像
    img = Image.open('example.jpg')
    print(img.size) # 输出:(400,200)
    # 将 Image 实例转换为 np.ndarray 实例
    img = np.array(img)
    print(img.shape)# 输出:(200,400,3)
    
    • 常用方法
    from PIL import Image
    # 读取图像
    img = Image.open('example.jpg')
    # 图像缩放
    img = img.resize((width, height))
    # 带 ANTIALIAS 滤镜缩放结果的图像缩放
    img = img.resize((width, height),Image.ANTIALIAS)
    # 通道分离
    r, g, b = img.split()
    # 合并通道
    img = Image.merge("RGB", (b, g, r))
    # 复制图像
    img = img.copy()
    # 获取 ROI
    ROI = img.crop((left,upper,right,lower))
    # 由 OpenCV 格式转化为 PIL 格式
    image = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)) 
    

    3. Matplotlib 速查表

    Matplotlib 应该是 Python 2D-绘图领域使用最广泛的套件,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。
    Matplotlib 的功能和 Matlab 中的画图的功能十分类似,但是 Matlab 进行画图相对来说比较复杂,所以使用 Python 中的 Matplotlib 来画图比较方便。
    此处为相应的文档链接:[英文] [中文]

    读取图像并展示图像

    import matplotlib.pyplot as plt # plt 用于显示图片
    import matplotlib.image as mpimg # mpimg 用于读取图片
    
    # 读取图像
    lena = mpimg.imread('example.png') 
    
    # 展示图像
    plt.figure("Image") # 设置窗口名称,窗口大小可通过可选参数 figsize 进行设置
    plt.imshow(img)    # 绘制图像,若图像为灰度图,应这样写:plt.imshow(img,cmap='gray')
    plt.axis('on') 	    # 显示坐标轴,若不想展示坐标轴,应这样写:plt.axis('off')
    plt.title('image')  # 设置图像名称
    plt.show()      # 展示图像
    
    
    img = Image.open(os.path.join('images', '2007_000648' + '.jpg'))
    gray = img.convert('L')
    r,g,b = img.split()
    img_merged = Image.merge('RGB', (r, g, b))
    
    # 同时展示多副图像
    plt.figure("Other Image") 
    plt.suptitle('Multi_Image') 
    plt.subplot(2,2,1), plt.title('1'), plt.imshow(img),plt.axis('off')
    plt.subplot(2,2,2), plt.title('2'), plt.imshow(img),plt.axis('off')
    plt.subplot(2,2,3), plt.title('3'), plt.imshow(img),plt.axis('off')
    plt.subplot(2,2,4), plt.title('4'), plt.imshow(img),plt.axis('off')
    plt.show()
    
    # 保存图像
    plt.savefig("example.jpg")
    

    常用函数

    import matplotlib.pyplot as plt # plt 用于显示图片
    import matplotlib.image as mpimg # mpimg 用于读取图片
    
    # 绘制函数
    
    # 绘制单个函数:
    plot([x], y, [format1])
    # 绘制多个函数:
    plot([x], y, [format1], [x2], y2, [format2], ..., [xn], [yn], [formatn])
    # 绘制多个函数并对每个函数进行区分:
    plot([x], y, [format1], [label1], [x2], y2, [format2], [label2], ..., [xn], [yn], [formatn], [labeln])
    # 可选参数 [format] 是一个字符串来定义图的基本属性如:颜色(color),点型(marker),线型(linestyle),
    # 具体形式 format = '[color][marker][line]'
    # format 接收的是每个属性的单个字母缩写,例如:
    # plot(x, y, 'bo-')  # 蓝色圆点实线
    
    # 绘制直方图
    plt.bar(x, y)
    # plt.bar(left, height, width=0.8, bottom=None, **kwargs)
    # left,height,width,bottom这四个参数确定了柱体的位置和大小。
    # 默认情况下,left为柱体的居中位置(可以通过align参数来改变left值的含义),即:
    # (left - width / 2, bottom)为左下角位置
    # (left + width / 2, bottom + height)为右上角位置
    

    参考资料:


    如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!

    作者信息:
    知乎:没头脑
    LeetCode:Tao Pu
    CSDN:Code_Mart
    Github:Bojack-want-drink

    展开全文
  • Python图像处理

    2008-01-18 12:11:00
    Python做图像处理 最近在做一件比较 evil 的事情——验证码识别,以此来学习一些新的技能。...在 Python 中,比较常用的图像处理库是 PIL(Python Image Library),当前版本是 1.1.6 ,用起来非常方便。大家可以在
    用Python做图像处理
    id="alimamaifrm" style="WIDTH: 750px; HEIGHT: 110px" border="0" name="alimamaifrm" marginwidth="0" marginheight="0" src="http://p.alimama.com/cpacode.php?t=A&pid=mm_10108440_0_0&w=750&h=110&rn=1&cn=3&ky=&cid=251602&bgc=FFFFFF&bdc=E6E6E6&tc=0000FF&dc=000000" frameborder="0" width="750" scrolling="no" height="110">
           最近在做一件比较 evil 的事情——验证码识别,以此来学习一些新的技能。因为我是初学,对图像处理方面就不太了解了,欲要利吾事,必先利吾器,既然只是做一下实验,那用 Python 来作原型开发再好不过了。在 Python 中,比较常用的图像处理库是 PIL(Python Image Library),当前版本是 1.1.6 ,用起来非常方便。大家可以在 http://www.pythonware.com/products/pil/index.htm 下载和学习。
           在这里,我主要是介绍一下做图像识别时可能会用到的一些 PIL 提供的功能,比如图像增强、还有滤波之类的。最后给出使用 Python 做图像处理与识别的优势与劣势。
    基本图像处理
           使用 PIL 之前需要 import Image 模块:
    import Image
           然后你就可以使用Image.open(‘xx.bmp’) 来打开一个位图文件进行处理了。打开文件你不用担心格式,也不用了解格式,无论什么格式,都只要把文件名丢给 Image.open 就可以了。真所谓 bmp、jpg、png、gif……,一个都不能少。
    img = Image.open(‘origin.png’)    # 得到一个图像的实例对象 img
    1原图
           图像处理中,最基本的就是色彩空间的转换。一般而言,我们的图像都是 RGB 色彩空间的,但在图像识别当中,我们可能需要转换图像到灰度图、二值图等不同的色彩空间。 PIL 在这方面也提供了极完备的支持,我们可以:
    new_img = img.convert(‘L’)
    把 img 转换为 256 级灰度图像, convert() 是图像实例对象的一个方法,接受一个 mode 参数,用以指定一种色彩模式,mode 的取值可以是如下几种:
    · 1 (1-bit pixels, black and white, stored with one pixel per byte)
    · L (8-bit pixels, black and white)
    · P (8-bit pixels, mapped to any other mode using a colour palette)
    · RGB (3x8-bit pixels, true colour)
    · RGBA (4x8-bit pixels, true colour with transparency mask)
    · CMYK (4x8-bit pixels, colour separation)
    · YCbCr (3x8-bit pixels, colour video format)
    · I (32-bit signed integer pixels)
    · F (32-bit floating point pixels)
    怎么样,够丰富吧?其实如此之处,PIL 还有限制地支持以下几种比较少见的色彩模式:LA (L with alpha), RGBX (true colour with padding) and RGBa (true colour with premultiplied alpha)。
    下面看一下 mode 为 ‘1’、’L’、’P’时转换出来的图像:
    2 mode = '1'
    3 mode = 'L'
    4 mode = 'P'
    convert() 函数也接受另一个隐含参数 matrix,转换矩阵 matrix 是一个长度为4 或者16 tuple。下例是一个转换 RGB 空间到 CIE XYZ 空间的例子:
        rgb2xyz = (
            0.412453, 0.357580, 0.180423, 0,
            0.212671, 0.715160, 0.072169, 0,
            0.019334, 0.119193, 0.950227, 0 )
        out = im.convert("RGB", rgb2xyz)
           除了完备的色彩空间转换能力外, PIL 还提供了resize()、rotate()等函数以获得改变大小,旋转图片等几何变换能力,在图像识别方面,图像实例提供了一个 histogram() 方法来计算直方图,非常方便实用。
    图像增强
           图像增强通常用以图像识别之前的预处理,适当的图像增强能够使得识别过程达到事半功倍的效果。 PIL 在这方面提供了一个名为 ImageEnhance 的模块,提供了几种常见的图像增强方案:
    import ImageEnhance
    enhancer = ImageEnhance.Sharpness(image)
    for i in range(8):
        factor = i / 4.0
        enhancer.enhance(factor).show("Sharpness %f" % factor)
    上面的代码即是一个典型的使用 ImageEnhance 模块的例子。 Sharpness 是 ImageEnhance 模块的一个类,用以锐化图片。这一模块主要包含如下几个类:Color、Brightness、Contrast和Sharpness。它们都有一个共同的接口 .enhance(factor) ,接受一个浮点参数 factor,标示增强的比例。下面看看这四个类在不同的 factor 下的效果
    5 使用Color 进行色彩增强,factor 取值 [0, 4],步进 0.5
    6 用 Birghtness 增强亮度,factor取值[0,4],步进0.5
    7用 Contrast 增强对比度, factor 取值 [0,4],步进0.5
    8用 Sharpness 锐化图像,factor取值 [0,4],步进0.5
    图像 Filter
           PIL 在 Filter 方面的支持是非常完备的,除常见的模糊、浮雕、轮廓、边缘增强和平滑,还有中值滤波、ModeFilter等,简直方便到可以做自己做一个Photoshop。这些 Filter 都放置在 ImageFilter 模块中,ImageFilter主要包括两部分内容,一是内置的 Filter,如 BLUR、DETAIL等,另一部分是 Filter 函数,可以指定不同的参数获得不同的效果。示例如下:
    import ImageFilter
    im1 = im.filter(ImageFilter.BLUR)
    im2 = im.filter(ImageFilter.MinFilter(3))
    im3 = im.filter(ImageFilter.MinFilter()) # same as MinFilter(3)
    可以看到 ImageFilter 模块的使用非常简单,每一个 Filter 都只需要一行代码就可调用,开发效率非常高。
     
    9使用 BLUR
    10使用 CONTOUR
    11使用 DETAIL
    12使用 EMBOSS
    13使用 EDGE_ENHANCE
    14使用 EDGE_ENHANCE_MORE
    15使用 FIND_EDGES
    16使用 SHARPEN
    17使用 SMOOTH
    18使用 SMOOTH_MORE
           以上是几种内置的 Filter 的效果图,除此之外, ImageFilter 还提供了一些 Filter 函数,下面我们来看看这些可以通过参数改变行为的 Filter 的效果:
    19使用 Kernel(),参数:size = (3, 3), kernel = (0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5)
    20使用 MaxFilter,默认参数
    21使用 MinFilter,默认参数
    22使用 MedianFilter,默认参数
    23使用 ModeFilter,参数 size = 3
    24使用 RankFilter,参数 size = 3, rank = 3
    小结
           到此,对 PIL 的介绍就告一段落了。总的来说,对于图像处理和识别,PIL 内建了强大的支持,从各种增强算法到 Filter ,都让人无法怀疑使用 Python 的可行性。 Python唯一的劣势在于执行时间过慢,特别是当实现一些计算量大的算法时候,需要极强的耐心。我曾用 Hough Transform(霍夫变换)来查找图像中的直线,纯 Python 的实现处理一个 340 * 100 的图片也要花去数秒时间(P4 3.0G + 1G memory)。但使用 PIL 无需关注图像格式、内建的图像增强算法和 Filter 算法,这些优点使 Python 适合用于构造原型和进行实验,在这两方面Python 比 matlab 更加方便。商业的图像识别产品开发,可以考虑已经被 boost accepted的来自 adobe 的开源 C++ 库 gil,可以兼顾执行性能和开发效率。
    id="alimamaifrm" style="WIDTH: 750px; HEIGHT: 110px" border="0" name="alimamaifrm" marginwidth="0" marginheight="0" src="http://p.alimama.com/cpacode.php?t=A&pid=mm_10108440_0_0&w=750&h=110&rn=1&cn=3&ky=%CA%E9&cid=50000072&bgc=FFFFFF&bdc=E6E6E6&tc=0000FF&dc=000000" frameborder="0" width="750" scrolling="no" height="110">
    展开全文
  • Python环境下的图像处理库种类较多,无论是精度,速度等方面都有不同的差异,这里予以总结。 Python环境下,相关的包有: Numpy:主要作为图像数据的中转 Skimage:速度较慢,主要是caffe测试的时候默认的...

    转:https://zhuanlan.zhihu.com/p/34837506

    1. 库简介

    深度学习领域,对视频图片样本的处理占了很大一部分比重。

    而Python环境下的图像处理库种类较多,无论是精度,速度等方面都有不同的差异,这里予以总结。

     

    Python环境下,相关的包有:

    Numpy:主要作为图像数据的中转

    Skimage:速度较慢,主要是caffe测试的时候默认的caffe.io.load使用,不建议使用(Skimage,读取RGB,通道HWC,范围[0,1])

     

     

    主要的图像处理包:

    CV2:opencv的python版本,应用较广

    PIL:Python自带的图像处理库,但功能较简单

    Pillow: 出发点在于PIL只支持python2.7,添加了一些新特性

    Pillow-SIMD:Pillow增强版本,约有5倍的增益,比CV2还要快;安装方法:

    $ pip uninstall
    pillow

    $ CC="cc
    -mavx2" pip install -U --force-reinstall pillow-simd

    Matplotlib:一般使用matplot.pyplot方法进行画图;

     

     

     

     

    2. 平台需求

    Caffe需要的图像格式是BGR,通道类型是CHW,范围[0,255];

     

    后续的深度学习平台例如Pytorch需要的图像格式是RGB,通道类型CHW,范围[0,1];

    (注:平台通道类型的要求CHW实际上是CUDA高效运算的需求,NCHW)

     

    3. 常用库

    • Numpy

    Numpy对多维矩阵A的操作一般有:

    A.shape #HWC

    type(A) #numpy.array

    A.dtype() #uint8,
    float…

    np.min(A), np.max(A) #最值

     

    • CV2

    读取BGR,通道HWC,范围[0,255] ,类型uint8; 图像类型numpy.ndarray;

     

    • PIL,Pillow, Pillow-SIMD

    读取RGB,通道HWC,范围[0,255],类型uint8;图像类型PngImageFile (np.array, Image.fromarray直接与numpy互相转换)

    有.mode方法---rgb信息

     

    • Matplotlib

    读取RGB,通道HWC,范围[0,1] ,类型float;图像类型numpy.ndarray

     

    • Skimage

    读取RGB,通道HWC,范围[0,255],类型uint8;图像类型numpy.ndarray

    有.mode方法---rgb信息

    比较特殊,读取的时候image= io.imread('test.jpg',as_grey=False);

    彩图是uint8,[0,255];灰度图float,[0,1];

    彩图resize变成float,[0,1];

    较混乱,不适用。。。

     

    4. 读取

    • CV2

    #默认读取为三通道彩图,可通过参数更改为单通道灰度图

    img = cv2.imread('examples.png')

    img_gray = cv2.imread('examples.png', 0)

     

    • PIL,Pillow, Pillow-SIMD

    img = Image.open('examples.png')

     

    • Matplotlib

    img = plt.imread('examples.png')

    5. 显示

    Matplotlib最主要目的是用来绘图:

    将numpy数组格式的RGB图像显示;

    float类型的图像,范围0-1;如果是uint8图像,范围是0-255;

     

    • Matplotlib

    img = plt.imread('examples.png')

    plt.imshow(img)

    plt.show()

     

    • CV2

    img = cv2.imread('examples.png')

    plt.imshow(img[..., -1::-1]) # 因为opencv读取进来的是bgr顺序,而imshow需要的是rgb顺序,因此需要先反过来,也可以plt.imshow(img[:,:,::-1])

    plt.show()

     

    • PIL

    #可直接打开

    plt.imshow(Image.open('examples.png')) # 实际上plt.imshow可以直接显示PIL格式图像

    plt.show()

    #转换为需要的numpy格式打开

    img_gray = img.convert('L') #转换成灰度图像

    img = np.array(img)

    img_gray = np.array(img_gray)

    plt.imshow(img) # or plt.imshow(img / 255.0)5

    plt.show()

    plt.imshow(img_gray, cmap=plt.gray()) # 显示灰度图要设置cmap参数

    plt.show()

     

     

    6. 转换

    主要是通过numpy的transpose操作,修正RGB,BGR;

    例如:

    a是rgb图像,那么

    a[::-1],a[:,::-1],a[:,:,::-1]分别是X轴的镜像,Y轴的镜像,BGR转换为RGB;

     

    opencv相关图像操作;

    img_gray = cv2.cvtColor(img,
    cv2.COLOR_BGR2GRAY) # BGR转灰度

    img_bgr = cv2.cvtColor(img_gray,
    cv2.COLOR_GRAY2BGR) # 灰度转BRG

    img_rgb = cv2.cvtColor(img_gray,
    cv2.COLOR_GRAY2RGB) # 灰度转RGB

     

    b,g,r = cv2.split(img) #bgr图像分离三个通道

    img2 = cv2.merge([r,g,b]) #merge成rgb图像

     

    PIL相关图像操作:

    img = Image.open('examples.png')

    img_gray = image.convert(‘L’)

    img_color = img_gray.convert(‘RGB’)

     

     

    PIL与numpy格式转换操作:

    numpy.asarray()

    Image.fromarray()

    如果是pil转opencv,记得需要通过copy命令得到的才可以进行cv2操作,不然会有bug。切忌

     

     

     

     

    PIL类型,尺寸信息,通过.size方法,得到WH;

    Numpy类型,通过shape方法,得到HWC

    注:如果是PIL自己的类型,得到尺寸信息要使用.size方法

    print image.size #width height

    同样进行resize操作,顺序也是wh;

    img2_resize = img2.resize((960,540))

    img2_resize.save('test1.jpg')

    而如果使用cv2操作,顺序也是wh;

    img3_resize = cv2.resize(img3, (960,540))

    cv2.imwrite('test2.jpg', img3_resize)

    但如果放在numpy里面,调用shape方法,得到的是HWC;

     

    7. 保存

    • PIL

    #直接save方法

    img = Image.open('examples.png')

    img.save('examples2.png')

    img_gray = img.convert('L')

    img_gray.save('examples_gray.png') # 不管是灰度还是彩色,直接用save函数保存就可以,但注意,只有PIL格式的图片能够用save函数

     

    • CV2

    #cv2.imwrite

    import cv2

    img = cv2.imread('examples.png') # 这是BGR图片

    cv2.imwrite('examples2.png', img) # 这里也应该用BGR图片保存,这里要非常注意,因为用pylab或PIL读入的图片都是RGB的,如果要用opencv存图片就必须做一个转换

    img_gray = cv2.cvtColor(img,
    cv2.COLOR_BGR2GRAY)

    cv2.imwrite('examples_gray.png', img_gray)

    展开全文
  • 欢迎大家关注微信公众号:baihuaML,白话机器学习。 码字不易,如转载请私信我!! 在这里,我们一起分享AI的故事。...在使用python进行编程时,涉及到多个不同的图像处理库的选择,今天我们简单聊一聊...

    欢迎大家关注微信公众号:baihuaML白话机器学习

    码字不易,如转载请私信我!!

    在这里,我们一起分享AI的故事。

    您可以在后台留言,关于机器学习、深度学习的问题,我们会选择其中的优质问题进行回答!

     

    在进行数字图像处理时,我们经常需要对图像进行读取、保存、缩放、裁剪、旋转、颜色转换等基本操作。在使用python进行编程时,涉及到多个不同的图像处理库的选择,今天我们简单聊一聊这几个库:opencv、scikit-image、scipy、pillow、matplotlib等等(不包括深度学习:tf.image等)

    1. PIL(Python Imaging Library)

    PIL(Python Imaging Library)是Python常用的图像处理库,而Pillow是PIL的一个友好Fork,提供了了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。相比opencv更为轻巧。Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、show等功能。

    2. scipy.misc

    python在科学计算领域有三个非常受欢迎库,numpy、SciPy、matplotlib。numpy是一个高性能的多维数组的计算库,SciPy是构建在numpy的基础之上的,它提供了许多的操作numpy的数组的函数。SciPy是一款方便、易于使用、专为科学和工程设计的python工具包,它包括了统计、优化、整合以及线性代数模块、傅里叶变换、信号和图像图例,常微分方差的求解等。

    3. Opencv

    OpenCV是一个开放源代码的计算机视觉应用平台,由英特尔公司下属研发中心俄罗斯团队发起该项目,开源BSD证书,OpenCV的目标是实现实时计算机视觉,,是一个跨平台的计算机视觉库。从开发之日起就得到了迅猛发展,获得了众多公司和业界大牛的鼎力支持与贡献,因为是BSD开源许可,因此可以免费应用在科研和商业应用领域。

    OpenCV中已经包含如下应用领域功能:二维和三维特征工具箱、运动估算、人脸识别系统、姿势识别、人机交互、移动机器人、运动理解、对象鉴别、分割与识别、立体视觉、运动跟踪、增强现实(AR技术)。基于上述功能实现需要,OpenCV中还包括以下基于统计学机器学习库:Boosting算法、Decision Tree(决策树)学习、Gradient Boosting算法、EM算法(期望最大化)、KNN算法、朴素贝叶斯分类、人工神经网络、随机森林、支掌向量机。

    编程语言:OpenCV中多数模块是基于C++实现,其中有少部分是基于C语言实现,当前OpenCV提供的SDK已经支持C++、Java、Python等语言应用开发。当前OpenCV本身新开发的算法和模块接口都是基于C++产生。OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库,具有MATLAB风格的语法。所有OpenCV数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)集成更容易。

    注意:cv2默认为 BGR顺序,而其他软件(PIL、scopy.misc)一般使用RGB

    4. matplotlib

    Matplotlib是一个Python 2D绘图库,它可以在不同的平台上以各种硬拷贝格式和交互环境生成发布质量数据。Matplotlib可以用于Python脚本、Python和IPython shell、Jupyter notebook、web应用服务器和四个图形用户界面工具包。对于简单的绘图,pyplot模块提供了一个类似于matlab的接口,特别是与IPython结合使用时。对于power用户,您可以通过面向对象的界面或通过MATLAB用户熟悉的一组函数来完全控制线样式、字体属性、轴属性等.

    5. skimage
    scikit-image是一组用于图像处理和计算机视觉的算法。“skimage”的主要包只提供了一些用于转换图像数据类型的实用程序;大多数功能程序存在其子包中。读取功能包含在io模块中。

    使用建议


    1. 这些库比较来看,我本人更喜欢使用opencv的库来进行图像处理的基本操作,数据格式为numpy,可以直接进行numpy的处理;
    2. 进行折线图这类图绘制的时候,一般使用matplotlib库。
    3. Opencv默认为 BGR顺序,而其他软件(PIL、scopy.misc)一般使用RGB。

     

    快来关注我们啦~

    一大波实习,招聘机会也陆续出现!为了大家能够更好地交流。我们也拉了几个算法面试群,感兴趣的小伙伴可以加我微信,欢迎入群~注明:面试群。另外,我们也有算法群,欢迎各位加入,注明:算法群!扫码加下面微信好友!特别提醒:不要骚扰小姐姐~~

     

    欢迎加入深度学习、机器学习技术研讨群!

    966164090

     

    欢迎关注我们的微信公众号:baihuaML,白话机器学习

    关注知乎“会写代码的好厨师”

    展开全文
  • Python中进行图像处理可以使用的有很多,本文主要介绍下面三个:OpenCV、PIL、 skimage。其中,OpenCV是图像处理中最强大的一个,它的源代码是由C\C++写成的,所以原版的OpenCV可以与C、C++无缝结合。Python版...
  • 提到图像处理第一个想到的就是PIL,全称Python Imaging Library Python图像处理类库,它提供了大量的图像操作,比如图像缩放,裁剪,贴图,模糊等等,很多时候它需要配合numpy一起使用 1.open() 你可以使用...
  • 第 1 章 基本的图像操作和处理本章讲解操作和处理图像的基础知识,将通过大量...1.1 PIL:Python图像处理类库PIL(Python Imaging Library Python图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图...
  • 本文主要讲解图像傅里叶变换的相关内容,在数字图像处理中,有两个经典的变换被广泛应用——傅里叶变换和霍夫变换。其中,傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪、图像增强等处理...
  • 在使用python进行编程时,涉及到多个不同的图像处理库的选择,今天我们简单聊一聊这几个库:opencv、scikit-image、scipy、pillow、matplotlib等等(不包括深度学习:tf.image等) 1. PIL(Python Imaging ...
  • Python中的图像处理

    2018-03-03 22:27:15
    第 1 章 基本的图像操作和处理本章讲解操作和处理图像的基础知识,将通过大量...1.1 PIL:Python图像处理类库PIL(Python Imaging Library Python图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图...
  • Python做图像处理  最近在做一件比较 evil 的事情——验证码识别,以此来学习一些新的技能。...在 Python 中,比较常用的图像处理库是 PIL(Python Image Library),当前版本是 1.1.6 ,用起来非常方便。大家可
  • python 图像处理

    2018-06-19 14:51:01
    转自:点击打开链接第 1 章 基本的图像操作和处理本章讲解操作和处理图像的基础知识,将通过大量...1.1 PIL:Python图像处理类库PIL(Python Imaging Library Python图像处理类库)提供了通用的图像处理功能,以...
  • 一般情况下,opencv是图像处理比较理想的选择,但是在一定情况下,安装opencv是需要花费一点时间和力气,但是这个的确很强大(虽然并没有完全长期使用这个,但是在各个系统上都安装过,编译过,一个比较好的途径...
  • Python 图像处理详解

    2013-01-22 18:10:58
    Python做图像处理  最近在做一件比较 evil 的事情——验证码识别,以此来学习一些新的技能。...在 Python 中,比较常用的图像处理库是 PIL(Python Image Library),当前版本是 1.1.6 ,用起来非常方便。大家可
  • 1.介绍:何为PillowPillow原本是PIL(Python Imaging Library)的一个分支,后来因为PIL长时间没有更新,而Pillow的功能越来越强大,并增添了许多新的特性,Pillow逐渐成为python中常用的图像处理库。现在Pillow的...
  • OpenCV是一个C++,目前流行的计算机视觉编程,用于实时处理计算机视觉方面的问题,它涵盖了很多计算机视觉领域的模块 一:OpenCV安装 pip install opencv-python 如果安装失败的话,直接下载whl安装包进行...
  • python数字图像处理

    2018-09-12 20:03:41
    这里博客是自己做的个系统整理,主要说的是python在数字图像处理方面的应用,主要用到的有PIL和skimage PIL 1、用python简单处理图片:打开、显示、保存图像 2、用python简单处理图片:图像通道、几何变换...
1 2 3 4 5 ... 20
收藏数 32,384
精华内容 12,953