日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python图像几何变换_Python 图像处理 OpenCV (5):图像的几何变换

發布時間:2024/8/23 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python图像几何变换_Python 图像处理 OpenCV (5):图像的几何变换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前文傳送門:

圖像縮放

圖像縮放只是調整圖像的大小,為此, OpenCV 為我們提供了一個函數 cv.resize() ,原函數如下:

resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

src 表示的是輸入圖像,而 dsize 代表的是輸出圖像的大小,如果為 0 ,則:

\[\texttt{dsize = Size(round(fx*src.cols), round(fy*src.rows))}

\]

dsize 和 fx 、 fy 不能同時為 0 。

fx 、 fy 是沿 x 軸和 y 軸的縮放系數,默認取 0 時,算法如下:

\[\texttt{fx=(double)dsize.width/src.cols}

\]

\[\texttt{fy=(double)dsize.height/src.rows}

\]

最后一個參數 interpolation 表示插值方式:

INTER_NEAREST - 最近鄰插值

INTER_LINEAR - 線性插值(默認)

INTER_AREA - 區域插值

INTER_CUBIC - 三次樣條插值

INTER_LANCZOS4 - Lanczos插值

看一個簡單的示例:

import cv2 as cv

#讀取圖片

src = cv.imread('maliao.jpg')

print(src.shape)

#圖像縮放

result = cv.resize(src, (300, 150))

print(result.shape)

#顯示圖像

cv.imshow("src", src)

cv.imshow("result", result)

#等待顯示

cv.waitKey()

cv.destroyAllWindows()

結果如下:

需要注意的是,這里的 (300, 150) 設置的是 dsize 的列數為 300 ,行數為 150 。

同理,我們可以通過設定一個比例進行縮放,可以是等比例縮放,也可以是不等比例縮放,下面是等比例縮放的示例:

import cv2 as cv

# 設定比例

scale = 0.5

#讀取圖片

src = cv.imread('maliao.jpg')

rows, cols = src.shape[:2]

#圖像縮放

result = cv.resize(src, ((int(cols * scale), int(rows * scale))))

print(result.shape)

#顯示圖像

cv.imshow("src", src)

cv.imshow("result", result)

#等待顯示

cv.waitKey()

cv.destroyAllWindows()

結果如下:

除了可通過設定 dszie 對圖像進行縮放,我們還可以通過設定 fx 和 fy 對圖像進行縮放:

import cv2 as cv

#讀取圖片

src = cv.imread('maliao.jpg')

print(src.shape)

#圖像縮放

result = cv.resize(src, None, fx=0.5, fy=0.5)

print(result.shape)

#顯示圖像

cv.imshow("src", src)

cv.imshow("result", result)

#等待顯示

cv.waitKey()

cv.destroyAllWindows()

結果如下:

圖像平移

圖像平移是通過仿射函數 warpAffine() 來實現的,原函數如下:

warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)

在圖像平移中我們會用到前三個參數:

需要變換的原始圖像

移動矩陣M

變換的圖像大小(如果這個大小不和原始圖像大小相同,那么函數會自動通過插值來調整像素間的關系)。

圖像的平移是沿著 x 方向移動 tx 距離, y 方向移動 ty 距離,那么需要構造移動矩陣:

\[M = [\begin{matrix} 1 & 0 & tx \\ 0 & 1 & ty \end{matrix}]

\]

我們通過 Numpy 來產生這個矩陣(必須是float類型的),并將其賦值給仿射函數 warpAffine() ,下面來看個示例:

import cv2 as cv

import numpy as np

#讀取圖片

src = cv.imread('maliao.jpg')

rows, cols = src.shape[:2]

# 定義移動距離

tx = 50

ty = 100

# 生成 M 矩陣

affine = np.float32([[1, 0, tx], [0, 1, ty]])

dst = cv.warpAffine(src, affine, (cols, rows))

# 顯示圖像

cv.imshow('src', src)

cv.imshow("dst", dst)

# 等待顯示

cv.waitKey(0)

cv.destroyAllWindows()

結果如下:

注意: warpAffine 函數的第三個參數是輸出圖像的大小,我這里設置的大小是原圖片的大小,所以結果會有部分遮擋。

圖像旋轉

圖像旋轉主要調用 getRotationMatrix2D() 函數和 warpAffine() 函數實現,繞圖像的某一個中心點旋轉,具體如下:

M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)

參數分別為:旋轉中心、旋轉度數、scale

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

參數分別為:原始圖像、旋轉參數、原始圖像寬高

圖像旋轉:設( x0 , y0 )是旋轉后的坐標,( x , y )是旋轉前的坐標,( m , n )是旋轉中心, a 是旋轉的角度(順時針),( left , top )是旋轉后圖像的左上角坐標,則公式如下:

\[\begin{bmatrix}x0 & y0 & 1\end{bmatrix} = \begin{bmatrix}x & y & 1\end{bmatrix} \begin{bmatrix}1 & 0 & 0 \\ 0 & -1 & 0 \\ -m & n & 1\end{bmatrix} \begin{bmatrix}\cos a & -\sin a & 0 \\ \sin a & \cos a & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ left & top & 1 \end{bmatrix}

\]

示例如下:

import cv2 as cv

#讀取圖片

src = cv.imread('maliao.jpg')

# 原圖的高、寬

rows, cols = src.shape[:2]

# 繞圖像的中心旋轉

# 參數:旋轉中心 旋轉度數 scale

M = cv.getRotationMatrix2D((cols/2, rows/2), 90, 1)

#

dst = cv.warpAffine(src, M, (cols, rows))

# 顯示圖像

cv.imshow("src", src)

cv.imshow("dst", dst)

# 等待顯示

cv.waitKey()

cv.destroyAllWindows()

結果如下:

圖像翻轉

第一個圖像翻轉,這個可是制作表情包的利器。

圖像翻轉在 OpenCV 中調用函數 flip() 實現,原函數如下:

flip(src, flipCode, dst=None)

src:原始圖像。

flipCode:翻轉方向,如果 flipCode 為 0 ,則以 X 軸為對稱軸翻轉,如果 fliipCode > 0 則以 Y 軸為對稱軸翻轉,如果 flipCode < 0 則在 X 軸、 Y 軸方向同時翻轉。

示例如下:

import cv2 as cv

import matplotlib.pyplot as plt

# 讀取圖片 由 GBR 轉 RGB

img = cv.imread('maliao.jpg')

src = cv.cvtColor(img, cv.COLOR_BGR2RGB)

# 圖像翻轉

# flipCode 為 0 ,則以 X 軸為對稱軸翻轉,如果 fliipCode > 0 則以 Y 軸為對稱軸翻轉,如果 flipCode < 0 則在 X 軸、 Y 軸方向同時翻轉。

img1 = cv.flip(src, 0)

img2 = cv.flip(src, 1)

img3 = cv.flip(src, -1)

# plt 顯示圖形

titles = ['Source', 'Ima1', 'Ima2', 'Ima3']

images = [src, img1, img2, img3]

for i in range(4):

plt.subplot(2, 2, i + 1)

plt.imshow(images[i])

plt.title(titles[i])

plt.xticks([])

plt.yticks([])

plt.show()

結果如下:

示例代碼

如果有需要獲取源碼的同學可以在公眾號回復「OpenCV」進行獲取。

參考

總結

以上是生活随笔為你收集整理的python图像几何变换_Python 图像处理 OpenCV (5):图像的几何变换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。