Python影象進行的變換(影象通道,裁剪)
阿新 • • 發佈:2018-11-27
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)