Python使用嵌套循環(huán)實(shí)現(xiàn)圖像處理算法
01、圖像的數(shù)據(jù)結(jié)構(gòu)概述
使用Python第三方圖像處理庫(kù)Pillow處理圖像時(shí),通常是調(diào)用模塊中提供的函數(shù)和對(duì)象來(lái)實(shí)現(xiàn)圖像的基本處理。
實(shí)際上,在“底層”圖像是由像素點(diǎn)組成的二維數(shù)組,每個(gè)像素點(diǎn)的位置表示為兩個(gè)整數(shù)的元組,像素的值根據(jù)圖像模式由對(duì)應(yīng)的元組組成(例如,RGB模式表示為三個(gè)整數(shù)值組成的元組,分別表示構(gòu)成顏色的紅、藍(lán)、綠的值,范圍為0到255)。
圖像處理的算法(例如,復(fù)制、旋轉(zhuǎn)、裁剪和平滑圖像等)根本上就是使用嵌套循環(huán)模式對(duì)這些像素進(jìn)行處理。PIL.Image模塊中的Image類的方法getpixel()和putpixel()可以用于讀取和修改特定位置(loc)的像素的顏色值(pix)。其語(yǔ)法格式如下:
im.getpixel(loc) #返回位于位置loc的像素的顏色。
im.putpixel(loc, pix) #把位于位置loc的顏色替換為pix。
02、拷貝圖像
拷貝圖像的算法可以通過(guò)打開(kāi)原始圖像,創(chuàng)建一個(gè)新的大小相同的空白圖像,然后將舊圖像中的像素顏色復(fù)制到新圖像相應(yīng)的像素中。即使用嵌套循環(huán),把舊圖像位置(i, j)的像素復(fù)制到新圖像的位置(i, j)。
【例1】實(shí)現(xiàn)圖像拷貝函數(shù)copy(),輸入原始圖像對(duì)象,返回拷貝后的圖像對(duì)象。
import PIL.Image def copy(im): """返回拷貝后的圖像對(duì)象""" # 創(chuàng)建與原始圖像相同模式和大小的新圖像對(duì)象 im_new = PIL.Image.new(im.mode, im.size) width, height = im.size # 使用嵌套循環(huán),把舊圖像位置(i, j)的像素復(fù)制到新圖像的位置(i, j) for i in range(0, width): for j in range(0, height): pix = im.getpixel((i,j)) im_new.putpixel((i,j), pix) return im_new #測(cè)試代碼 if __name__ == "__main__": im = PIL.Image.open("c:/pythonpa/cs/img/mandrill.jpg") copy(im).show()
03、剪裁圖像
剪裁圖像的算法可以通過(guò)打開(kāi)原始圖像,指定一個(gè)四元組的剪裁框,創(chuàng)建一個(gè)與剪裁框大小相同的空白圖像,然后將舊圖像中剪裁框內(nèi)的像素顏色復(fù)制到新圖像中。同樣可以使用嵌套循環(huán)實(shí)現(xiàn)像素復(fù)制。
【例2】實(shí)現(xiàn)圖像剪裁函數(shù)crop(),輸入原始圖像對(duì)象,返回剪裁后的圖像對(duì)象。
import PIL.Image def crop(im, box): """返回使用矩形框剪切后的圖像對(duì)象""" # 剪切框定義左上角和右下角坐標(biāo)位置 x1,y1,x2,y2 = box # 計(jì)算新圖像的寬度width和高度height,并創(chuàng)建新圖像 width,height = x2-x1, y2-y1 im_new = PIL.Image.new(im.mode, (width, height)) # 使用嵌套循環(huán),把舊圖像剪切框內(nèi)的像素拷貝到新圖像 for i in range(width): for j in range(height): pix = im.getpixel((x1+i,y1+j)) im_new.putpixel((i,j), pix) return im_new #測(cè)試代碼 if __name__ == "__main__": im = PIL.Image.open("c:/pythonpa/cs/img/mandrill.jpg") crop(im).show()
04、水平或垂直翻轉(zhuǎn)圖像
水平或垂直翻轉(zhuǎn)的算法可以通過(guò)打開(kāi)原始圖像,創(chuàng)建一個(gè)新的大小相同的空白圖像,然后將舊圖像中的像素顏色復(fù)制到新圖像相應(yīng)的像素中。水平翻轉(zhuǎn)時(shí),原始圖像的像素(i,j)映射到目標(biāo)圖像的位置(width-i-1,j);垂直翻轉(zhuǎn)時(shí),原始圖像的像素(i,j)映射到目標(biāo)圖像的位置(i,height-j-1)。
【例3】實(shí)現(xiàn)圖像水平或垂直翻轉(zhuǎn)函數(shù)flip(),輸入原始圖像對(duì)象,返回水平或垂直翻轉(zhuǎn)后的圖像對(duì)象。
import PIL.Image def flip(im, orient="H"): """返回水平或垂直翻轉(zhuǎn)后的圖像對(duì)象""" # 獲取圖像的寬度width和高度height,并創(chuàng)建新圖像 width,height = im.size im_new = PIL.Image.new(im.mode, im.size) # 使用嵌套循環(huán),把舊圖像的像素拷貝到新圖像對(duì)應(yīng)位置 for i in range(width): for j in range(height): pix = im.getpixel((i,j)) if orient == "H": #水平翻轉(zhuǎn)時(shí) # 原始圖像的像素(i,j)映射到目標(biāo)圖像的位置(width-i-1,j) im_new.putpixel((width-i-1,j), pix) else: #垂直翻轉(zhuǎn)時(shí) # 原始圖像的像素(i,j)映射到目標(biāo)圖像的位置(i,height-j-1) im_new.putpixel((i,height-j-1), pix) return im_new #測(cè)試代碼 if __name__ == "__main__": im = PIL.Image.open("c:/pythonpa/cs/img/mandrill.jpg") flip(im, orient="H").show() flip(im, orient="V").show()
05、逆時(shí)針或順時(shí)針旋轉(zhuǎn)圖像90度
逆時(shí)針或順時(shí)針旋轉(zhuǎn)圖像90度的算法可以通過(guò)打開(kāi)原始圖像(width×height),創(chuàng)建一個(gè)新的height×width大小的空白圖像,然后將舊圖像中的像素顏色復(fù)制到新圖像中相應(yīng)的像素中。逆時(shí)針旋轉(zhuǎn)圖像90度時(shí),原始圖像的像素(i,j)映射到目標(biāo)圖像的位置(j,width-i-1);順時(shí)針旋轉(zhuǎn)圖像90度,原始圖像的像素(i,j)映射到目標(biāo)圖像的位置(height-j-1,i)。
【例4】實(shí)現(xiàn)圖像逆時(shí)針或順時(shí)針旋轉(zhuǎn)90度的函數(shù)rotate(),輸入原始圖像對(duì)象,返回逆時(shí)針或順時(shí)針旋轉(zhuǎn)90度后的圖像對(duì)象。
import PIL.Image def rotate(im, orient="CC"): """返回逆時(shí)針或順時(shí)針旋轉(zhuǎn)90度后的圖像對(duì)象""" # 獲取圖像的寬度width和高度height,并創(chuàng)建新圖像 width,height = im.size im_new = PIL.Image.new(im.mode, im.size) # 使用嵌套循環(huán),把舊圖像的像素拷貝到新圖像對(duì)應(yīng)位置 for i in range(0, width): for j in range(0, height): pixel = im.getpixel((i,j)) if orient == "CC": #逆時(shí)針針旋轉(zhuǎn)90度時(shí) # 原始圖像的像素(i,j)映射到目標(biāo)圖像的位置(j,width-i-1) im_new.putpixel((j, width-i-1), pixel) else: #順時(shí)針旋轉(zhuǎn)90度時(shí) # 原始圖像的像素(i,j)映射到目標(biāo)圖像的位置(height-j-1,i) im_new.putpixel((height-j-1, i), pixel) return im_new #測(cè)試代碼 if __name__ == "__main__": im = PIL.Image.open("c:/pythonpa/cs/img/mandrill.jpg") rotate(im, orient="H").show() rotate(im, orient="V").show()
06、平滑圖像過(guò)濾器
圖像過(guò)濾器是原始圖像中靠近位置(i, j)的多個(gè)像素顏色以某種方式組合運(yùn)算形成的新的圖像對(duì)象。
例如,簡(jiǎn)單的平滑過(guò)濾器算法可以通過(guò)打開(kāi)原始圖像,創(chuàng)建一個(gè)新的大小相同的空白圖像,然后將將新圖像中的每個(gè)像素(i, j)的顏色設(shè)置為原始像素(i, j)及其相鄰像素的顏色的平均值。不位于圖像邊界上像素(i, j)有8個(gè)相鄰像素,其相鄰像素位于從列i – 1到列i + 1和行j + 1到行j + 1范圍。故可以通過(guò)下列代碼計(jì)算新圖像中像素(i, j)的顏色:原始圖像中像素(i, j)和它的鄰居像素的顏色的平均值。注意,如果像素位于邊緣,在i-1可能小于0,故可以使用max(i-1, 0)作為下限;同樣,可以使用min(i+1, width)作為上限。
【例5】實(shí)現(xiàn)平滑圖像過(guò)濾器函數(shù)smooth(),輸入原始圖像對(duì)象,返回平滑過(guò)濾后的圖像對(duì)象。
import PIL.Image def smooth(im): """返回拷貝后的圖像對(duì)象""" # 創(chuàng)建與原始圖像相同模式和大小的新圖像對(duì)象 im_new = PIL.Image.new(im.mode, im.size) width, height = im.size # 使用嵌套循環(huán),把舊圖像位置(i, j)的像素復(fù)制到新圖像的位置(i, j) for i in range(0, width): for j in range(0, height): pix = im.getpixel((i,j)) im_new.putpixel((i,j), pix) return im_new #測(cè)試代碼 if __name__ == "__main__": im = PIL.Image.open("c:/pythonpa/cs/img/mandrill.jpg") smooth(im).show()
到此這篇關(guān)于Python使用嵌套循環(huán)實(shí)現(xiàn)圖像處理算法的文章就介紹到這了,更多相關(guān)Python圖像處理算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python爬蟲(chóng)實(shí)現(xiàn)模擬點(diǎn)擊動(dòng)態(tài)頁(yè)面
這篇文章主要介紹了Python爬蟲(chóng)實(shí)現(xiàn)模擬點(diǎn)擊動(dòng)態(tài)頁(yè)面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Pandas?DataFrame.drop()刪除數(shù)據(jù)的方法實(shí)例
pandas作為數(shù)據(jù)分析強(qiáng)大的庫(kù),是基于numpy數(shù)組構(gòu)建的,專門用來(lái)處理表格和混雜的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Pandas?DataFrame.drop()刪除數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2022-07-07Python有序字典簡(jiǎn)單實(shí)現(xiàn)方法示例
這篇文章主要介紹了Python有序字典簡(jiǎn)單實(shí)現(xiàn)方法,涉及Python使用OrderedDict方法進(jìn)行字典排序的相關(guān)操作技巧,需要的朋友可以參考下2017-09-09python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5打印控件QPrinter詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5打印控件QPrinter詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02Python 實(shí)現(xiàn)遙感影像波段組合的示例代碼
這篇文章主要介紹了Python 實(shí)現(xiàn)遙感影像波段組合的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08解決tensorflow由于未初始化變量而導(dǎo)致的錯(cuò)誤問(wèn)題
今天小編就為大家分享一篇解決tensorflow由于未初始化變量而導(dǎo)致的錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01