1. 程式人生 > >影象通道/幾何變換/裁剪

影象通道/幾何變換/裁剪

一 影象通道

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)

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()

結果如下圖所示:

注:transpose()和rotate()沒有效能差別。

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