Python實(shí)現(xiàn)圖像壓縮和圖像處理詳解
入門(mén)了解1.顏色
如果你有使用顏料畫(huà)畫(huà)的經(jīng)歷,那么一定知道混合紅、黃、藍(lán)三種顏料可以得到其他的顏色,事實(shí)上這三種顏色就是美術(shù)中的三原色,它們是不能再分解的基本顏色。在計(jì)算機(jī)中,我們可以將紅、綠、藍(lán)三種色光以不同的比例疊加來(lái)組合成其他的顏色,因此這三種顏色就是色光三原色。在計(jì)算機(jī)系統(tǒng)中,我們通常會(huì)將一個(gè)顏色表示為一個(gè)RGB值或RGBA值(其中的A表示Alpha通道,它決定了透過(guò)這個(gè)圖像的像素,也就是透明度)。
名稱(chēng) | RGB值 | 名稱(chēng) | RGB值 |
---|---|---|---|
White(白) | (255, 255, 255) | Red(紅) | (255, 0, 0) |
Green(綠) | (0, 255, 0) | Blue(藍(lán)) | (0, 0, 255) |
Gray(灰) | (128, 128, 128) | Yellow(黃) | (255, 255, 0) |
Black(黑) | (0, 0, 0) | Purple(紫) | (128, 0, 128) |
入門(mén)了解 2. 像素
對(duì)于一個(gè)由數(shù)字序列表示的圖像來(lái)說(shuō),最小的單位就是圖像上單一顏色的小方格,這些小方塊都有一個(gè)明確的位置和被分配的色彩數(shù)值,而這些一小方格的顏色和位置決定了該圖像最終呈現(xiàn)出來(lái)的樣子,它們是不可分割的單位,我們通常稱(chēng)之為像素(pixel)。每一個(gè)圖像都包含了一定量的像素,這些像素決定圖像在屏幕上所呈現(xiàn)的大小,大家如果愛(ài)好拍照或者自拍,對(duì)像素這個(gè)詞就不會(huì)陌生。
用Pillow處理圖像
Pillow是由從著名的Python圖像處理庫(kù)PIL發(fā)展出來(lái)的一個(gè)分支,通過(guò)Pillow可以實(shí)現(xiàn)圖像壓縮和圖像處理等各種操作??梢允褂孟旅娴拿顏?lái)安裝Pillow。
pip install pillow
Pillow中最為重要的是Image類(lèi),可以通過(guò)Image模塊的open函數(shù)來(lái)讀取圖像并獲得Image類(lèi)型的對(duì)象。
1. 讀取和顯示圖像
from PIL import Image # 讀取圖像獲得Image對(duì)象 image = Image.open('guido.jpg') # 通過(guò)Image對(duì)象的format屬性獲得圖像的格式 print(image.format) # JPEG # 通過(guò)Image對(duì)象的size屬性獲得圖像的尺寸 print(image.size) # (500, 750) # 通過(guò)Image對(duì)象的mode屬性獲取圖像的模式 print(image.mode) # RGB # 通過(guò)Image對(duì)象的show方法顯示圖像 image.show()
2. 剪裁圖像
# 通過(guò)Image對(duì)象的crop方法指定剪裁區(qū)域剪裁圖像 image.crop((80, 20, 310, 360)).show()
3. 生成縮略圖
# 通過(guò)Image對(duì)象的thumbnail方法生成指定尺寸的縮略圖 image.thumbnail((128, 128)) image.show()
4. 縮放和黏貼圖像
# 讀取駱昊的照片獲得Image對(duì)象 luohao_image = Image.open('luohao.png') # 讀取吉多的照片獲得Image對(duì)象 guido_image = Image.open('guido.jpg') # 從吉多的照片上剪裁出吉多的頭 guido_head = guido_image.crop((80, 20, 310, 360)) width, height = guido_head.size # 使用Image對(duì)象的resize方法修改圖像的尺寸 # 使用Image對(duì)象的paste方法將吉多的頭粘貼到駱昊的照片上 luohao_image.paste(guido_head.resize((int(width / 1.5), int(height / 1.5))), (172, 40)) luohao_image.show()
5. 旋轉(zhuǎn)和翻轉(zhuǎn)
image = Image.open('guido.jpg') # 使用Image對(duì)象的rotate方法實(shí)現(xiàn)圖像的旋轉(zhuǎn) image.rotate(45).show() # 使用Image對(duì)象的transpose方法實(shí)現(xiàn)圖像翻轉(zhuǎn) # Image.FLIP_LEFT_RIGHT - 水平翻轉(zhuǎn) # Image.FLIP_TOP_BOTTOM - 垂直翻轉(zhuǎn) image.transpose(Image.FLIP_TOP_BOTTOM).show()
6. 操作像素
for x in range(80, 310): for y in range(20, 360): # 通過(guò)Image對(duì)象的putpixel方法修改圖像指定像素點(diǎn) image.putpixel((x, y), (128, 128, 128)) image.show()
7. 濾鏡效果
from PIL import ImageFilter ??????? # 使用Image對(duì)象的filter方法對(duì)圖像進(jìn)行濾鏡處理 # ImageFilter模塊包含了諸多預(yù)設(shè)的濾鏡也可以自定義濾鏡 image.filter(ImageFilter.CONTOUR).show()
使用Pillow繪圖
Pillow中有一個(gè)名為ImageDraw的模塊,該模塊的Draw函數(shù)會(huì)返回一個(gè)ImageDraw對(duì)象,通過(guò)ImageDraw對(duì)象的arc、line、rectangle、ellipse、polygon等方法,可以在圖像上繪制出圓弧、線(xiàn)條、矩形、橢圓、多邊形等形狀,也可以通過(guò)該對(duì)象的text方法在圖像上添加文字。
完整的代碼如下所示。
import random from PIL import Image, ImageDraw, ImageFont def random_color(): """生成隨機(jī)顏色""" red = random.randint(0, 255) green = random.randint(0, 255) blue = random.randint(0, 255) return red, green, blue width, height = 800, 600 # 創(chuàng)建一個(gè)800*600的圖像,背景色為白色 image = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255)) # 創(chuàng)建一個(gè)ImageDraw對(duì)象 drawer = ImageDraw.Draw(image) # 通過(guò)指定字體和大小獲得ImageFont對(duì)象 font = ImageFont.truetype('Kongxin.ttf', 32) # 通過(guò)ImageDraw對(duì)象的text方法繪制文字 drawer.text((300, 50), 'Hello, world!', fill=(255, 0, 0), font=font) # 通過(guò)ImageDraw對(duì)象的line方法繪制兩條對(duì)角直線(xiàn) 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 # 通過(guò)ImageDraw對(duì)象的rectangle方法繪制矩形 drawer.rectangle(xy, outline=(255, 0, 0), width=2) # 通過(guò)ImageDraw對(duì)象的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')
注意:上面代碼中使用的字體文件需要根據(jù)自己準(zhǔn)備,可以選擇自己喜歡的字體文件并放置在代碼目錄下。
總結(jié)
使用Python語(yǔ)言做開(kāi)發(fā),除了可以用Pillow來(lái)處理圖像外,還可以使用更為強(qiáng)大的OpenCV庫(kù)來(lái)完成圖形圖像的處理,OpenCV(Open Source Computer Vision Library)是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺(jué)庫(kù),可以用來(lái)開(kāi)發(fā)實(shí)時(shí)圖像處理、計(jì)算機(jī)視覺(jué)和模式識(shí)別程序。在我們的日常工作中,有很多繁瑣乏味的任務(wù)其實(shí)都可以通過(guò)Python程序來(lái)處理,編程的目的就是讓計(jì)算機(jī)幫助我們解決問(wèn)題,減少重復(fù)乏味的勞動(dòng)。
以上就是Python實(shí)現(xiàn)圖像壓縮和圖像處理詳解的詳細(xì)內(nèi)容,更多關(guān)于Python圖像壓縮的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 文件數(shù)據(jù)讀寫(xiě)的具體實(shí)現(xiàn)
這篇文章主要介紹了Python 文件數(shù)據(jù)讀寫(xiě)的具體實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01使用Pandas將inf, nan轉(zhuǎn)化成特定的值
今天小編就為大家分享一篇使用Pandas將inf, nan轉(zhuǎn)化成特定的值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12詳解Python實(shí)現(xiàn)多進(jìn)程異步事件驅(qū)動(dòng)引擎
本篇文章主要介紹了詳解Python實(shí)現(xiàn)多進(jìn)程異步事件驅(qū)動(dòng)引擎,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08python淘寶搶購(gòu)腳本程序?qū)崿F(xiàn)
大家好,本篇文章主要講的是python淘寶搶購(gòu)腳本程序?qū)崿F(xiàn),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-02-02jupyter lab的目錄調(diào)整及設(shè)置默認(rèn)瀏覽器為chrome的方法
這篇文章主要介紹了jupyter lab的目錄調(diào)整及設(shè)置默認(rèn)瀏覽器為chrome的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python利用Diagrams繪制漂亮的系統(tǒng)架構(gòu)圖
Diagrams 是一個(gè)基于Python繪制云系統(tǒng)架構(gòu)的模塊,它能夠通過(guò)非常簡(jiǎn)單的描述就能可視化架構(gòu)。本文將利用它繪制漂亮的系統(tǒng)架構(gòu)圖,感興趣的可以了解一下2023-01-01Centos 升級(jí)到python3后pip 無(wú)法使用的解決方法
今天小編就為大家分享一篇Centos 升級(jí)到python3后pip 無(wú)法使用的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python+OpenCV進(jìn)行不規(guī)則多邊形ROI區(qū)域提取
ROI即感興趣區(qū)域。機(jī)器視覺(jué)、圖像處理中,從被處理的圖像以方框、圓、橢圓、不規(guī)則多邊形等方式勾勒出需要處理的區(qū)域,稱(chēng)為感興趣區(qū)域,ROI。本文將利用Python和OpenCV實(shí)現(xiàn)不規(guī)則多邊形ROI區(qū)域提取,需要的可以參考一下2022-03-03