官术网_书友最值得收藏!

3.1 讀取圖像文件進行基本操作

首先需要介紹圖像文件的存儲格式。計算機圖像可以分為矢量圖和位圖。矢量圖以代碼的形式存儲,常見的包括學術論文的統計圖、公司圖標等。這里主要討論如何處理位圖,其存儲格式包括png、jpg、tiff等,常見的包括各種手機、數碼相機拍攝的相片。而我們通常看見的gif動畫、mp4影片,也是由多個位圖按照時間排列、以固定的幀數進行播放的。

這里png、jpg、tiff格式的彩色照片,本質上都是一個三維的矩陣,即長度、寬度以及顏色(RGB,紅綠藍)。格式的文件結構都是十六進制數,分別使用了不同的圖像壓縮方法。當然解析這部分內容并不需要大家過多關注,我們可以在Python中使用現成的工具,將十六進制數格式的文件轉換成三維矩陣。我們重點講一下opencv的用法,這里使用opencv-python官網的例子。

3.1.1 使用python-opencv讀取圖片

運算結果:

          #output:
          (342, 548, 3)

完成圖像讀取以后,可以用Python的matplotlib基本繪圖庫進行圖像的展示,如圖3-2所示。

    import matplotlib.pyplot as plt
    %matplotlib inline
plt.imshow(img)

圖3-2 展示圖片

讀取圖片成功,這里的三維矩陣高度為342像素,寬度為548像素,使用RGB編碼。如果讀者是球迷的話,很容易會發現問題,首先這個球應該是黃色的,怎么是淺藍色?巴薩球迷更能一眼看出球襪的顏色反了,不是紅色是藍色——紅藍色反了。

出現這個問題的原因是,opencv-python默認使用BGR編碼,相對于RGB而言,色彩這個維度正好是反的。之所以這里看起來不太對勁的原因,主要還是歸功于巴薩球衣是紅藍相間的,反過來仍然是紅藍。如果是米蘭兩隊(紅黑與藍黑)這樣轉換,球隊就會弄錯了。

3.1.2 借助python-opencv進行不同編碼格式的轉換

我們可以用簡單的矩陣操作,或者直接用opencv的函數,將BGR顏色編碼轉換成RGB,如圖3-3所示。

    # 方法1. 直接操作數組
    fig = plt.figure(figsize=(10, 6))
    ax1 = fig.add_subplot(121)
    ax2 = fig.add_subplot(122)
    ax1.imshow(img[:,:,np.array([2,1,0])])
    # 方法2. 調用opencv函數
    ax2.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

圖3-3 轉換后的圖片

3.1.3 借助python-opencv改變圖片尺寸

如果此時想轉換成一個小一點的黑白相片,將高度×寬度變成240×360,可以進行如下設置:

    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_gray_small = cv2.resize(img_gray, (360, 240))

存儲圖片:

    cv2.imwrite("gray_out.png",img_gray_small)

運算結果:

          # out:
          True

此時,轉換成黑白相片并經過縮小后的文件已經被成功存儲了。

主站蜘蛛池模板: 潍坊市| 呈贡县| 云和县| 阿尔山市| 杨浦区| 肇东市| 珠海市| 鲁山县| 金溪县| 东明县| 沙坪坝区| 永泰县| 闻喜县| 中西区| 井陉县| 汉阴县| 巫溪县| 鱼台县| 彩票| 蓝山县| 怀来县| 湘乡市| 青冈县| 江安县| 丰台区| 秭归县| 揭阳市| 敖汉旗| 郁南县| 伊宁市| 新余市| 青神县| 米泉市| 牡丹江市| 招远市| 崇阳县| 加查县| 五大连池市| 龙川县| 阳山县| 临湘市|