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

使用Python進行圖像幾何變換的操作流程

 更新時間:2025年11月11日 09:53:05   作者:封奚澤優(yōu)  
本文介紹了圖像處理中的基本幾何變換操作,主要包括圖像縮放、平移、旋轉(zhuǎn)等基礎(chǔ)變換,以及仿射變換和透射變換等高級變換方法,同時講解了圖像金字塔的構(gòu)建方法,包括向上采樣(pyrUp)和向下采樣(pyrDown),需要的朋友可以參考下

算數(shù)操作

圖像的加法

OpenCV加法是飽和操作,Numpy加法是模運算。

import cv2
import numpy as np
 
x = np.uint8([250])
y = np.uint8([10])
print(x)  # [[250]]
print(y)  # [[10]]
print(cv2.add(x, y))  # [[255]]
print(x + y)  # [4]

OpenCV加法 

# cv2.add() 是 OpenCV 中用于執(zhí)行圖像加法運算的核心函數(shù),與 Python 的普通加法運算符 (+) 不同,它使用飽和運算防止溢出。
dst = cv2.add(src1, src2[, dst[, mask[, dtype]]])
參數(shù)類型描述
src1numpy.ndarray第一個輸入數(shù)組(圖像)
src2numpy.ndarray 或 標量第二個輸入數(shù)組或標量值
dstnumpy.ndarray (可選)輸出數(shù)組(與輸入相同大小和類型)
masknumpy.ndarray (可選)8位單通道掩碼,指定要修改的輸出數(shù)組元素
dtypeint (可選)輸出數(shù)組的深度(如 cv2.CV_8U, cv2.CV_32F)

中文標題會亂碼,干脆使用英文標題了,鍵盤按下任意鍵退出,只是關(guān)閉窗口程序不會結(jié)束。

import cv2
 
# 讀取兩張相同尺寸的圖像
img1 = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
img2 = cv2.imread("image2.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img1 is None or img2 is None:
    print("錯誤:無法讀取圖像文件")
    exit()
 
# 調(diào)整img2尺寸匹配img1
if img1.shape != img2.shape:
    img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))  # 注意寬高順序
 
# 直接相加
result = cv2.add(img1, img2)
 
# 顯示結(jié)果
cv2.imshow("OpenCV Addition", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

Numpy加法 

很明顯直接相加的話圖像直接失真了。

result = img1 + img2
import cv2
 
# 讀取兩張相同尺寸的圖像
img1 = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
img2 = cv2.imread("image2.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img1 is None or img2 is None:
    print("錯誤:無法讀取圖像文件")
    exit()
 
# 調(diào)整img2尺寸匹配img1
if img1.shape != img2.shape:
    img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))  # 注意寬高順序
 
# 直接相加
result = img1 + img2
 
# 顯示結(jié)果
cv2.imshow("Numpy Addition", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

圖像的混合

# cv2.addWeighted() 是 OpenCV 中最重要和最常用的圖像處理函數(shù)之一,用于實現(xiàn)圖像的加權(quán)混合(也稱為alpha混合)。
# dst = src1 × alpha + src2 × beta + gamma
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
參數(shù)類型描述默認值重要說明
src1numpy.ndarray第一個輸入圖像(矩陣)必填支持多通道圖像(如BGR彩色 圖)
alphafloat第一個圖像的權(quán)重系數(shù)必填通常范圍0.0-1.0,但可為任意實數(shù)
src2numpy.ndarray第二個輸入圖像(矩陣)必填必須與src1尺寸和通道數(shù)相同
betafloat第二個圖像的權(quán)重系數(shù)必填通常alpha + beta = 1.0
gammafloat添加到加權(quán)和的標量值必填用于亮度調(diào)整,通常為0
dstnumpy.ndarray輸出圖像None可選,用于預分配輸出數(shù)組
dtypeint輸出數(shù)組的深度-1可選,如cv2.CV_8U, cv2.CV_32F
import cv2
 
# 讀取兩張相同尺寸的圖像
img1 = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
img2 = cv2.imread("image2.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img1 is None or img2 is None:
    print("錯誤:無法讀取圖像文件")
    exit()
 
# 調(diào)整img2尺寸匹配img1
if img1.shape != img2.shape:
    img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))  # 注意寬高順序
 
