使用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

0 條回復   |  直到 2019-3-17 | 407 次瀏覽




熱門評論


登入後才可發表內容