機器視覺學習-day09-圖像矯正

1 仿射變換與透視變換

1.1 仿射變換

之前在圖像旋轉實驗中已經接觸過仿射變換,仿射變換是一個二維坐標系到另一個二維坐標系的過程,在仿射變換中符合直線的平直性和平行性。

    1.2 透視變換

    透視變換是把一個圖像投影到一個新的視平面的過程。在現實世界中,觀察到的物體在人類視覺中都會受到透視效果的影響:近大遠小。通俗的講,透視變換的作用是改變物體被觀察的視角

    實際開發中判斷是否是透視變換的方法非常簡單:只要是攝像頭拍攝出的畫面都是符合透視變換。

    1.3?透視變換矩陣

    與仿射變換相同,透視變換也有對應的透視變換矩陣,在這個過程原始圖像src中的點(x,y)通過透視變換被轉換到到dst圖像中的新坐標點(x',y')

    代碼運行步驟:

    圖片輸入→坐標選取→獲取透視變換矩陣→透視變換→插值方法→邊緣填充→圖片輸出

    原始圖片:4.jpg

    import cv2  # 導入OpenCV庫,用于計算機視覺任務
    import numpy as np  # 導入NumPy庫,用于數值計算和數組操作
    import matplotlib.pyplot as pltif __name__ == '__main__':# 1. 圖片輸入path = '4.jpg'  # 定義圖片路徑image_np = cv2.imread(path)  # 讀取圖片,返回NumPy數組格式的圖像數據# 2. 坐標選取# 左上、右上、左下、右下points = [[171, 5], [271, 105], [27, 150], [127, 248]]# 轉換為np數組pts1 = np.float32(points)  # src的四個角點:將點列表轉換為NumPy數組,數據類型為32位浮點數print(pts1)  # 打印點坐標print(type(pts1))  # 打印數據類型# 畫紅框,標記ROI區域image_line = image_np.copy()  # 創建原圖的副本,避免修改原圖# 畫四條線,標記出要校正的區域cv2.line(image_line,  # 在哪個圖像上畫線points[0],  # 起點points[1],  # 終點(0, 0, 255),  # 顏色(B,G,R格式),這里是紅色2,  # 線條粗細cv2.LINE_AA  # 抗鋸齒線型,使線條更平滑)# 重復畫線操作,連接其他點形成四邊形cv2.line(image_line, points[1], points[3], (0, 0, 255), 2, cv2.LINE_AA)cv2.line(image_line, points[2], points[3], (0, 0, 255), 2, cv2.LINE_AA)cv2.line(image_line, points[0], points[2], (0, 0, 255), 2, cv2.LINE_AA)# 3. 獲取透視變換矩陣# 獲得原圖分辨率,這個原圖分辨率是后面定義矯正后的圖片分辨率大小。# img_shape = image_np.shape  # 獲取圖像形狀(高度, 寬度, 通道數)# print("原圖分辨率:", img_shape)img_shape = (260, 170, 3)  # 可自行定義圖像形狀(高度, 寬度, 通道數)# 定義目標點:左上、右上、左下、右下 - 對應整個圖像的四個角points = [[0, 0], [img_shape[1], 0], [0, img_shape[0]], [img_shape[1], img_shape[0]]]print(points)  # 打印目標點坐標# 轉換為np數組pts2 = np.float32(points)  # dst的四個角點:將目標點轉換為NumPy數組# 生成透視變換矩陣M = cv2.getPerspectiveTransform(pts1,  # src的四個角點: 源圖像的四個角點(要校正的區域)pts2   # dst的四個角點: 源圖像的四個角點(要校正的區域))print(M)  # 打印透視變換矩陣# 4. 透視變換 + 5. 插值方法 + 6. 邊緣填充correct_image = cv2.warpPerspective(image_np,  # 原圖M,  # 透視變換矩陣(img_shape[1], img_shape[0]),  # dst分辨率:輸出圖像尺寸(寬度, 高度)cv2.INTER_LINEAR,  # 插值方法:雙線性插值,平衡速度和質量cv2.BORDER_WRAP  # 邊緣填充:邊緣像素環繞)# 使用matplotlib手動去看要截取的x,y的數組參數q = plt.imread(path)plt.imshow(q)plt.axis('off')  # 取消坐標軸顯示plt.show()# 7. 圖片輸出cv2.imshow('image_line', image_line)  # 顯示帶有標記線的圖像cv2.imshow('correct_image', correct_image)  # 顯示校正后的圖像cv2.waitKey(0)  # 等待鍵盤輸入,0表示無限等待cv2.imwrite('jz.png', correct_image)
    

    運行結果:

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/bicheng/95086.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95086.shtml
    英文地址,請注明出處:http://en.pswp.cn/bicheng/95086.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    杰理ac791獲取之前版本sdk

    很慚愧,一個如此簡單的問題卡了這么久,運動戰的本質就是多找線索,多嘗試

    基于軸重轉移補償和多軸協調的粘著控制方法研究

    基于軸重轉移補償和多軸協調的粘著控制方法研究 1. 論文標題 基于軸重轉移補償和多軸協調的粘著控制方法研究 2. 內容概括 該論文針對重載電力機車在復雜軌面條件下易發生空轉的問題,提出了一種新型粘著控制方法。傳統方法僅考慮單軸粘著利用而忽略軸間關系,本文設計了包…

    臺達 PLC 軟件導入 EDS 文件后不能通過 PDO 控制的解決方法

    一、功能及注意事項 1.功能說明:通過修改 EDS 文件處理臺達 PLC 軟件導入 EDS 文件后不能通過 PDO 控制的解決方法 2.注意事項:1).此文檔只針對立邁勝 CANopen 通訊一體化電機; 2).EDS 文件可以用記事本打開; 二、EDS 文件修改 IS…

    Python庫2——Matplotlib2

    上一篇文章主要介紹了Matplotlib庫中的Pyplot模塊中幾大常見圖像的繪制,包括自行修改圖像的屬性,在繪制圖像時會自動創建一個圖形窗口來展現這些圖像。本節內容繼續講講這個(Figure)圖像窗口即其一些常見用法。 其他python庫鏈接…

    AI生成思維導圖和AI生成Excel公式

    AI生成思維導圖和AI生成Excel公式 AI 生成思維導圖和 AI 生成 Excel 公式是一個完全免費的 AI 辦公合集網站。 它完全免費,一個網站支持多個實用 AI 辦公功能,包括:免費 AI Excel 公式生成器、輸入 Excel 公式解釋含義、AI Excel 助手、Exc…

    java中的VO、DAO、BO、PO、DO、DTO

    VO、DAO、BO 等對象在了解這里 po、vo、dao、之前先介紹下 MVC 開發模式M層負責與數據庫打交道;C層負責業務邏輯的編寫;V層負責給用戶展示(針對于前后端不分離的項目,不分離項目那種編寫模版的方式,理解V的概念更直觀&…

    More Effective C++ 條款16:牢記80-20準則(Remember the 80-20 Rule)

    More Effective C 條款16:牢記80-20準則(Remember the 80-20 Rule)核心思想:軟件性能優化遵循帕累托原則(Pareto Principle),即大約80%的性能提升來自于優化20%的關鍵代碼。識別并專注于這些關鍵…

    Java中對泛型的理解

    一、泛型是什么?1. 定義: 泛型允許你在定義類、接口或方法時使用類型參數(Type Parameter)。在使用時(如聲明變量、創建實例時),再用具體的類型實參(Type Argument) 替換…

    Redis開發06:使用stackexchange.redis庫結合WebAPI對redis進行增刪改查

    一、接口寫法namespace WebApplication1.Controllers.Redis {[ApiController][Route("/api/[controller]")]public class RedisService : IRedisService{private readonly IConnectionMultiplexer _redis;//StackExchange.Redis庫自帶接口public RedisService(IConne…

    【前端教程】從零開始學JavaScript交互:7個經典事件處理案例解析

    在網頁開發中,交互性是提升用戶體驗的關鍵。JavaScript作為網頁交互的核心語言,通過事件處理機制讓靜態頁面"動"了起來。本文將通過7個經典案例,從簡單到復雜,逐步講解JavaScript事件處理的實現方法和應用場景。 案例1&…

    內存模型(Memory Model)是什么?

    內存模型(Memory Model)是什么? 內存模型是一個非常深刻且核心的計算機科學概念。 核心摘要 內存模型是一個契約或協議,它精確定義了: 一個線程對共享內存的寫操作,如何以及何時對其他線程可見。 內存操作(讀/寫)可以被重新排序的程度。 它連接了硬件(CPU如何執行指令…

    在 MyBatis 中oracle基本數值類型的 JDBC 類型映射

    基本數值類型的 JDBC 類型Java 類型JDBC 類型 (jdbcType)說明int / IntegerINTEGER標準整數類型long / LongBIGINT大整數類型short / ShortSMALLINT小整數類型float / FloatFLOAT單精度浮點數double / DoubleDOUBLE雙精度浮點數java.math.BigDecimalDECIMAL高精度小數&#xff…

    Spring注解演進與自動裝配原理深度解析:從歷史發展到自定義Starter實踐

    目錄 Spring注解發展史 Spring 1.X Spring 2.X Spring 2.5之前 Required Repository Aspect Spring2.5 之后 Spring 3.x ComponentScan Import 靜態導入 ImportSelector ImportBeanDefinitionRegistrar EnableXXX Spring 4.x Spring 5.x 什么是SPI 自動裝配…

    第三屆機械工程與先進制造智能化技術研討會(MEAMIT2025)

    【重要信息】 大會官網:https://www.yanfajia.com/action/p/BYE27DYDhttps://www.yanfajia.com/action/p/BYE27DYD 會議地點:哈爾濱理工大學 論文檢索:EI Compendex、Scopus 還有部份版面,欲投稿從速,即將提交出版…

    筆記本電腦頻繁出現 vcomp140.dll丟失怎么辦?結合移動設備特性,提供適配性強的修復方案

    對于需要用電腦處理工作的人來說,“vcomp140.dll 丟失” 導致程序頻繁閃退,無疑會嚴重影響工作效率。嘗試重啟電腦、重新安裝軟件后,問題依然存在,這時候該怎么辦?別著急,vcomp140.dll 丟失看似棘手&#x…

    微動開關-電競鼠標核心!5000萬次壽命微動開關評測

    一、主流電競微動開關技術對比?光磁微動技術?采用非接觸式光學觸發原理理論壽命突破5000萬次觸發響應速度0.2ms??傳統機械微動?歐姆龍D2FC-F-7N系列5000萬次標稱壽命機械結構簡單可靠??創新結構微動?雙飛燕漆藍熒光微動特殊涂層提升耐久性手感反饋獨特?二、5000萬次壽…

    Go語言與Docker 開發的核心應用領域

    1. 容器化應用構建與部署??輕量化鏡像構建Go 語言編譯生成靜態二進制文件,結合多階段構建的 Dockerfile,可大幅縮小鏡像體積(例如使用 scratch 或 alpine 基礎鏡像),提升部署效率?。示例 Dockerfile 片段&#xff1…

    【ESP32-IDF】網絡連接開發2:Wi?Fi 智能配網(SmartConfig)

    系列文章目錄 持續更新… 文章目錄系列文章目錄前言一、Wi?Fi 智能配網概述1.SmartConfig 簡介2.SmartConfig 工作原理3.SmartConfig 協議類型二、Wi?Fi 智能配網類型定義及相關API三、Wi?Fi 智能配網示例程序總結前言 在物聯網設備開發過程中,如果將 Wi-Fi 的…

    CVPR深度學習研究指南:特征提取模塊仍是論文創新難點

    關注gongzhonghao【CVPR頂會精選】在深度學習賽道里,別只盯著堆模型卷參數了。最近不少高分工作都在打“可解釋”這張牌,把原本難以理解的黑箱模型用輕量方法剖開,既能增強學術價值,還能拓展落地場景。更妙的是,這類研…

    redis----list詳解

    列表(List)相當于數組或者順序表一、通用命令LPUSH key value1 [value2 ...]在列表 key 的左側(頭部)插入一個或多個值。示例:LPUSH fruits apple banana → 列表變為 [banana, apple]LPUSHX 只有列表已存在時才會執行…