最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ì)象來實(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)。其語法格式如下:

im.getpixel(loc)    #返回位于位置loc的像素的顏色。

im.putpixel(loc, pix) #把位于位置loc的顏色替換為pix。

02、拷貝圖像

拷貝圖像的算法可以通過打開原始圖像,創(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、剪裁圖像

剪裁圖像的算法可以通過打開原始圖像,指定一個(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)的算法可以通過打開原始圖像,創(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度的算法可以通過打開原始圖像(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、平滑圖像過濾器

圖像過濾器是原始圖像中靠近位置(i, j)的多個(gè)像素顏色以某種方式組合運(yùn)算形成的新的圖像對(duì)象。

例如,簡(jiǎn)單的平滑過濾器算法可以通過打開原始圖像,創(chuàng)建一個(gè)新的大小相同的空白圖像,然后將將新圖像中的每個(gè)像素(i, j)的顏色設(shè)置為原始像素(i, j)及其相鄰像素的顏色的平均值。不位于圖像邊界上像素(i, j)有8個(gè)相鄰像素,其相鄰像素位于從列i – 1到列i + 1和行j + 1到行j + 1范圍。故可以通過下列代碼計(jì)算新圖像中像素(i, j)的顏色:原始圖像中像素(i, j)和它的鄰居像素的顏色的平均值。注意,如果像素位于邊緣,在i-1可能小于0,故可以使用max(i-1, 0)作為下限;同樣,可以使用min(i+1, width)作為上限。

【例5】實(shí)現(xiàn)平滑圖像過濾器函數(shù)smooth(),輸入原始圖像對(duì)象,返回平滑過濾后的圖像對(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采用Django制作簡(jiǎn)易的知乎日?qǐng)?bào)API

    Python采用Django制作簡(jiǎn)易的知乎日?qǐng)?bào)API

    這篇文章主要為大家詳細(xì)介紹了Python采用Django制作簡(jiǎn)易的知乎日?qǐng)?bào)API,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Python 字符串大小寫轉(zhuǎn)換的簡(jiǎn)單實(shí)例

    Python 字符串大小寫轉(zhuǎn)換的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)硪黄狿ython 字符串大小寫轉(zhuǎn)換的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • Python實(shí)現(xiàn)的生成格雷碼功能示例

    Python實(shí)現(xiàn)的生成格雷碼功能示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的生成格雷碼功能,結(jié)合實(shí)例形式分析了格雷碼的原理與Python相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-01-01
  • Python第三方庫(kù)安裝緩慢的解決方法

    Python第三方庫(kù)安裝緩慢的解決方法

    這篇文章主要給大家介紹了關(guān)于Python第三方庫(kù)安裝緩慢的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python通過kerberos安全認(rèn)證操作kafka方式

    Python通過kerberos安全認(rèn)證操作kafka方式

    這篇文章主要介紹了Python通過kerberos安全認(rèn)證操作kafka方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 詳解model.train()和model.eval()兩種模式的原理與用法

    詳解model.train()和model.eval()兩種模式的原理與用法

    這篇文章主要介紹了詳解model.train()和model.eval()兩種模式的原理與用法,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,那么看完這篇文章一定會(huì)對(duì)你有所幫助
    2023-03-03
  • python中input()的用法及擴(kuò)展

    python中input()的用法及擴(kuò)展

    這篇文章主要介紹了python中input()的用法及擴(kuò)展,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python列表和集合的效率大比拼

    Python列表和集合的效率大比拼

    程序的運(yùn)行效率分為兩種:第一種是時(shí)間效率,第二種是空間效率,這篇文章主要介紹了Python列表和集合的效率對(duì)比,需要的朋友可以參考下
    2022-07-07
  • Python開源自動(dòng)化工具Playwright安裝及介紹使用

    Python開源自動(dòng)化工具Playwright安裝及介紹使用

    playwright-python是一個(gè)強(qiáng)大的Python庫(kù),僅用一個(gè)API即可自動(dòng)執(zhí)行Chromium、Firefox、WebKit等主流瀏覽器自動(dòng)化操作,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下
    2021-12-12
  • Python self用法詳解

    Python self用法詳解

    這篇文章主要介紹了Python self用法的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-11-11

最新評(píng)論

齐齐哈尔市| 忻州市| 西昌市| 安吉县| 彭州市| 新民市| 宜君县| 平昌县| 凌云县| 平武县| 汝州市| 阳春市| 桂东县| 雷州市| 县级市| 秦皇岛市| 扶风县| 德江县| 巨野县| 星子县| 古交市| 湟中县| 南部县| 兴安县| 阳城县| 大荔县| 遂宁市| 五寨县| 柳州市| 宁河县| 台江县| 太谷县| 吴旗县| 阳江市| 广平县| 遂平县| 鹤庆县| 青浦区| 汶川县| 文安县| 天津市|