# 圖像混合
result = cv2.addWeighted(img1, 0.3, img2, 0.7, 0)
# 顯示結(jié)果
cv2.imshow("Image Mixing", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

幾何變換

圖像縮放

對圖像進行放大或縮小。

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

參數(shù)詳解:

  • src: 輸入圖像 (numpy.ndarray)
  • dsize: 輸出圖像尺寸 (tuple: (width, height))
  • fx: 水平縮放因子 (float)
  • fy: 垂直縮放因子 (float)
  • interpolation: 插值方法 (默認為 cv2.INTER_LINEAR)

重要規(guī)則:必須指定 dsize 或 (fx, fy),但不能同時指定兩者

插值方法對比

插值方法枚舉值時間復雜度質(zhì)量適用場景
最近鄰插值cv2.INTER_NEARESTO(1)像素藝術(shù)、實時處理
雙線性插值cv2.INTER_LINEARO(4)默認選擇,平衡速度質(zhì)量
雙三次插值cv2.INTER_CUBICO(16)高質(zhì)量放大,照片處理
區(qū)域插值cv2.INTER_AREAO(1)中高縮小圖像首選
Lanczos插值cv2.INTER_LANCZOS4O(64)極高專業(yè)級放大,醫(yī)學影像

 絕對尺寸

resized = cv2.resize(img, (400, 300))

相對尺寸

# 縮小為原圖的50%
half_size = cv2.resize(img, None, fx=0.5, fy=0.5)

圖像平移

指定平移矩陣后,調(diào)用cv.warpAffine()平移圖像。

dst = cv2.warpAffine(
    src, 
    M, 
    dsize, 
    dst=None, 
    flags=cv2.INTER_LINEAR, 
    borderMode=cv2.BORDER_CONSTANT, 
    borderValue=0
)

必需參數(shù)

參數(shù)類型描述
srcnumpy.ndarray輸入圖像 (單通道或多通道)
Mnumpy.ndarray (2×3)2×3仿射變換矩陣
dsizetuple輸出圖像尺寸 (width, height)

可選參數(shù)

參數(shù)類型默認值描述
dstnumpy.ndarrayNone輸出圖像數(shù)組 (預分配內(nèi)存)
flagsintcv2.INTER_LINEAR插值方法
borderModeintcv2.BORDER_CONSTANT邊界填充模式
borderValuescalar0邊界填充值 (BORDER_CONSTANT時使用)

 M仿射變換矩陣

M = [ a11  a12  b1 ]
    [ a21  a22  b2 ]

變換類型與矩陣關(guān)系

變換類型矩陣公式說明
平移[[1, 0, tx], [0, 1, ty]]tx, ty 為平移量
旋轉(zhuǎn)cv2.getRotationMatrix2D(center, angle, scale)中心點、角度、縮放
縮放[[sx, 0, 0], [0, sy, 0]]sx, sy 為縮放因子
傾斜[[1, shx, 0], [shy, 1, 0]]shx, shy 為傾斜因子
組合變換M = M1 × M2矩陣乘法組合多個變換
import cv2
import numpy as np
 
# 讀取兩張相同尺寸的圖像
img = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img is None:
    print("錯誤:無法讀取圖像文件")
    exit()
# x移動200px,y移動150px
M = np.float32([[1, 0, 200], [0, 1, 150]])  # 平移矩陣
result = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
 
# 顯示結(jié)果
cv2.imshow("Image Translation", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

圖像旋轉(zhuǎn)

調(diào)用cv.getRotationMatrix2D獲取旋轉(zhuǎn)矩陣,然后調(diào)用cv.warpAffine()進行旋轉(zhuǎn)。

# 生成旋轉(zhuǎn)矩陣
retval = cv2.getRotationMatrix2D(center, angle, scale)
參數(shù)類型描述
centertuple (x, y)旋轉(zhuǎn)中心點坐標
anglefloat旋轉(zhuǎn)角度(度),逆時針為正
scalefloat縮放比例 (1.0 = 保持原大小)

返回值:retval: 2×3 仿射變換矩陣 (numpy.ndarray, dtype=float64)

此時M:[[  0.70710678   0.70710678 -50.33008589]
               [ -0.70710678   0.70710678 418.49242405]]

import cv2
 
# 讀取兩張相同尺寸的圖像
img = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img is None:
    print("錯誤:無法讀取圖像文件")
    exit()
# 旋轉(zhuǎn)中心,旋轉(zhuǎn)角度,縮放因子
M = cv2.getRotationMatrix2D((img.shape[1] / 2, img.shape[0] / 2), 45, 1)  # 旋轉(zhuǎn)矩陣
# 進行旋轉(zhuǎn)
result = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
 
# 顯示結(jié)果
cv2.imshow("Image Rotation", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

仿射變換

調(diào)用getAffineTransform將創(chuàng)建變換矩陣,最后該矩陣傳遞給cv.warpAffine()進行變換。

  • 如果兩條線在變換前平行,變換后仍然平行。
  • 位于同一直線上的點在變換后仍然位于同一直線上。
  • 直線上點的比例關(guān)系在變換后保持不變。如果點C位于A和B之間,且AC:CB = m:n,則變換后這個比例關(guān)系仍然成立。
# 通過三對對應(yīng)點建立源圖像與目標圖像之間的幾何映射關(guān)系
M = cv2.getAffineTransform(src, dst)
參數(shù)類型描述
srcnumpy.ndarray (3×2)源圖像中的三個點坐標 (float32)
dstnumpy.ndarray (3×2)目標圖像中的三個對應(yīng)點坐標 (float32)

 返回值:M: 2×3 仿射變換矩陣 (numpy.ndarray, dtype=float64)

此時M:[[  1.26666667   0.6        -83.33333333]
               [ -0.33333333   1.          66.66666667]]

import cv2
import numpy as np
 
# 讀取兩張相同尺寸的圖像
img = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img is None:
    print("錯誤:無法讀取圖像文件")
    exit()
 
# 定義源圖像和目標圖像的頂點
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])
# 計算仿射變換矩陣
M = cv2.getAffineTransform(pts1, pts2)
# 進行仿射變換
result = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
 
# 顯示結(jié)果
cv2.imshow("Affine Transformation", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

透射變換

通過函數(shù)getPerspectiveTransform()找到變換矩陣,將cv.warpPerspective()進行投射變換。

M = cv2.getPerspectiveTransform(src, dst[, solveMethod])
參數(shù)類型描述
srcnumpy.ndarray (4×2)源圖像中的四個點坐標 (float32)
dstnumpy.ndarray (4×2)目標圖像中的四個對應(yīng)點坐標 (float32)
solveMethodint矩陣求解方法 (默認 DECOMP_LU)

 此時T:[[ 1.05587376e+00  9.18151097e-02 -6.50969128e+01]
               [ 4.69010049e-02  1.12562412e+00 -7.57920240e+01]
               [ 1.83251448e-04  5.13337001e-04  1.00000000e+00]]

dst = cv2.warpPerspective(
    src, 
    M, 
    dsize, 
    dst=None, 
    flags=cv2.INTER_LINEAR, 
    borderMode=cv2.BORDER_CONSTANT, 
    borderValue=0
)
參數(shù)類型描述默認值
srcnumpy.ndarray輸入圖像 (單通道或多通道)-
Mnumpy.ndarray (3×3)透 視變換矩陣 (單應(yīng)性矩陣)-
dsizetuple輸出圖像尺寸 (width, height)-
dstnumpy.ndarray輸出圖像 (預分配內(nèi)存)None
flagsint插值方法 + 可選標志INTER_LINEAR
borderModeint邊界處理模式BORDER_CONSTANT
borderValuescalar邊界填充值0
import cv2
import numpy as np
 
# 讀取兩張相同尺寸的圖像
img = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img is None:
    print("錯誤:無法讀取圖像文件")
    exit()
# 透 視變換
# 定義源點
pts1=np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
# 定義目標點
pts2=np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])
# 獲取透 視變換矩陣
T=cv2.getPerspectiveTransform(pts1, pts2)
 
