使用numpy做影像處理(一)
在python中進行影像處理時,我們有三個好工具:OpenCV,SciKit-Image和Pillow。但是為了理解一些簡單圖像處理技術的基礎,我們將使用numpy。
導入函式庫並加載影像
import numpy as np import matplotlib.pylab as plt # 加載圖像 im = plt.imread("BTD.jpg") # 加載當前文件夾中名為BTD.jpg的圖片 print(im.shape) # 輸出圖像尺寸 # (4608, 2592, 3)即(y軸像素點數, x軸像素點數,圖像通道數) # 這裡用的是RGB三通道圖像,通道數為3
剪裁影像
def plti(im, h=8, **kwargs): """ 畫圖的輔助函數 """ y = im.shape[0] x = im.shape[1] w = (y/x) * h plt.figure(figsize=(w,h)) plt.imshow(im, interpolation="none", **kwargs) plt.axis('off') plti(im)
def plti(im, **kwargs): """ 畫圖的輔助函數 """ plt.imshow(im, interpolation="none", **kwargs) plt.axis('off') # 去掉坐標軸 plt.show() # 彈窗顯示圖像 im = im[400:3800,:2000,:] # 直接切片對圖像進行裁剪 plti(im)
分離各通道的影像(Colours)
影像的每個像素由三個整數表示:其顏色的RGB值。 將影像拆分成單獨的顏色分量只需要拉出影像數組的正確切片
fig, axs = plt.subplots(nrows=1, ncols=3, figsize=(15,5)) for c, ax in zip(range(3), axs): tmp_im = np.zeros(im.shape, dtype="uint8") tmp_im[:,:,c] = im[:,:,c] ax.imshow(tmp_im) ax.set_axis_off()
fig, axs = plt.subplots(nrows=1, ncols=3, figsize=(15,5)) # 將一張圖分為1x3個子圖,axs為各子圖對象構成的列表。 figsize為顯示視窗的橫縱比。 for c, ax in zip(range(3), axs): # 使用zip來同時循環3通道和3個子圖對象 tmp_im = np.zeros(im.shape) # 初始化一個和原圖像大小相同的三維數組 # 注意 tmp_im 仍然是三通道 tmp_im[:,:,c] = im[:,:,c] # 只複製某一通道 one_channel = im[:,:,c].flatten() # 索引該通道並展平至一維 print("channel", c, " max = ", max(one_channel), "min = ", min(one_channel)) # 輸出該通道最大最小的像素值 ax.imshow(tmp_im) # 在子圖上繪製 ax.set_axis_off() # 去掉子圖坐標軸 # 注意以上 tmp_im 採用的是切片複製 plt.show() #輸出: #channel 0 max = 220 min = 11 #channel 1 max = 203 min = 10 #channel 2 max = 185 min = 0
熱門評論