zoukankan      html  css  js  c++  java
  • 图像通道/几何变换/裁剪

    一 图像通道

    1 彩色图像转灰度图

    在转成灰度图之前,我们先来看看我们的彩色图像。

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    plt.figure("美女")
    plt.imshow(img)
    plt.axis("off")
    plt.show()
    print(img.size)   #图片的大小
    print(img.mode)   #图片的模式
    print(img.format) #图片的格式

    输出结果如下所示:

    (480, 502)
    RGBA
    PNG

    然后转成灰度图片:

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    gray = img.convert("L")
    plt.figure("美女")
    plt.imshow(gray,cmap = "gray")
    plt.axis("off")
    plt.show()

    结果如下:

    使用函数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)

    下边就详细介绍一下各个色彩模式的图像:

    (1)模式 “1

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

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst = img.convert("1")
    plt.figure("美女")
    plt.imshow(dst)
    plt.axis("off")
    plt.show()

    结果如下图所示:

    (2)模式“L”

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

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

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

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst = img.convert("L")
    plt.figure("美女")
    plt.imshow(dst)
    plt.axis("off")
    plt.show()

    结果如下图所示:

    (3)模式“P”

    模式“P”为8位彩色图像,它的每个像素用8bit表示,其对应的彩色值是按照调色板查询出来的。下面我们使用默认的调色板将杨幂图像转换为“P”图像。

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst = img.convert("P")
    plt.figure("美女")
    plt.imshow(dst)
    plt.axis("off")
    plt.show()

    结果如下图所示:

    (4)模式“RGB”

    模式“RGB”为24位彩色图像,它的每个像素用24bit表示,表示红色、绿色和蓝色三个通道。下面我们将杨幂图像转换为“RGB”图像。

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst = img.convert("RGB")
    plt.figure("美女")
    plt.imshow(dst)
    plt.axis("off")
    plt.show()

    结果如下图所示:

    (5) 模式“RGBA”

    模式“RGBA”为32位彩色图像,它的每个像素用32bit表示,其中24bit表示红色、绿色和蓝色三个通道,另外8bit表示alpha通道,即透明通道。由于图片本来的模式就是RGBA,故不需要转换。

    (6)模式“CMYK

    模式“CMYK”为32位彩色图像,它的每个像素用32个bit表示。模式“CMYK”就是印刷四分色模式,它是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。
    四种标准颜色是:C:Cyan = 青色,又称为‘天蓝色’或是湛蓝’;M:Magenta = 品红色,又称为‘洋红色’;Y:Yellow = 黄色;K:Key Plate(blacK) = 定位套版色(黑色)。
    PIL中“RGB”转换为“CMYK”的公式如下:

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

    由于该转换公式比较简单,转换后的图像颜色有些失真,下面杨幂图转成模式“CMYK”的图像:

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst = img.convert("CMYK")
    plt.figure("美女")
    plt.imshow(dst)
    plt.axis("off")
    plt.show()

    结果如下图所示:

    (7)模式“YCbCr

    模式“YCbCr”为24位彩色图像,它的每个像素用24个bit表示。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

    下面我们将杨幂图像转换为“YCbCr”图像。

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst = img.convert("YCbCr")
    plt.figure("美女")
    plt.imshow(dst)
    plt.axis("off")
    plt.show()

    结果如下图所示:

    (8)模式“I”

    模式“I”为32位整型灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“I”模式是按照下面的公式转换的:
                                                                           I = R * 299/1000 + G * 587/1000 + B * 114/1000
    下面我们将杨幂图像转换为“I”图像。

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst = img.convert("I")
    plt.figure("美女")
    plt.imshow(dst)
    plt.axis("off")
    plt.show()

    结果如下图所示:

     

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

    (9)模式“F”

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

    下面我们将杨幂图像转换为“F”图像。

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst = img.convert("F")
    plt.figure("美女")
    plt.imshow(dst)
    plt.axis("off")
    plt.show()

    结果如下图所示:

     

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

    2、通道分离与合并

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    gray = img.convert("L")
    r,g,b,a = img.split()
    pic = Image.merge("RGB",(r,g,b))
    plt.figure("美女")
    plt.subplot(2,3,1),plt.title("origin")
    plt.imshow(img),plt.axis("off")
    plt.subplot(2,3,2),plt.title("gray")
    plt.imshow(gray,cmap = "gray"),plt.axis("off")
    plt.subplot(2,3,3),plt.title("merge")
    plt.imshow(pic),plt.axis("off")
    plt.subplot(2,3,4),plt.title("r")
    plt.imshow(r,cmap = "gray"),plt.axis("off")
    plt.subplot(2,3,5),plt.title("g")
    plt.imshow(g,cmap = "gray"),plt.axis("off")
    plt.subplot(2,3,6),plt.title("b")
    plt.imshow(b,cmap = "gray"),plt.axis("off")
    plt.show()

    结果如下图所示:

    二 裁剪图片

    从原图片中裁剪感兴趣区域(roi),裁剪区域由4-tuple决定,该tuple中信息为(起始点横坐标 ,起始点纵坐标, 宽度, 高度)。 Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点。

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    plt.figure("美女")
    plt.subplot(1,2,1),plt.title("origin")
    plt.imshow(img),plt.axis("off")
    
    box = (45,35,230,260)
    roi = img.crop(box)
    plt.subplot(1,2,2),plt.title("ori")
    plt.imshow(roi),plt.axis("off")
    plt.show()

    结果如下所示:

    三 几何变换

    Image类有resize()、rotate()和transpose()方法进行几何变换。

    图像的缩放

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst = img.resize((128,128))
    plt.figure("刘小辉证件照")
    plt.imshow(dst),plt.axis("off")
    plt.show()

    结果如下所示:

    图像的旋转

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst1 = img.rotate(45) # 图像逆时针45度旋转
    dst2 = img.rotate(-45) # 图像顺时针45度旋转
    plt.figure("美女")
    plt.subplot(1,3,1),plt.title("origin")
    plt.imshow(img),plt.axis("off")
    plt.subplot(1,3,2),plt.title("anticlockwise")
    plt.imshow(dst1),plt.axis("off")
    plt.subplot(1,3,3),plt.title("clockwise")
    plt.imshow(dst2),plt.axis("off")
    plt.show()

    结果如下图所示:

    图像转换

    左右互换

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst = img.transpose(Image.FLIP_LEFT_RIGHT) #左右互换
    plt.figure("美女")
    plt.imshow(dst),plt.axis("off")
    plt.show()

    结果如下:

    上下互换

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst = img.transpose(Image.FLIP_TOP_BOTTOM) #上下互换
    plt.figure("美女")
    plt.imshow(dst),plt.axis("off")
    plt.show()

    结果如下:

    旋转的另一种表达形式

    from PIL import Image
    import matplotlib.pyplot as plt
    img = Image.open("D:\杨幂.jpg")
    dst1 = img.transpose(Image.ROTATE_90)  #逆时针旋转90度
    dst2 = img.transpose(Image.ROTATE_180)
    dst3 = img.transpose(Image.ROTATE_270)
    plt.figure("美女")
    plt.subplot(2,2,1),plt.title("0")
    plt.imshow(img),plt.axis("off")
    plt.subplot(2,2,2),plt.title("90")
    plt.imshow(dst1),plt.axis("off")
    plt.subplot(2,2,3),plt.title("180")
    plt.imshow(dst2),plt.axis("off")
    plt.subplot(2,2,4),plt.title("270")
    plt.imshow(dst3),plt.axis("off")
    plt.show()

    结果如下图所示:

    注:(1)transpose()和rotate()没有性能差别。

         (2)如果想要在图片上显示中文,比如“旋转90度”,需要加以下两行

    from pylab import *
    mpl.rcParams['font.sans-serif'] = ['SimHei']

    参考:https://www.cnblogs.com/denny402/p/5096330.html

  • 相关阅读:
    C/C++编程可用的Linux自带工具
    安装gcc及其依赖
    Linux上编译hadoop-2.7.1的libhdfs.so和libhdfs.a
    gcc链接参数--whole-archive的作用
    jdb调试程序
    Exception in thread "main" java.lang.Error: Unresolved compilation problem
    动态规划与分治、备忘录的区别
    leetcode-unique paths
    LeetCode总结 -- 一维动态规划篇
    编程技巧
  • 原文地址:https://www.cnblogs.com/Terrypython/p/9936898.html
Copyright © 2011-2022 走看看