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

Python圖像處理之幾何變換

 更新時間:2022年01月28日 08:41:01   作者:Eastmount  
這篇文章將詳細講解圖像幾何變換,包括圖像平移、圖像縮放和圖像旋轉。文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編學習一下

一.圖像幾何變換

圖像幾何變換不改變圖像的像素值,在圖像平面上進行像素變換。適當?shù)膸缀巫儞Q可以最大程度地消除由于成像角度、透視關系乃至鏡頭自身原因所造成的幾何失真所產生的負面影響。幾何變換常常作為圖像處理應用的預處理步驟,是圖像歸一化的核心工作之一[1]。

一個幾何變換需要兩部分運算:

空間變換:包括平移、縮放、旋轉和正平行投影等,需要用它來表示輸出圖像與輸入圖像之間的像素映射關系。

灰度插值算法:按照這種變換關系進行計算,輸出圖像的像素可能被映射到輸入圖像的非整數(shù)坐標上[2]。

圖像幾何變換在變換過程中會建立一種原圖像像素與變換后圖像像素之間的映射關系,通過這種關系,能夠從一方的像素計算出另一方的像素的坐標位置。通常將圖像坐標映射到輸出的過程稱作向前映射,反之,將輸出圖像映射到輸入的過程稱作向后映射。向后映射在實踐中使用較多,原因是能夠避免使用向前映射中出現(xiàn)映射不完全和映射重疊的問題。

圖6-1展示了圖像放大的示例,右邊圖中只有(0,0)、(0,2)、(2,0)、(2,2)四個坐標根據映射關系在原圖像中找到了相對應的像素,其余的12個坐標沒有有效值[3]。

對于數(shù)字圖像而言,像素的坐標是離散型非負整數(shù),但是在進行變換的過程中有可能產生浮點坐標值。這在圖像處理中是一個無效的坐標。為了解決這個問題需要用到插值算法。常見算法如下:

  • 最近鄰插值
  • 雙線性插值
  • 雙立方插值

圖像變換是建立在矩陣運算基礎上,通過矩陣運算可以很快找到對應關系。在這篇文章中,我們將介紹常見的圖像幾何變換,包括圖形平移、圖像縮放、圖像旋轉、圖像鏡像、圖像仿射、圖像透視等。

二.圖像平移

圖像平移是將圖像中的所有像素點按照給定的平移量進行水平或垂直方向上的移動。假設原始像素的位置坐標為(x0,y0),經過平移量(△x,△y)后,坐標變?yōu)椋▁1, y1),如圖6-2所示[3-5]。

用數(shù)學式子表示為公式(6-1)。

用矩陣表示如公式(6-2)所示:

式子中,矩陣稱為平移變換矩陣或因子,△x和△y稱為平移量。圖像平移首先定義平移矩陣M,再調用warpAffine()函數(shù)實現(xiàn)平移,核心函數(shù)如下:

M = np.float32([[1, 0, x], [0, 1, y]])

– M表示平移矩陣,其中x表示水平平移量,y表示垂直平移量

shifted = cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

– src表示原始圖像

– M表示平移矩陣

– dsize表示變換后的輸出圖像的尺寸大小

– dst為輸出圖像,其大小為dsize,類型與src相同

– flag表示插值方法的組合和可選值

– borderValue表示像素外推法,當borderMode = BORDER_TRANSPARENT時,表示目標圖像中的像素不會修改源圖像中的“異常值”。

– borderValue用于邊界不變的情況,默認情況下為0

下面代碼是圖像平移的一個簡單案例,它定義了圖像平移矩陣M,然后調用warpAffine()函數(shù)將原始圖像垂直向下平移了50個像素,水平向右平移了100個像素。

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2
import numpy as np

#讀取圖片
src = cv2.imread('scenery.png')

#圖像平移矩陣
M = np.float32([[1, 0, 100], [0, 1, 50]])

#獲取原始圖像列數(shù)和行數(shù)
rows, cols = src.shape[:2]

#圖像平移
result = cv2.warpAffine(src, M, (cols, rows))?

