pillow 圖像分離與合并

2022-08-29 10:56 更新

我們知道,圖像(指數(shù)字圖像)由許多像素點(diǎn)組成,像素是組成圖像的基本單位,而每一個(gè)像素點(diǎn)又可以使用不同的顏色,最終呈現(xiàn)出了絢麗多彩的圖像。在《Pillow Image對(duì)象屬性》一節(jié),我們介紹一些圖片模式,它們的本質(zhì)就是圖片呈現(xiàn)顏色時(shí)需要遵循的規(guī)則,比如 RGB、RGBA、CYMK 等,而圖像的分離與合并,指的就是圖像顏色的分離和合并。

Image 類提供了用于分離圖像和合并圖像的方法? split() ?和? merge() ?方法,通常情況下,這兩個(gè)方法會(huì)一起使用。


split()

?split() ?的使用方法比較簡(jiǎn)單,用來(lái)分離顏色通道。我們使用它來(lái)處理蝴蝶圖片:

pillow分離圖片

圖1:pilow 圖像處理操作

代碼如下所示:

im=Image.open("C:/Users/Administrator/Desktop/1.jpg")
#修改圖像大小,以適應(yīng)圖像處理
image=im.resize((450,400))
image.save("C:/Users/Administrator/Desktop/2.jpg")
#分離顏色通道,產(chǎn)生三個(gè) Image對(duì)象
r,g,b = image.split()
r.show()
g.show()
b.show()

輸出的結(jié)果,依次展示如下:

pillow圖像處理

圖2:分離結(jié)果預(yù)覽


merge()

Image 類提供的? merge() ?方法可以實(shí)現(xiàn)圖像的合并操作。注意,圖像合并,可以是單個(gè)圖像合并,也可以合并兩個(gè)以上的圖像。

?merge() ?方法的語(yǔ)法格式如下:

Image.merge(mode, bands)

參數(shù)說(shuō)明如下:

  • mode:指定輸出圖片的模式
  • bands:參數(shù)類型為元組或者列表序列,其元素值是組成圖像的顏色通道,比如 RGB 分別代表三種顏色通道,可以表示為 (r,g,b)。

注意,該函數(shù)會(huì)返回一個(gè)新的 Image 對(duì)象。

下面對(duì)圖像合并的兩種類型分別進(jìn)行介紹:

一. 單個(gè)圖像的合并指的是將顏色通道進(jìn)行重新組合,從而得到不一樣的圖片效果,代碼如下所示:

from PIL import Image
im=Image.open("./1.jpg")
#修改圖像大小,以適應(yīng)圖像處理
image=im.resize((450,400))
image.save("C:/Users/Administrator/Desktop/2.jpg")
#分離顏色通道,產(chǎn)生三個(gè) Image對(duì)象
r,g,b = image.split()
#重新組合顏色通道,返回先的Image對(duì)象
image_merge=Image.merge('RGB',(b,g,r))
image_merge.show()
#保存圖像至桌面
image_merge.save("C:/Users/Administrator/Desktop/3.jpg")

新合成的圖像入如下所示:

pillow圖像處理

圖3:圖像合并操作

兩張圖片的合并操作也并不復(fù)雜,但是要求兩張圖片的模式、圖像大小必須要保持一致,否則不能合并。因此,對(duì)于那些模式、大小不同的圖片要進(jìn)行預(yù)處理。

下面我們將蝴蝶圖與向日葵圖進(jìn)行合并,向日葵原圖如下:

pillow圖片處理

圖4:向日葵原圖

示例代碼如下:

from PIL import Image
#打開圖2.jpg
im_1 = Image.open("C:/Users/Administrator/Desktop/2.jpg")
im_2= Image.open("C:/Users/Administrator/Desktop/向日葵.jpg")
#因?yàn)閮煞N圖片的圖片格式一致,所以僅需要處理圖片的大小,讓它們保持一致
#讓 im_2 的圖像尺寸與 im_1 一致,注意此處新生成了 Image 對(duì)象
image = im_2.resize(im_1.size)
#接下來(lái),對(duì)圖像進(jìn)行顏色分離操作
r1, g1 ,b1 = im_1.split()
r2, g2 , b2 = image.split()
# 合并圖像
im_3 = Image.merge('RGB',[r2,g1,b2])
im_3.show()
im_3.save("C:/Users/Administrator/Desktop/合成.jpg")

預(yù)覽圖像的合成結(jié)果:

pillow圖像合成

圖5:合成圖像

擴(kuò)展知識(shí):blend() 混合圖片

Image 類也提供了? blend() ?方法來(lái)混合 RGBA 模式的圖片(PNG 格式),函數(shù)的語(yǔ)法格式如下:

Image.blend(image1,image2, alpha)

參數(shù)說(shuō)明如下:

  • image1image2:表示兩個(gè) Image 對(duì)象。
  • alpha:表示透明度,取值范圍為 0 到 1,當(dāng)取值為 0 時(shí),輸出圖像相當(dāng)于 image1 的拷貝,而取值為 1 時(shí),則是 image2 的拷貝,只有當(dāng)取值為 0.5 時(shí),才為兩個(gè)圖像的中合。因此改值的大小決定了兩個(gè)圖像的混合程度。

與 RGB 模式相比,RGBA 在 RGB 的基礎(chǔ)上增加了透明度,通過 Alpha 取值來(lái)決定兩個(gè)圖像的混合程度。示例如下:

""""
混合 rgba模式的圖像
"""
im1 = Image.open("../1.png")
image = Image.open("../w3cschool.png")
im2=image.resize(im1.size)
def blend_im(im1,im2):
     #設(shè)置 alpha 為 0.5
    Image.blend(im1,im2,0.5).save("../合成結(jié)果.png")
#調(diào)用函數(shù)
blend_im(im1,im2)  



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)