result = cv2.warpPerspective(img, T, (img.shape[1], img.shape[0]))
 
# 顯示結(jié)果
cv2.imshow("Transmission Transformation", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

圖像金字塔

向上采樣:cv.pyrUp()

向下采樣:cv.pyrDown()

dst = cv2.pyrUp(
    src, 
    dst=None, 
    dstsize=None, 
    borderType=cv2.BORDER_DEFAULT
)
 
dst = cv2.pyrDown(
    src, 
    dst=None, 
    dstsize=None, 
    borderType=cv2.BORDER_DEFAULT
)
參數(shù)類型描述默認值
srcnumpy.ndarray輸入圖像-
dstnumpy.ndarray輸出圖像 (可選)None
dstsizetuple輸出圖像大小 (width, height)None
borderTypeint邊界填充類型cv2.BORDER_DEFAULT
import cv2
import numpy as np
 
# 讀取兩張相同尺寸的圖像
img = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img is None:
    print("錯誤:無法讀取圖像文件")
    exit()
 
up_img = cv2.pyrUp(img)  # 上采樣
down_img = cv2.pyrDown(img)  # 下采樣
 
# 顯示結(jié)果
cv2.imshow("enlarge", up_img)
cv2.imshow("Image Pyramid", img)
cv2.imshow("shrink", down_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

特性圖像金字塔圖像縮放
目的創(chuàng)建多尺度表示用于特征分析改變圖像尺寸以適應(yīng)特定需求
輸出一組不同尺度的圖像序列單一尺寸的圖像
數(shù)學基礎(chǔ)高斯平滑+下采樣/上采樣插值算法
可逆性不可逆(信息損失)部分可逆(取決于算法)
典型應(yīng)用多尺度特征檢測、圖像融合顯示適配、預處理、存儲優(yōu)化
OpenCV函數(shù)pyrUp()pyrDown()resize()

以上就是使用Python進行圖像幾何變換的操作流程的詳細內(nèi)容,更多關(guān)于Python圖像幾何變換的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

无极县| 红河县| 廉江市| 辉县市| 明星| 沛县| 亚东县| 淮安市| 南木林县| 鹿泉市| 阿拉善左旗| 龙川县| 宝鸡市| 米林县| 资阳市| 都江堰市| 德保县| 南丰县| 遂昌县| 山东省| 潜江市| 汤原县| 泾川县| 化州市| 沧源| 衡南县| 昔阳县| 孝昌县| 台南县| 杭州市| 临高县| 额济纳旗| 常宁市| 康马县| 东港市| 南部县| 承德市| 抚州市| 浦北县| 三台县| 定日县|