Python圖像灰度變換及圖像數(shù)組操作
使用python以及numpy通過直接操作圖像數(shù)組完成一系列基本的圖像處理
numpy簡(jiǎn)介:
NumPy是一個(gè)非常有名的 Python 科學(xué)計(jì)算工具包,其中包含了大量有用的工具,比如數(shù)組對(duì)象(用來表示向量、矩陣、圖像等)以及線性代數(shù)函數(shù)。
數(shù)組對(duì)象可以實(shí)現(xiàn)數(shù)組中重要的操作,比如矩陣乘積、轉(zhuǎn)置、解方程系統(tǒng)、向量乘積和歸一化。這為圖像變形、對(duì)變化進(jìn)行建模、圖像分類、圖像聚類等提供了基礎(chǔ)。
在上一篇python基本圖像操作中,當(dāng)載入圖像時(shí),通過調(diào)用 array() 方法將圖像轉(zhuǎn)換成NumPy的數(shù)組對(duì)象。NumPy 中的數(shù)組對(duì)象是多維的,可以用來表示向量、矩陣和圖像。通過對(duì)圖像的數(shù)組進(jìn)行直接操作,就可以完成很多圖像處理。
numpy的相關(guān)知識(shí)網(wǎng)上有很多資料,作為python科學(xué)計(jì)算的基礎(chǔ),還是非常值得認(rèn)真學(xué)習(xí)的。
使用圖像數(shù)組進(jìn)行基本圖像操作:
認(rèn)識(shí)圖像數(shù)組:
通過下面這幾個(gè)程序我們看一下圖像與灰度圖的圖像數(shù)組,以及numpy數(shù)組的切片。
# -*- coding: utf-8 -*- from PIL import Image from pylab import * #讀取圖片并轉(zhuǎn)為數(shù)組 im = array(Image.open("./source/test.jpg")) #輸出數(shù)組的各維度長(zhǎng)度以及類型 print im.shape,im.dtype #輸出位于坐標(biāo)100,100,顏色通道為r的像素值 print im[100,100,0] #輸出坐標(biāo)100,100的rgb值 print im[100,100]及類型 print im.shape,im.dtype
運(yùn)行結(jié)果:
(600, 500, 3) uint8
64
[ 64 117 195]
我們看到的是一個(gè)三維數(shù)組,分別代表橫坐標(biāo),縱坐標(biāo)和顏色通道。
我們可以通過數(shù)組把紅藍(lán)通道交換
# -*- coding: utf-8 -*- from PIL import Image from pylab import * #讀取圖片并轉(zhuǎn)為數(shù)組 im = array(Image.open("./source/test.jpg")) #紅色通道 r = im[:,:,0] #交換紅藍(lán)通道并顯示 im[:,:,0] = im[:,:,2] im[:,:,2] = r imshow(im) show()
這里用到了numpy數(shù)組的切片方式,關(guān)于numpy的資料網(wǎng)上有很多,就不過多敘述了。
運(yùn)行結(jié)果:
在轉(zhuǎn)為數(shù)組的過程中我們可以設(shè)定數(shù)據(jù)類型,同時(shí)灰度圖的圖像數(shù)組也是有意義的:
# -*- coding: utf-8 -*- from PIL import Image from pylab import * #讀取圖片,灰度化,并轉(zhuǎn)為數(shù)組 im = array(Image.open("./source/test.jpg").convert('L'),'f') #輸出數(shù)組的各維度長(zhǎng)度以及類型 print im.shape,im.dtype #輸出坐標(biāo)100,100的值 print im[100,100]
運(yùn)行結(jié)果:
(600, 500) float32
110.0
額外的參數(shù)‘f'將數(shù)組的數(shù)據(jù)類型轉(zhuǎn)為浮點(diǎn)數(shù)
由于灰度圖沒有顏色信息,所以形狀元組只有兩個(gè)數(shù)值
*array()變換的相反操作可以使用PIL的fromarray()完成,如im = Image.fromarray(im)
圖像數(shù)組的簡(jiǎn)單應(yīng)用——灰度變換:
灰度圖像:
灰度數(shù)字圖像是每個(gè)像素只有一個(gè)采樣顏色的圖像。這類圖像通常顯示為從最暗黑色到最亮的白色的灰度。
可以通過下面幾種方法,將圖像轉(zhuǎn)換為灰度:
1.浮點(diǎn)算法:Gray=R*0.3+G*0.59+B*0.11
2.整數(shù)方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*76+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.僅取綠色:Gray=G;
通過上述任一種方法求得Gray后,將原來的RGB(R,G,B)中的R,G,B統(tǒng)一用Gray替換,形成新的顏色RGB(Gray,Gray,Gray),用它替換原來的RGB(R,G,B)就是灰度圖了。
之前已經(jīng)使用過很多次了,使用python可以通過使用convert(‘L')來獲得灰度圖
灰度變換:
將圖像讀入 NumPy 數(shù)組對(duì)象后,我們可以對(duì)它們執(zhí)行任意數(shù)學(xué)操作。一個(gè)簡(jiǎn)單的例子就是圖像的灰度變換。即任意函數(shù) f ,它將 0…255 區(qū)間(或者 0…1 區(qū)間)映射到自身。
下面程序中有一些簡(jiǎn)單的灰度變換:
#-*- coding: utf-8 -*- from PIL import Image from pylab import * #讀取圖片,灰度化,并轉(zhuǎn)為數(shù)組 im = array(Image.open("./source/test.jpg").convert('L')) im2 = 255 - im # 對(duì)圖像進(jìn)行反相處理 im3 = (100.0/255) * im + 100 # 將圖像像素值變換到 100...200 區(qū)間 im4 = 255.0 * (im/255.0)**2 # 對(duì)圖像像素值求平方后得到的圖像(二次函數(shù)變換,使較暗的像素值變得更小) #2x2顯示結(jié)果 使用第一個(gè)顯示原灰度圖 subplot(221) title('f(x) = x') gray() imshow(im) #2x2顯示結(jié)果 使用第二個(gè)顯示反相圖 subplot(222) title('f(x) = 255 - x') gray() imshow(im2) #2x2顯示結(jié)果 使用第三個(gè)顯示100-200圖 subplot(223) title('f(x) = (100/255)*x + 100') gray() imshow(im3) #2x2顯示結(jié)果 使用第四個(gè)顯示二次函數(shù)變換圖 subplot(224) title('f(x) =255 *(x/255)^2') gray() imshow(im4) #輸出圖中的最大和最小像素值 print int(im.min()),int(im.max()) print int(im2.min()),int(im2.max()) print int(im3.min()),int(im3.max()) print int(im4.min()),int(im4.max()) show()
運(yùn)行結(jié)果:
0 255
0 255
100 200
0 255
可以比較明顯的看到灰度變換的結(jié)果,,第二張圖被反相顯示,第三張圖像的暗部變亮,亮部變暗,其值被限制在100到200之間,其中最后一張圖像通過二次函數(shù)變換使較暗的像素值變得更暗。
結(jié)語:
本篇博客介紹了python使用圖像數(shù)組去進(jìn)行圖像操作的過程,包括幾個(gè)簡(jiǎn)單的實(shí)例,通過數(shù)組我們可以對(duì)圖像進(jìn)行任意數(shù)學(xué)操作,是圖像變形、圖像分類、圖像聚類等的基礎(chǔ),希望我的博客對(duì)大家有所幫助~
相關(guān)文章
Django makemigrations migrate執(zhí)行成功但不創(chuàng)建數(shù)據(jù)庫表的解決
這篇文章主要介紹了Django makemigrations migrate執(zhí)行成功但不創(chuàng)建數(shù)據(jù)庫表的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Python 點(diǎn)擊指定位置驗(yàn)證碼破解的實(shí)現(xiàn)代碼
這篇文章主要介紹了Python 點(diǎn)擊指定位置驗(yàn)證碼破解的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Python爬蟲實(shí)戰(zhàn)項(xiàng)目掌握酷狗音樂的加密過程
在常見的幾個(gè)音樂網(wǎng)站里,酷狗可以說是最好爬取的啦,什么彎都沒有,所以最適合小白入門爬蟲,本篇針對(duì)爬蟲零基礎(chǔ)的小白,所以每一步驟我都截圖并詳細(xì)解釋了,其實(shí)我自己看著都啰嗦,歸根到底就是兩個(gè)步驟的請(qǐng)求,還請(qǐng)大佬繞路勿噴2021-09-09python程序中的線程操作 concurrent模塊使用詳解
這篇文章主要介紹了python程序中的線程操作 concurrent模塊使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09