国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《數(shù)字圖像處理-OpenCV/Python》連載(44)圖像的投影變換

這篇具有很好參考價值的文章主要介紹了《數(shù)字圖像處理-OpenCV/Python》連載(44)圖像的投影變換。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

《數(shù)字圖像處理-OpenCV/Python》連載(44)圖像的投影變換


本書京東優(yōu)惠購書鏈接:https://item.jd.com/14098452.html
本書CSDN獨(dú)家連載專欄:https://blog.csdn.net/youcans/category_12418787.html

opencv+python投影變換,《數(shù)字圖像處理-OpenCV》連載,opencv,python,圖像處理,計算機(jī)視覺


第 6 章 圖像的幾何變換


幾何變換分為等距變換、相似變換、仿射變換和投影變換,是指對圖像的位置、大小、形狀和投影進(jìn)行變換,將圖像從原始平面投影到新的視平面。OpenCV圖像的幾何變換,本質(zhì)上是將一個多維數(shù)組通過映射關(guān)系轉(zhuǎn)換為另一個多維數(shù)組。


本章內(nèi)容概要

  • 介紹仿射變換,學(xué)習(xí)使用仿射變換矩陣實(shí)現(xiàn)圖像的仿射變換。
  • 學(xué)習(xí)使用函數(shù)實(shí)現(xiàn)圖像的平移、縮放、旋轉(zhuǎn)、翻轉(zhuǎn)和斜切。
  • 介紹投影變換,學(xué)習(xí)使用投影變換矩陣實(shí)現(xiàn)圖像的投影變換。
  • 介紹圖像的重映射,學(xué)習(xí)使用映射函數(shù)實(shí)現(xiàn)圖像的自定義變換和動態(tài)變換。

6.6 圖像的投影變換

透視變換(Perspective Transformation)是OpenCV中常用的投影變換,是指將圖像投影到一個新的視平面。投影變換的特點(diǎn)是原始圖像中的平行關(guān)系和比例關(guān)系都可以改變,但圖像中的直線在投影變換后仍然能保持直線。
投影變換可以通過對三維空間中的物體旋轉(zhuǎn)進(jìn)行校正,主要用于圖像拼接和校正透視投影導(dǎo)致的圖像失真。
投影變換的方法是在原始圖像上確定不共線的4個點(diǎn),給定這4個點(diǎn)在變換圖像中的位置,就確定了一個投影變換,其變換關(guān)系可以由如下的3×3矩陣來描述。

[ x ~ y ~ z ~ ] = M P [ x y z ] , M P = [ M 11 M 12 M 13 M 21 M 22 M 23 M 31 M 32 M 33 ] \begin{bmatrix} \tilde{x}\\ \tilde{y}\\ \tilde{z} \end{bmatrix} = M_P \begin{bmatrix} x\\ y\\ z \end{bmatrix} ,\hspace{1em} M_P= \begin{bmatrix} M_{11} &M_{12} &M_{13}\\ M_{21} &M_{22} &M_{23}\\ M_{31} &M_{32} &M_{33} \end{bmatrix} ?x~y~?z~? ?=MP? ?xyz? ?,MP?= ?M11?M21?M31??M12?M22?M32??M13?M23?M33?? ?

仿射變換是在二維平面進(jìn)行變換的,而投影變換是在三維坐標(biāo)系進(jìn)行變換的。仿射變換是3點(diǎn)變換,投影變換是4點(diǎn)變換。比較仿射變換與投影變換的描述公式,仿射變換可以被視為z軸不變的透視變換。

在OpenCV中,先由函數(shù)cv.getPerspectiveTransform計算投影變換矩陣 M P M_P MP?,再由函數(shù)cv.warpPerspective根據(jù)投影變換矩陣 M P M_P MP? 計算得到投影變換圖像。

函數(shù)cv.getPerspectiveTransform能根據(jù)圖像中不共線的4個點(diǎn)在變換前后的對應(yīng)位置坐標(biāo),求解得到投影變換矩陣 M P M_P MP?。


函數(shù)原型

