Python圖片處理之圖片采樣處理詳解
一.圖像采樣處理原理
圖像采樣(Image Sampling)處理是將一幅連續(xù)圖像在空間上分割成M×N個(gè)網(wǎng)格,每個(gè)網(wǎng)格用一個(gè)亮度值或灰度值來(lái)表示,其示意圖如圖9-1所示。
圖像采樣的間隔越大,所得圖像像素?cái)?shù)越少,空間分辨率越低,圖像質(zhì)量越差,甚至出現(xiàn)馬賽克效應(yīng);相反,圖像采樣的間隔越小,所得圖像像素?cái)?shù)越多,空間分辨率越高,圖像質(zhì)量越好,但數(shù)據(jù)量會(huì)相應(yīng)的增大。圖9-2展示了不同采樣間隔的“Lena”圖,其中圖(a)為原始圖像,圖(b)為128×128的圖像采樣效果,圖©為64×64的圖像采樣效果,圖(d)為32×32的圖像采樣效果,圖(e)為16×16的圖像采樣效果,圖(f)為8×8的圖像采樣效果[1-3]。
二.圖像采樣實(shí)現(xiàn)
下面講述Python圖像采樣處理相關(guān)代碼操作。其核心流程是建立一張臨時(shí)圖片,設(shè)置需要采樣的區(qū)域大小(如16×16),接著循環(huán)遍歷原始圖像中所有像素點(diǎn),采樣區(qū)域內(nèi)的像素點(diǎn)賦值相同(如左上角像素點(diǎn)的灰度值),最終實(shí)現(xiàn)圖像采樣處理。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像 img = cv2.imread('lena-hd.png') #獲取圖像高度和寬度 height = img.shape[0] width = img.shape[1] #采樣轉(zhuǎn)換成16*16區(qū)域 numHeight = int(height/16) numWidth = int(width/16) #創(chuàng)建一幅圖像 new_img = np.zeros((height, width, 3), np.uint8) #圖像循環(huán)采樣16*16區(qū)域 for i in range(16): #獲取Y坐標(biāo) y = i*numHeight for j in range(16): #獲取X坐標(biāo) x = j*numWidth #獲取填充顏色 左上角像素點(diǎn) b = img[y, x][0] g = img[y, x][1] r = img[y, x][2] #循環(huán)設(shè)置小區(qū)域采樣 for n in range(numHeight): for m in range(numWidth): new_img[y+n, x+m][0] = np.uint8(b) new_img[y+n, x+m][1] = np.uint8(g) new_img[y+n, x+m][2] = np.uint8(r) #顯示圖像 cv2.imshow("src", img) cv2.imshow("Sampling", new_img) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
其輸出結(jié)果如圖9-3所示,它將灰度圖像采樣成16×16的區(qū)域。
同樣,可以對(duì)彩色圖像進(jìn)行采樣處理,下面的代碼將“小珞珞”的圖像采樣處理成8×8的馬賽克區(qū)域。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像 img = cv2.imread('luo.png') #獲取圖像高度和寬度 height = img.shape[0] width = img.shape[1] #采樣轉(zhuǎn)換成8×8區(qū)域 numHeight = int(height/8) numwidth = int(width/8) #創(chuàng)建一幅圖像 new_img = np.zeros((height, width, 3), np.uint8) #圖像循環(huán)采樣8*8區(qū)域 for i in range(8): #獲取Y坐標(biāo) y = i*numHeight for j in range(8): #獲取X坐標(biāo) x = j*numwidth #獲取填充顏色 左上角像素點(diǎn) b = img[y, x][0] g = img[y, x][1] r = img[y, x][2] #循環(huán)設(shè)置小區(qū)域采樣 for n in range(numHeight): for m in range(numwidth): new_img[y+n, x+m][0] = np.uint8(b) new_img[y+n, x+m][1] = np.uint8(g) new_img[y+n, x+m][2] = np.uint8(r) #顯示圖像 cv2.imshow("src", img) cv2.imshow("Sampling", new_img) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
其輸出結(jié)果如圖9-4所示,它將彩色圖像采樣成8×8的區(qū)域。
但上述代碼存在一個(gè)問(wèn)題,當(dāng)圖像的長(zhǎng)度和寬度不能被采樣區(qū)域整除時(shí),輸出圖像的最右邊和最下邊的區(qū)域沒(méi)有被采樣處理。這里推薦讀者做個(gè)求余運(yùn)算,將不能整除部分的區(qū)域也進(jìn)行相應(yīng)的采樣處理。
三.圖像局部采樣處理
前面講述的代碼是對(duì)整幅圖像進(jìn)行采樣處理,那么如何對(duì)圖像的局部區(qū)域進(jìn)行馬賽克處理呢?下面的代碼就實(shí)現(xiàn)了該功能。當(dāng)鼠標(biāo)按下時(shí),它能夠給鼠標(biāo)拖動(dòng)的區(qū)域打上馬賽克,并按下“s”鍵保存圖像至本地。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像 im = cv2.imread('luo.png', 1) #設(shè)置鼠標(biāo)左鍵開(kāi)啟 en = False #鼠標(biāo)事件 def draw(event, x, y, flags, param): global en #鼠標(biāo)左鍵按下開(kāi)啟en值 if event==cv2.EVENT_LBUTTONDOWN: en = True #鼠標(biāo)左鍵按下并且移動(dòng) elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_LBUTTONDOWN: #調(diào)用函數(shù)打馬賽克 if en: drawMask(y,x) #鼠標(biāo)左鍵彈起結(jié)束操作 elif event==cv2.EVENT_LBUTTONUP: en = False #圖像局部采樣操作 def drawMask(x, y, size=10): #size*size采樣處理 m = int(x / size * size) n = int(y / size * size) print(m, n) #10*10區(qū)域設(shè)置為同一像素值 for i in range(size): for j in range(size): im[m+i][n+j] = im[m][n] #打開(kāi)對(duì)話框 cv2.namedWindow('image') #調(diào)用draw函數(shù)設(shè)置鼠標(biāo)操作 cv2.setMouseCallback('image', draw) #循環(huán)處理 while(1): cv2.imshow('image', im) #按ESC鍵退出 if cv2.waitKey(10)&0xFF==27: break #按s鍵保存圖片 elif cv2.waitKey(10)&0xFF==115: cv2.imwrite('sava.png', im) #退出窗口 cv2.destroyAllWindows()
其輸出結(jié)果如圖9-5所示,它將人物的臉部進(jìn)行馬賽克處理。
四.總結(jié)
本文主要講解了圖像的采樣處理,從基本概念到操作,再到擴(kuò)展進(jìn)行全方位講解,并且補(bǔ)充了局部馬賽克采樣處理案例。該部分的知識(shí)點(diǎn)能夠?qū)⑸钪械膱D像轉(zhuǎn)換為數(shù)字圖像,更好地為后續(xù)的圖像處理提供幫助。
以上就是Python圖片處理之圖片采樣處理詳解的詳細(xì)內(nèi)容,更多關(guān)于Python圖片采樣處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)刪除當(dāng)前目錄下除當(dāng)前腳本以外的文件和文件夾實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)刪除當(dāng)前目錄下除當(dāng)前腳本以外的文件和文件夾的方法,涉及Python針對(duì)目錄及文件的刪除技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07Python 專題一 函數(shù)的基礎(chǔ)知識(shí)
本文從系統(tǒng)提供的內(nèi)部函數(shù)、第三方提供函數(shù)庫(kù)+簡(jiǎn)單爬出代碼及安裝httplib2模塊過(guò)程和用戶自定函數(shù)三個(gè)方面進(jìn)行講述。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03python 利用瀏覽器 Cookie 模擬登錄的用戶訪問(wèn)知乎的方法
今天小編就為大家分享一篇python 利用瀏覽器 Cookie 模擬登錄的用戶訪問(wèn)知乎的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07python利用插值法對(duì)折線進(jìn)行平滑曲線處理
這篇文章主要為大家詳細(xì)介紹了python利用插值法對(duì)折線進(jìn)行平滑曲線處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Python實(shí)現(xiàn)圖書借閱管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)圖書借閱管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Transformer導(dǎo)論之Bert預(yù)訓(xùn)練語(yǔ)言解析
這篇文章主要為大家介紹了Transformer導(dǎo)論之Bert預(yù)訓(xùn)練語(yǔ)言解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03