图像通道/几何变换/裁剪

一 图像通道

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

posted @ 2018-11-09 19:53  珠峰上吹泡泡  阅读(492)  评论(0编辑  收藏  举报