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