#顯示圖像
cv2.imshow("original", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果如圖6-3所示:

下面一個案例是將圖像分別向下、向上、向右、向左平移,再調用matplotlib繪圖庫依次繪制的過程。

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2 ?
import numpy as np
import matplotlib.pyplot as plt
?
#讀取圖片
img = cv2.imread('scenery.png')
image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#圖像平移
#垂直方向 向下平移100
M = np.float32([[1, 0, 0], [0, 1, 100]])
img1 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

#垂直方向 向上平移100
M = np.float32([[1, 0, 0], [0, 1, -100]])
img2 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

#水平方向 向右平移100
M = np.float32([[1, 0, 100], [0, 1, 0]])
img3 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

#水平方向 向左平移100
M = np.float32([[1, 0, -100], [0, 1, 0]])
img4 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

#循環(huán)顯示圖形
titles = [ 'Image1', 'Image2', 'Image3', 'Image4'] ?
images = [img1, img2, img3, img4] ?
for i in range(4): ?
? ?plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray') ?
? ?plt.title(titles[i]) ?
? ?plt.xticks([]),plt.yticks([]) ?
plt.show()

輸出結果如圖6-4所示,它從四個方向都進行了平移,并且調用subplot()函數(shù)將四個子圖繪制在一起。

三.圖像縮放

圖像縮放(image scaling)是指對數(shù)字圖像的大小進行調整的過程。在Python中,圖像縮放主要調用resize()函數(shù)實現(xiàn),函數(shù)原型如下:

result = cv2.resize(src, dsize[, result[. fx[, fy[, interpolation]]]])

– src表示原始圖像

– dsize表示圖像縮放的大小

– result表示圖像結果

– fx表示圖像x軸方向縮放大小的倍數(shù)

– fy表示圖像y軸方向縮放大小的倍數(shù)

– interpolation表示變換方法。CV_INTER_NN表示最近鄰插值;CV_INTER_LINEAR表示雙線性插值(缺省使用);

CV_INTER_AREA表示使用像素關系重采樣,當圖像縮小時,該方法可以避免波紋出現(xiàn),當圖像放大時,類似于CV_INTER_NN;

CV_INTER_CUBIC表示立方插值

常見的圖像縮放兩種方式如下所示,第一種方式是將原圖像設置為(160, 160)像素大小,第二種方式是將原始圖像縮小為0.5倍。

  • result = cv2.resize(src, (160,160))
  • result = cv2.resize(src, None, fx=0.5, fy=0.5)

設(x1, y1)是縮放后的坐標,(x0, y0)是縮放前的坐標,sx、sy為縮放因子,則圖像縮放的計算公式(6-3)所示:

下面是Python實現(xiàn)圖像縮放的代碼,它將所讀取的風景圖像進行縮小。

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2 ?
import numpy as np ?
?
#讀取圖片
src = cv2.imread('scenery.png')

#圖像縮放
result = cv2.resize(src, (200,100))
print(result.shape)

#顯示圖像
cv2.imshow("original", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果如圖6-5所示,圖像縮小為(100, 200, 3)像素。注意,代碼中調用函數(shù) cv2.resize(src, (200,100)) 設置新圖像大小dsize的列數(shù)為200,行數(shù)為100。

下面講解另一種圖像縮放變換的方法,通過原始圖像像素乘以縮放系數(shù)進行圖像變換,代碼如下:

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2 ?
import numpy as np ?
?
#讀取圖片
src = cv2.imread('scenery.png')
rows, cols = src.shape[:2]
print(rows, cols)

#圖像縮放 dsize(列,行)
result = cv2.resize(src, (int(cols*0.6), int(rows*1.2)))

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

獲取圖片“scenery.png”的元素像素值,其rows值為384,cols值為512,接著進行寬度縮小0.6倍、高度放大1.2倍的處理,運行前后對比效果如圖6-6所示。

最后講解調用(fx,fy)參數(shù)設置縮放倍數(shù)的方法,對原始圖像進行放大或縮小操作。下面代碼是fx和fy方向縮小至原始圖像0.3倍的操作。

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2 ?
import numpy as np ?
?
#讀取圖片
src = cv2.imread('scenery.png')
rows, cols = src.shape[:2]
print(rows, cols)

#圖像縮放
result = cv2.resize(src, None, fx=0.3, fy=0.3)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出的結果如圖6-7所示,這是按比例0.3×0.3縮小的。

四.圖像旋轉

圖像旋轉是指圖像以某一點為中心旋轉一定的角度,形成一幅新的圖像的過程。圖像旋轉變換會有一個旋轉中心,這個旋轉中心一般為圖像的中心,旋轉之后圖像的大小一般會發(fā)生改變。圖6-8表示原始圖像的坐標(x0, y0)旋轉至(x1, y1)的過程。

旋轉公式如(6-4)所示,其中(m,n)是旋轉中心,a是旋轉的角度,(left,top)是旋轉后圖像的左上角坐標。

圖像旋轉變換主要調用getRotationMatrix2D()函數(shù)和warpAffine()函數(shù)實現(xiàn),繞圖像的中心旋轉,函數(shù)原型如下:

M = cv2.getRotationMatrix2D(center, angle, scale)

– center表示旋轉中心點,通常設置為(cols/2, rows/2)

– angle表示旋轉角度,正值表示逆時針旋轉,坐標原點被定為左上角

– scale表示比例因子

rotated = cv2.warpAffine(src, M, (cols, rows))

– src表示原始圖像

– M表示旋轉參數(shù),即getRotationMatrix2D()函數(shù)定義的結果

– (cols, rows)表示原始圖像的寬度和高度

實現(xiàn)代碼如下所示:

# -*- coding:utf-8 -*-
# By:Eastmount
import cv2 ?
import numpy as np ?
?
#讀取圖片
src = cv2.imread('scenery.png')

#源圖像的高、寬 以及通道數(shù)
rows, cols, channel = src.shape

#繞圖像的中心旋轉
#函數(shù)參數(shù):旋轉中心 旋轉度數(shù) scale
M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)

#函數(shù)參數(shù):原始圖像 旋轉參數(shù) 元素圖像寬高
rotated = cv2.warpAffine(src, M, (cols, rows)) ?

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("rotated", rotated)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

顯示效果如圖6-9所示,繞圖像中心點逆時針旋轉30度。

五.總結

本章主要講解Python和OpenCV的圖像幾何變換,詳細介紹了圖像平移、圖像縮放和圖像旋轉,這些知識點也是我們PC端或手機端圖像處理應用常見的算法,讀者可以嘗試結合這些應用完成一套圖像處理軟件。

以上就是Python圖像處理之幾何變換的詳細內容,更多關于Python圖像幾何變換的資料請關注腳本之家其它相關文章!

相關文章

  • python實現(xiàn)搜索指定目錄下文件及文件內搜索指定關鍵詞的方法

    python實現(xiàn)搜索指定目錄下文件及文件內搜索指定關鍵詞的方法

    這篇文章主要介紹了python實現(xiàn)搜索指定目錄下文件及文件內搜索指定關鍵詞的方法,可實現(xiàn)針對文件夾及文件內關鍵詞的搜索功能,需要的朋友可以參考下
    2015-06-06
  • 使用Python實現(xiàn)操作控制鼠標和鍵盤

    使用Python實現(xiàn)操作控制鼠標和鍵盤

    Python 有很多的庫可以實現(xiàn)各種各樣的功能,比如使用 pynput 操作,下面小編就來和大家詳細介紹一下如何使用pynput進行操作控制鼠標和鍵盤吧
    2024-02-02
  • python判斷列表為空的三種方法總結

    python判斷列表為空的三種方法總結

    這篇文章主要介紹了python判斷列表為空的三種方法總結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python調用騰訊API進行人像動漫化效果實例

    Python調用騰訊API進行人像動漫化效果實例

    最近上網的時候看到了一個有趣的東西,叫做人物動漫化,嘗試著用python實現(xiàn)了,所以下面這篇文章主要給大家介紹了關于Python調用騰訊API進行人像動漫化效果的相關資料,需要的朋友可以參考下
    2023-06-06
  • 基于Python實現(xiàn)加強版煙花

    基于Python實現(xiàn)加強版煙花

    這篇文章主要為大家詳細介紹了如何利用Python制作一個加強版煙花景,文中的示例代碼講解詳細,對我們學習Python有一定幫助,需要的可以參考一下
    2022-02-02
  • 如何更換python默認編輯器的背景色

    如何更換python默認編輯器的背景色

    在本篇內容里小編給大家整理的是一篇關于如何更換python默認編輯器的背景色的相關內容,有興趣的朋友們可以學習參考下。
    2020-08-08
  • python tkinter實現(xiàn)彩球碰撞屏保

    python tkinter實現(xiàn)彩球碰撞屏保

    這篇文章主要為大家詳細介紹了python tkinter實現(xiàn)彩球碰撞屏保,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Python函數(shù)參數(shù)定義及傳遞方式解析

    Python函數(shù)參數(shù)定義及傳遞方式解析

    這篇文章主要介紹了Python函數(shù)參數(shù)定義及傳遞方式解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 深入解析python返回函數(shù)和匿名函數(shù)

    深入解析python返回函數(shù)和匿名函數(shù)

    這篇文章主要介紹了python返回函數(shù)和匿名函數(shù)的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Python經典五人分魚實例講解

    Python經典五人分魚實例講解

    在本篇文章里小編給大家分享的是一篇關于Python 五人分魚的經典小游戲實例內容,有興趣的朋友們可以學習下。
    2021-01-01

最新評論

武强县| 商丘市| 饶平县| 巧家县| 皋兰县| 防城港市| 石阡县| 盱眙县| 加查县| 江阴市| 钦州市| 南部县| 门头沟区| 铜陵市| 昌乐县| 平江县| 海南省| 信阳市| 乐陵市| 通海县| 民和| 望都县| 定州市| 潼关县| 信阳市| 富裕县| 屏东县| 绍兴县| 静宁县| 苍梧县| 拜泉县| 西畴县| 互助| 南陵县| 宜君县| 吉水县| 天水市| 宾阳县| 合作市| 湘西| 奉化市|