1. 程式人生 > >Python影象進行的變換(影象通道,裁剪)

Python影象進行的變換(影象通道,裁剪)

Python影象進行的變換(影象通道,裁剪)

1、將彩色影象轉灰度圖

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
img=Image.open('1.jpg')
gray=img.convert('L')
gray=np.array(gray, dtype='float32')

plt.imshow(gray,cmap='gray')
plt.axis('off')
plt.show()

原影象:
在這裡插入圖片描述
處理後的影象:
在這裡插入圖片描述
首先將影象轉換為灰度,其次找出影象的通道RGB三通道,合併三通道,最終分別讀取三通道

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
img=Image.open('1.jpg')  #開啟影象
gray=img.convert('L')   #轉換成灰度
gray=np.array(gray, dtype='float32')
r,g,b=img.split()   #分離三通道

pic=Image.merge('RGB',(r,g,b)) #合併三通道

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

r=np.array(r, dtype='float32')
plt.subplot(2,3,4), plt.title('r')
plt.imshow(r,cmap='gray'),plt.axis('off')
g=np.array(g, dtype='float32')
plt.subplot(2,3,5), plt.title('g')
plt.imshow(g,cmap='gray'),plt.axis('off')
b=np.array(b, dtype='float32')
plt.subplot(2,3,6), plt.title('b')
plt.imshow(b,cmap='gray'),plt.axis('off')
plt.show()

無cmap='gray’時
在這裡插入圖片描述
有cmap='gray’時為
在這裡插入圖片描述

2、裁剪圖片

從原圖片中裁剪感興趣區域(roi),裁剪區域由4-tuple決定,該tuple中資訊為(left, upper, right, lower)。 Pillow左邊系統的原點(0,0)為圖片的左上角。座標中的數字單位為畫素點。

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('1.jpg')  #開啟影象

plt.subplot(1,2,1), plt.title('origin')
plt.imshow(img),plt.axis('off')

box=(180,50,300,150)
x=img.crop(box)
plt.subplot(1,2,2), plt.title('x')
plt.imshow(roi)
plt.show()

在這裡插入圖片描述

3、幾何變換

Image類有resize()、rotate()和transpose()方法進行幾何變換。
1、影象的縮放和旋轉

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('1.jpg')  #開啟影象

a = img.resize((128, 128))
b = img.rotate(45) # 順時針角度表示
plt.subplot(1,2,1), plt.title('resize')
plt.imshow(a)
plt.subplot(1,2,2), plt.title('rotate')
plt.imshow(b),plt.axis('off')

在這裡插入圖片描述
2、轉換影象

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('1.jpg')  #開啟影象

c = img.transpose(Image.FLIP_LEFT_RIGHT) #左右互換
d = img.transpose(Image.FLIP_TOP_BOTTOM) #上下互換
e = img.transpose(Image.ROTATE_90)  #順時針旋轉
f = img.transpose(Image.ROTATE_180)
g = img.transpose(Image.ROTATE_270)
plt.subplot(2,3,1)
plt.imshow(c)
plt.subplot(2,3,2)
plt.imshow(d)
plt.subplot(2,3,3)
plt.imshow(e)
plt.subplot(2,3,4)
plt.imshow(f)
plt.subplot(2,3,5)
plt.imshow(g)

在這裡插入圖片描述
圖片的開啟與顯示

from PIL import Image
img=Image.open('1.jpg')
img.show()

這種圖片顯示方式是呼叫作業系統自帶的圖片瀏覽器來開啟圖片,有些時候這種方式不太方便,因此我們也可以使用另上一種方式,讓程式來繪製圖片。

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('1.jpg')
plt.figure("dog")
plt.imshow(img)
plt.show()

在這裡插入圖片描述
這種方法雖然複雜了些,但推薦使用這種方法,它使用一個matplotlib的庫來繪製圖片進行顯示。matplotlib是一個專業繪圖的庫,相當於matlab中的plot,可以設定多個figure,設定figure的標題,甚至可以使用subplot在一個figure中顯示多張圖片。matplotlib 可以直接安裝
figure預設是帶axis的,如果沒有需要,我們可以關掉

plt.axis('off')

開啟圖片後,可以使用一些屬性來檢視圖片資訊,如

print (img.size)  #圖片的尺寸
print (img.mode)  #圖片的模式
print (img.format ) #圖片的格式

(448, 448)
RGB
JPEG

圖片的儲存

img.save('2.png')

就一行程式碼,非常簡單。這行程式碼不僅能儲存圖片,還是轉換格式,如本例中,就由原來的jpg圖片儲存為了png圖片。

將影象歸一化至(-1,1)之間

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
img = Image.open('1.jpg')
print (img.size)
out = img.resize((300, 300))  # 改變大小

min1 = np.min(out)
print(min1)
max1 = np.max(out)
print(max1)
range1 =max1 - min1
out2=(2*(out-min1)/range1)-1
plt.imshow(out)