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

使用Python進(jìn)行圖像幾何變換的操作流程

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

算數(shù)操作

圖像的加法

OpenCV加法是飽和操作,Numpy加法是模運(yùn)算。

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í)行圖像加法運(yùn)算的核心函數(shù),與 Python 的普通加法運(yùn)算符 (+) 不同,它使用飽和運(yùn)算防止溢出。
dst = cv2.add(src1, src2[, dst[, mask[, dtype]]])
參數(shù)類(lèi)型描述
src1numpy.ndarray第一個(gè)輸入數(shù)組(圖像)
src2numpy.ndarray 或 標(biāo)量第二個(gè)輸入數(shù)組或標(biāo)量值
dstnumpy.ndarray (可選)輸出數(shù)組(與輸入相同大小和類(lèi)型)
masknumpy.ndarray (可選)8位單通道掩碼,指定要修改的輸出數(shù)組元素
dtypeint (可選)輸出數(shù)組的深度(如 cv2.CV_8U, cv2.CV_32F)

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

import cv2
 
# 讀取兩張相同尺寸的圖像
img1 = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
img2 = cv2.imread("image2.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img1 is None or img2 is None:
    print("錯(cuò)誤:無(wú)法讀取圖像文件")
    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加法 

很明顯直接相加的話(huà)圖像直接失真了。

result = img1 + img2
import cv2
 
# 讀取兩張相同尺寸的圖像
img1 = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
img2 = cv2.imread("image2.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img1 is None or img2 is None:
    print("錯(cuò)誤:無(wú)法讀取圖像文件")
    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ù)之一,用于實(shí)現(xiàn)圖像的加權(quán)混合(也稱(chēng)為alpha混合)。
# dst = src1 × alpha + src2 × beta + gamma
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
參數(shù)類(lèi)型描述默認(rèn)值重要說(shuō)明
src1numpy.ndarray第一個(gè)輸入圖像(矩陣)必填支持多通道圖像(如BGR彩色 圖)
alphafloat第一個(gè)圖像的權(quán)重系數(shù)必填通常范圍0.0-1.0,但可為任意實(shí)數(shù)
src2numpy.ndarray第二個(gè)輸入圖像(矩陣)必填必須與src1尺寸和通道數(shù)相同
betafloat第二個(gè)圖像的權(quán)重系數(shù)必填通常alpha + beta = 1.0
gammafloat添加到加權(quán)和的標(biāo)量值必填用于亮度調(diào)整,通常為0
dstnumpy.ndarray輸出圖像None可選,用于預(yù)分配輸出數(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("錯(cuò)誤:無(wú)法讀取圖像文件")
    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()

幾何變換

圖像縮放

對(duì)圖像進(jìn)行放大或縮小。

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

參數(shù)詳解:

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

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

插值方法對(duì)比

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

 絕對(duì)尺寸

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

相對(duì)尺寸

# 縮小為原圖的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ù)類(lèi)型描述
srcnumpy.ndarray輸入圖像 (單通道或多通道)
Mnumpy.ndarray (2×3)2×3仿射變換矩陣
dsizetuple輸出圖像尺寸 (width, height)

可選參數(shù)

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

 M仿射變換矩陣

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

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

變換類(lèi)型矩陣公式說(shuō)明
平移[[1, 0, tx], [0, 1, ty]]tx, ty 為平移量
旋轉(zhuǎn)cv2.getRotationMatrix2D(center, angle, scale)中心點(diǎn)、角度、縮放
縮放[[sx, 0, 0], [0, sy, 0]]sx, sy 為縮放因子
傾斜[[1, shx, 0], [shy, 1, 0]]shx, shy 為傾斜因子
組合變換M = M1 × M2矩陣乘法組合多個(gè)變換
import cv2
import numpy as np
 
# 讀取兩張相同尺寸的圖像
img = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img is None:
    print("錯(cuò)誤:無(wú)法讀取圖像文件")
    exit()
# x移動(dòng)200px,y移動(dòng)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()進(jìn)行旋轉(zhuǎn)。

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

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

此時(shí)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("錯(cuò)誤:無(wú)法讀取圖像文件")
    exit()
# 旋轉(zhuǎn)中心,旋轉(zhuǎn)角度,縮放因子
M = cv2.getRotationMatrix2D((img.shape[1] / 2, img.shape[0] / 2), 45, 1)  # 旋轉(zhuǎn)矩陣
# 進(jì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()進(jìn)行變換。

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

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

此時(shí)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("錯(cuò)誤:無(wú)法讀取圖像文件")
    exit()
 
# 定義源圖像和目標(biāo)圖像的頂點(diǎn)
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])
# 計(jì)算仿射變換矩陣
M = cv2.getAffineTransform(pts1, pts2)
# 進(jìn)行仿射變換
result = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
 
# 顯示結(jié)果
cv2.imshow("Affine Transformation", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

透射變換

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

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

 此時(shí)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ù)類(lèi)型描述默認(rèn)值
srcnumpy.ndarray輸入圖像 (單通道或多通道)-
Mnumpy.ndarray (3×3)透 視變換矩陣 (單應(yīng)性矩陣)-
dsizetuple輸出圖像尺寸 (width, height)-
dstnumpy.ndarray輸出圖像 (預(yù)分配內(nèi)存)None
flagsint插值方法 + 可選標(biāo)志INTER_LINEAR
borderModeint邊界處理模式BORDER_CONSTANT
borderValuescalar邊界填充值0
import cv2
import numpy as np
 
# 讀取兩張相同尺寸的圖像
img = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img is None:
    print("錯(cuò)誤:無(wú)法讀取圖像文件")
    exit()
# 透 視變換
# 定義源點(diǎn)
pts1=np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
# 定義目標(biāo)點(diǎn)
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ù)類(lèi)型描述默認(rèn)值
srcnumpy.ndarray輸入圖像-
dstnumpy.ndarray輸出圖像 (可選)None
dstsizetuple輸出圖像大小 (width, height)None
borderTypeint邊界填充類(lèi)型cv2.BORDER_DEFAULT
import cv2
import numpy as np
 
# 讀取兩張相同尺寸的圖像
img = cv2.imread("image1.jpg")  # 替換為你的圖片路徑
 
# 檢查圖像是否成功讀取
if img is None:
    print("錯(cuò)誤:無(wú)法讀取圖像文件")
    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ù)學(xué)基礎(chǔ)高斯平滑+下采樣/上采樣插值算法
可逆性不可逆(信息損失)部分可逆(取決于算法)
典型應(yīng)用多尺度特征檢測(cè)、圖像融合顯示適配、預(yù)處理、存儲(chǔ)優(yōu)化
OpenCV函數(shù)pyrUp()pyrDown()resize()

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

相關(guān)文章

最新評(píng)論

策勒县| 旬阳县| 北安市| 乐亭县| 烟台市| 东宁县| 九寨沟县| 呼图壁县| 冀州市| 喀喇| 涿鹿县| 嵊州市| 清远市| 平阳县| 轮台县| 寻乌县| 镇巴县| 大庆市| 九江县| 曲松县| 韩城市| 白朗县| 宁明县| 年辖:市辖区| 福泉市| 遵义市| 荣昌县| 美姑县| 辉县市| 潞城市| 满城县| 民丰县| 吉水县| 大城县| 康定县| 辽源市| 共和县| 阿拉尔市| 桂林市| 汤原县| 保靖县|