cv.getPerspectiveTransform(src, dst[,solveMethod]) → MP

參數(shù)說明

  • src:原始圖像中不共線4個點(diǎn)的坐標(biāo),是形狀為(4,2)的Numpy數(shù)組。
  • dst:投影變換圖像中對應(yīng)的不共線4個點(diǎn)的坐標(biāo),是形狀為(4,2)的Numpy數(shù)組。
  • solveMethod:矩陣分解方法。
    • DECOMP_LU:選擇最佳軸的高斯消元法,默認(rèn)方法。
    • DECOMP_SVD:奇異值分解(SVD)方法。
    • DECOMP_EIG:特征值分解方法,必須與src對稱。
    • DECOMP_CHOLESKY:Cholesky LLT分解方法。
    • DECOMP_QR:正交三角(QR)分解方法。
    • DECOMP_NORMAL:使用正則方程,與前述方法聯(lián)合使用。
  • MP:投影變換矩陣,是形狀為(3,3)、類型為np.float32的Numpy數(shù)組。

注意問題

  • (1)雖然參數(shù)src、dst通常表示輸入、輸出圖像,但在函數(shù)cv.getPerspectiveTransform中是指原始圖像與變換圖像中不共線的4個點(diǎn),也被稱為四邊形的頂點(diǎn)。
  • (2) 參數(shù)src、dst是形狀為(4,2)的Numpy數(shù)組,數(shù)值是圖像中4個頂點(diǎn)的坐標(biāo)(x,y)。

函數(shù)cv.warpPerspective可通過投影變換矩陣計算投影變換圖像。

函數(shù)原型

cv.warpPerspective (src, M, dsize[, dst, flags, borderMode, borderValue]) → dst

由投影變換矩陣M計算投影變換圖像的公式為

參數(shù)說明

  • src:原始圖像,是Numpy數(shù)組。
  • dst:投影變換輸出圖像,類型與src相同,圖像尺寸由參數(shù)dsize確定。
  • M:投影變換矩陣,是形狀為(3,3)、類型為np.float32的Numpy數(shù)組。
  • dsize:輸出圖像大小,格式為元組(w,h)。
  • flags:插值方法與逆變換標(biāo)志,可選項(xiàng)。
    • INTER_LINEAR:雙線性插值,默認(rèn)方法。
    • INTER_NEAREST:最近鄰插值。
    • WARP_INVERSE_MAP:逆變換標(biāo)志。
  • borderMode:邊界擴(kuò)充方法,可選項(xiàng),默認(rèn)為cv.BORDER_CONSTANT。
  • borderValue:邊界填充值,可選項(xiàng),默認(rèn)值為0,表示黑色填充。

注意問題

  • (1) 輸出圖像大小dsize的格式為(w,h),與OpenCV中圖像形狀(h,w)的順序相反。
  • (2) 通過函數(shù)cv.warpPerspective計算投影變換,投影變換矩陣M的形狀為(3,3),數(shù)據(jù)類型必須是np.float32。
  • (3) 當(dāng)flags設(shè)為WARP_INVERSE_MAP時,先由投影變換矩陣計算逆投影變換矩陣,再計算輸入圖像的逆投影變換圖像。

【例程0606】基于投影變換實(shí)現(xiàn)圖像校正

手機(jī)或相機(jī)拍攝的照片,通常都存在投影變形。本例程通過投影變換實(shí)現(xiàn)圖像校正。

先用鼠標(biāo)在圖像中依次選取矩形的4個頂點(diǎn),獲取4個頂點(diǎn)的坐標(biāo),再根據(jù)長寬比計算4個頂點(diǎn)在投影變換后的坐標(biāo),進(jìn)行投影變換,就可以實(shí)現(xiàn)圖像校正。


# 【0606】基于投影變換實(shí)現(xiàn)圖像校正
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

def onMouseAction(event, x, y, flags, param):  # 鼠標(biāo)交互 (單擊選點(diǎn),右擊完成)
    setpoint = (x, y)
    if event == cv.EVENT_LBUTTONDOWN:  # 單擊
        pts.append(setpoint)  # 選中一個多邊形頂點(diǎn)
        print("選擇頂點(diǎn) {}:{}".format(len(pts), setpoint))

