欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python使用嵌套循環(huán)實(shí)現(xiàn)圖像處理算法

 更新時(shí)間:2023年07月12日 09:41:52   作者:TiAmo zhang  
這篇文章主要給大家詳細(xì)介紹Python如何使用嵌套循環(huán)實(shí)現(xiàn)圖像處理算法,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下

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)文章

最新評(píng)論