首頁 > 軟體

Python實現影象壓縮和影象處理詳解

2022-07-08 14:06:04

入門瞭解1.顏色

如果你有使用顏料畫畫的經歷,那麼一定知道混合紅、黃、藍三種顏料可以得到其他的顏色,事實上這三種顏色就是美術中的三原色,它們是不能再分解的基本顏色。在計算機中,我們可以將紅、綠、藍三種色光以不同的比例疊加來組合成其他的顏色,因此這三種顏色就是色光三原色。在計算機系統中,我們通常會將一個顏色表示為一個RGB值或RGBA值(其中的A表示Alpha通道,它決定了透過這個影象的畫素,也就是透明度)。

名稱RGB值名稱RGB值
White(白)(255, 255, 255)Red(紅)(255, 0, 0)
Green(綠)(0, 255, 0)Blue(藍)(0, 0, 255)
Gray(灰)(128, 128, 128)Yellow(黃)(255, 255, 0)
Black(黑)(0, 0, 0)Purple(紫)(128, 0, 128)

入門瞭解 2. 畫素

對於一個由數位序列表示的影象來說,最小的單位就是影象上單一顏色的小方格,這些小方塊都有一個明確的位置和被分配的色彩數值,而這些一小方格的顏色和位置決定了該影象最終呈現出來的樣子,它們是不可分割的單位,我們通常稱之為畫素(pixel)。每一個影象都包含了一定量的畫素,這些畫素決定影象在螢幕上所呈現的大小,大家如果愛好拍照或者自拍,對畫素這個詞就不會陌生。

用Pillow處理影象

Pillow是由從著名的Python影象處理庫PIL發展出來的一個分支,通過Pillow可以實現影象壓縮和影象處理等各種操作。可以使用下面的命令來安裝Pillow。

pip install pillow

Pillow中最為重要的是Image類,可以通過Image模組的open函數來讀取影象並獲得Image型別的物件。

1. 讀取和顯示影象

   from PIL import Image

   # 讀取影象獲得Image物件
   image = Image.open('guido.jpg')
   # 通過Image物件的format屬性獲得影象的格式
   print(image.format) # JPEG
   # 通過Image物件的size屬性獲得影象的尺寸
   print(image.size)   # (500, 750)
   # 通過Image物件的mode屬性獲取影象的模式
   print(image.mode)   # RGB
   # 通過Image物件的show方法顯示影象
   image.show()

2. 剪裁影象

   # 通過Image物件的crop方法指定剪裁區域剪裁影象
   image.crop((80, 20, 310, 360)).show()

3. 生成縮圖

   # 通過Image物件的thumbnail方法生成指定尺寸的縮圖
   image.thumbnail((128, 128))
   image.show()

4. 縮放和黏貼影象

   # 讀取駱昊的照片獲得Image物件
   luohao_image = Image.open('luohao.png')
   # 讀取吉多的照片獲得Image物件
   guido_image = Image.open('guido.jpg')
   # 從吉多的照片上剪裁出吉多的頭
   guido_head = guido_image.crop((80, 20, 310, 360))
   width, height = guido_head.size
   # 使用Image物件的resize方法修改影象的尺寸
   # 使用Image物件的paste方法將吉多的頭貼上到駱昊的照片上
   luohao_image.paste(guido_head.resize((int(width / 1.5), int(height / 1.5))), (172, 40))
   luohao_image.show()

5. 旋轉和翻轉

   image = Image.open('guido.jpg')
   # 使用Image物件的rotate方法實現影象的旋轉
   image.rotate(45).show()
   # 使用Image物件的transpose方法實現影象翻轉
   # Image.FLIP_LEFT_RIGHT - 水平翻轉
   # Image.FLIP_TOP_BOTTOM - 垂直翻轉
   image.transpose(Image.FLIP_TOP_BOTTOM).show()

6. 操作畫素

   for x in range(80, 310):
       for y in range(20, 360):
           # 通過Image物件的putpixel方法修改影象指定畫素點
           image.putpixel((x, y), (128, 128, 128))
   image.show()

7. 濾鏡效果

   from PIL import ImageFilter

​​​​​​​   # 使用Image物件的filter方法對影象進行濾鏡處理
   # ImageFilter模組包含了諸多預設的濾鏡也可以自定義濾鏡
   image.filter(ImageFilter.CONTOUR).show()

使用Pillow繪圖

Pillow中有一個名為ImageDraw的模組,該模組的Draw函數會返回一個ImageDraw物件,通過ImageDraw物件的arc、line、rectangle、ellipse、polygon等方法,可以在影象上繪製出圓弧、線條、矩形、橢圓、多邊形等形狀,也可以通過該物件的text方法在影象上新增文字。

完整的程式碼如下所示。

import random

from PIL import Image, ImageDraw, ImageFont


def random_color():
    """生成隨機顏色"""
    red = random.randint(0, 255)
    green = random.randint(0, 255)
    blue = random.randint(0, 255)
    return red, green, blue


width, height = 800, 600
# 建立一個800*600的影象,背景色為白色
image = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
# 建立一個ImageDraw物件
drawer = ImageDraw.Draw(image)
# 通過指定字型和大小獲得ImageFont物件
font = ImageFont.truetype('Kongxin.ttf', 32)
# 通過ImageDraw物件的text方法繪製文字
drawer.text((300, 50), 'Hello, world!', fill=(255, 0, 0), font=font)
# 通過ImageDraw物件的line方法繪製兩條對角直線
drawer.line((0, 0, width, height), fill=(0, 0, 255), width=2)
drawer.line((width, 0, 0, height), fill=(0, 0, 255), width=2)
xy = width // 2 - 60, height // 2 - 60, width // 2 + 60, height // 2 + 60
# 通過ImageDraw物件的rectangle方法繪製矩形
drawer.rectangle(xy, outline=(255, 0, 0), width=2)
# 通過ImageDraw物件的ellipse方法繪製橢圓
for i in range(4):
    left, top, right, bottom = 150 + i * 120, 220, 310 + i * 120, 380
    drawer.ellipse((left, top, right, bottom), outline=random_color(), width=8)
# 顯示影象
image.show()
# 儲存影象
image.save('result.png')

注意:上面程式碼中使用的字型檔案需要根據自己準備,可以選擇自己喜歡的字型檔案並放置在程式碼目錄下。

總結

使用Python語言做開發,除了可以用Pillow來處理影象外,還可以使用更為強大的OpenCV庫來完成圖形影象的處理,OpenCV(Open Source Computer Vision Library)是一個跨平臺的計算機視覺庫,可以用來開發實時影象處理、計算機視覺和圖形識別程式。在我們的日常工作中,有很多繁瑣乏味的任務其實都可以通過Python程式來處理,程式設計的目的就是讓計算機幫助我們解決問題,減少重複乏味的勞動。

以上就是Python實現影象壓縮和影象處理詳解的詳細內容,更多關於Python影象壓縮的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com