if __name__ == '__main__':
    img = cv.imread("../images/Fig0602.png")  # 讀取彩色圖像(BGR)
    imgCopy = img.copy()
    height, width = img.shape[:2]

    # 鼠標(biāo)交互從輸入圖像選擇 4 個頂點(diǎn)
    print("單擊左鍵選擇 4 個頂點(diǎn) (左上-左下-右下-右上):")
    pts = []  # 初始化 ROI 頂點(diǎn)坐標(biāo)集合
    status = True  # 進(jìn)入繪圖狀態(tài)
    cv.namedWindow('origin')  # 創(chuàng)建圖像顯示窗口
    cv.setMouseCallback('origin', onMouseAction, status)  # 綁定回調(diào)函數(shù)
    while True:
        if len(pts) > 0:
            cv.circle(imgCopy, pts[-1], 5, (0,0,255), -1)  # 繪制最近的一個頂點(diǎn)
        if len(pts) > 1:
            cv.line(imgCopy, pts[-1], pts[-2], (255, 0, 0), 2)  # 繪制最近的一段線段
        if len(pts) == 4:  # 已有 4個頂點(diǎn),結(jié)束繪制
            cv.line(imgCopy, pts[0], pts[-1], (255,0,0), 2)  # 繪制最后的一段線段
            cv.imshow('origin', imgCopy)
            cv.waitKey(1000)
            break
        cv.imshow('origin', imgCopy)
        cv.waitKey(100)
    cv.destroyAllWindows()  # 釋放圖像窗口
    ptsSrc = np.array(pts)  # 列表轉(zhuǎn)換為 (4,2),Numpy 數(shù)組
    print(ptsSrc)

    # 計算投影變換矩陣 MP
    ptsSrc = np.float32(pts)  # 列表轉(zhuǎn)換為Numpy數(shù)組,圖像4個頂點(diǎn)坐標(biāo)為 (x,y)
    x1, y1, x2, y2 = int(0.1*width), int(0.1*height), int(0.9*width), int(0.9*height)
    ptsDst = np.float32([[x1,y1], [x1,y2], [x2,y2], [x2,y1]])  # 投影變換后的 4 個頂點(diǎn)坐標(biāo)
    MP = cv.getPerspectiveTransform(ptsSrc, ptsDst)

    # 投影變換
    dsize = (450, 400)  # 輸出圖像尺寸為 (w, h)
    perspect = cv.warpPerspective(img, MP, dsize, borderValue=(255,255,255))  # 投影變換
    print(img.shape, ptsSrc.shape, ptsDst.shape)

    plt.figure(figsize=(9, 3.4))
    plt.subplot(131), plt.axis('off'), plt.title("1.Original")
    plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.subplot(132), plt.axis('off'), plt.title("2.Selected vertex")
    plt.imshow(cv.cvtColor(imgCopy, cv.COLOR_BGR2RGB))
    plt.subplot(133), plt.axis('off'), plt.title("3.Perspective correction")
    plt.imshow(cv.cvtColor(perspect, cv.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()

程序說明:
(1) 本例程設(shè)置了回調(diào)函數(shù),通過鼠標(biāo)交互從輸入圖像選擇了4個頂點(diǎn)。鼠標(biāo)交互操作的使用方法詳見4.9節(jié)。
(2) 投影變換后4個頂點(diǎn)的坐標(biāo)是用戶設(shè)定的,可以根據(jù)需要修改。
(3) 基于投影變換實(shí)現(xiàn)圖像校正的運(yùn)行結(jié)果如圖6-6所示,圖6-6(1)所示為原始圖像,圖6-6(2)所示為用鼠標(biāo)在原始圖像上選定棋盤的4個頂點(diǎn),圖6-6(3)所示為投影變換后的圖像。可以看出,原始圖像中透視拍照的傾斜棋盤被校正為矩形。


opencv+python投影變換,《數(shù)字圖像處理-OpenCV》連載,opencv,python,圖像處理,計算機(jī)視覺

*圖6-6 圖像的投影變換


版權(quán)聲明:
youcans@xupt 原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接:(https://blog.csdn.net/youcans/article/details/134487182)
Copyright 2023 youcans, XUPT
Crated:2023-11-20

歡迎關(guān)注本書CSDN獨(dú)家連載專欄
《數(shù)字圖像處理-OpenCV/Python》連載: https://blog.csdn.net/youcans/category_12418787.html文章來源地址http://www.zghlxwxcb.cn/news/detail-766435.html

到了這里,關(guān)于《數(shù)字圖像處理-OpenCV/Python》連載(44)圖像的投影變換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 《數(shù)字圖像處理-OpenCV/Python》連載(4)圖像的讀取與保存

    《數(shù)字圖像處理-OpenCV/Python》連載(4)圖像的讀取與保存

    本書京東優(yōu)惠購書鏈接:https://item.jd.com/14098452.html 本書CSDN獨(dú)家連載專欄:https://blog.csdn.net/youcans/category_12418787.html 為了方便初學(xué)者從零開始學(xué)習(xí)OpenCV-Python,本書從圖像的讀取、保存和顯示等基本操作開始介紹,使讀者可以循序漸進(jìn)地使用和理解本書的每一個例程。 本章內(nèi)容

    2024年02月09日
    瀏覽(93)
  • 《數(shù)字圖像處理-OpenCV/Python》連載(10)圖像屬性與數(shù)據(jù)類型

    《數(shù)字圖像處理-OpenCV/Python》連載(10)圖像屬性與數(shù)據(jù)類型

    本書京東優(yōu)惠購書鏈接:https://item.jd.com/14098452.html 本書CSDN獨(dú)家連載專欄:https://blog.csdn.net/youcans/category_12418787.html 在Python語言中,OpenCV以Numpy數(shù)組存儲圖像,對圖像的訪問和處理都是通過Numpy數(shù)組的操作來實(shí)現(xiàn)的。 本章內(nèi)容概要 介紹Python語言中OpenCV的數(shù)據(jù)結(jié)構(gòu),學(xué)習(xí)獲取圖像

    2024年02月07日
    瀏覽(221)
  • 《數(shù)字圖像處理-OpenCV/Python》連載(22)繪制直線與線段

    《數(shù)字圖像處理-OpenCV/Python》連載(22)繪制直線與線段

    本書京東優(yōu)惠購書鏈接:https://item.jd.com/14098452.html 本書CSDN獨(dú)家連載專欄:https://blog.csdn.net/youcans/category_12418787.html 本章介紹OpenCV的繪圖功能和簡單的鼠標(biāo)交互處理方法。與Excel或Matplotlib中的可視化數(shù)據(jù)圖不同,OpenCV中的繪圖功能主要用于在圖像的指定位置繪制幾何圖形。 本

    2024年02月02日
    瀏覽(120)
  • 《數(shù)字圖像處理-OpenCV/Python》連載(26)繪制橢圓和橢圓弧

    《數(shù)字圖像處理-OpenCV/Python》連載(26)繪制橢圓和橢圓弧

    本書京東優(yōu)惠購書鏈接:https://item.jd.com/14098452.html 本書CSDN獨(dú)家連載專欄:https://blog.csdn.net/youcans/category_12418787.html 本章介紹OpenCV的繪圖功能和簡單的鼠標(biāo)交互處理方法。與Excel或Matplotlib中的可視化數(shù)據(jù)圖不同,OpenCV中的繪圖功能主要用于在圖像的指定位置繪制幾何圖形。 本

    2024年02月06日
    瀏覽(121)
  • 《數(shù)字圖像處理-OpenCV/Python》連載:空間濾波之高斯濾波器

    《數(shù)字圖像處理-OpenCV/Python》連載:空間濾波之高斯濾波器

    本書京東 優(yōu)惠購書鏈接 https://item.jd.com/14098452.html 本書CSDN 獨(dú)家連載專欄 https://blog.csdn.net/youcans/category_12418787.html 圖像濾波是指在盡可能保留圖像細(xì)節(jié)特征的條件下對目標(biāo)圖像的噪聲進(jìn)行抑制,是常用的圖像處理方法。 空間濾波也稱空間域?yàn)V波,濾波器規(guī)定了鄰域形狀與鄰域

    2024年02月02日
    瀏覽(98)
  • 【Python_Opencv圖像處理框架】信用卡數(shù)字識別項(xiàng)目

    【Python_Opencv圖像處理框架】信用卡數(shù)字識別項(xiàng)目

    本篇文章是opencv學(xué)習(xí)的第六篇文章,前面主要講解了對圖像的一些基本操作,這篇文章我們就開始大展身手,將前面所學(xué)的基礎(chǔ)操作活學(xué)活用。既能復(fù)習(xí)基礎(chǔ)操作,又能學(xué)到一些新的知識。作為初學(xué)者,我盡己所能,但仍會存在疏漏的地方,希望各位看官不吝指正?? 我們通

    2024年02月03日
    瀏覽(90)
  • 數(shù)字圖像處理二維碼識別python+opencv實(shí)現(xiàn)二維碼實(shí)時識別

    數(shù)字圖像處理二維碼識別python+opencv實(shí)現(xiàn)二維碼實(shí)時識別

    數(shù)字圖像處理二維碼識別 python+opencv實(shí)現(xiàn)二維碼實(shí)時識別 特點(diǎn): (1)可以實(shí)現(xiàn)普通二維碼,條形碼; (2)解決了opencv輸出中文亂碼的問題 (3)增加網(wǎng)頁自動跳轉(zhuǎn)功能 (4)實(shí)現(xiàn)二維碼實(shí)時檢測和識別 代碼保證原創(chuàng)、無錯誤、能正常運(yùn)行(如果電腦環(huán)境配置沒問題) 送二維

    2024年01月16日
    瀏覽(102)
  • 數(shù)字圖像處理(實(shí)踐篇)二十七 Python-OpenCV 滑動條的使用

    數(shù)字圖像處理(實(shí)踐篇)二十七 Python-OpenCV 滑動條的使用

    目錄 1 涉及的函數(shù) 2 實(shí)踐 1 涉及的函數(shù) ⒈?setWindowProperty()用于設(shè)置GUI應(yīng)用程序的屬性 參數(shù) : ①?

    2024年01月25日
    瀏覽(97)
  • 數(shù)字圖像處理(實(shí)踐篇)二十九 OpenCV-Python在圖像中檢測矩形、正方形和三角形的實(shí)踐

    數(shù)字圖像處理(實(shí)踐篇)二十九 OpenCV-Python在圖像中檢測矩形、正方形和三角形的實(shí)踐

    目錄 1 方案 2 實(shí)踐 1 方案 ①檢測矩形和正方形 ⒈檢測圖像中的所有輪廓。 ⒉循環(huán)檢查所有檢測到的輪廓。 ⒊為每個輪廓找到近似的輪廓。如果近似輪廓中的頂點(diǎn)數(shù)為4,則計算 寬高比 用來區(qū)分 矩形 和 正方形 。如果寬高比在0.9到1.1之間,則認(rèn)為為正方形,否則的話,則為

    2024年01月25日
    瀏覽(99)
  • OpenCV數(shù)字圖像處理基于C++:圖像分割

    OpenCV數(shù)字圖像處理基于C++:圖像分割

    圖像閾值化分割是一種常用的、傳統(tǒng)的圖像分割技術(shù),因其 實(shí)現(xiàn)簡單、計算量小、性能比較穩(wěn)定 而成為圖像分割中基本和應(yīng)用廣泛的分割技術(shù)。特別 適合于目標(biāo)和背景占據(jù)不同灰度級范圍的圖像 。不僅 可以極大地壓縮數(shù)據(jù)量 ,而且大大 簡化了分析和處理的步驟 ,是進(jìn)行

    2024年02月11日
    瀏覽(95)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包