OpenCV 圖像變換全解析:從鏡像翻轉到仿射變換的實踐指南

前言

????????處理圖像時,翻轉、旋轉、平移等操作很常用。OpenCV 提供了簡單的方法實現這些變換,本文帶你快速學會用它做圖像翻轉和仿射變換。

1 圖像翻轉(圖像鏡像旋轉)

在OpenCV中,圖片的鏡像旋轉是以圖像的中心為原點進行鏡像翻轉的。

  • cv2.flip(img,flipcode)

  • 參數

    • img: 要翻轉的圖像

    • flipcode: 指定翻轉類型的標志

      • flipcode=0: 垂直翻轉,圖片像素點沿x軸翻轉

      • flipcode>0: 水平翻轉,圖片像素點沿y軸翻轉

      • flipcode<0: 水平垂直翻轉,水平翻轉和垂直翻轉的結合

示例:

import cv2 as cv
face = cv.imread('../images/face.png')
cv.imshow('face', face)
# 翻轉 鏡像旋轉 以圖像中心為原點cv.filp(img, filpcode)
# flipcode = 0垂直翻轉 沿x軸 上下翻轉
flip_0 = cv.flip(face, 0)
cv.imshow('flip_0', flip_0)
# flipcode = 1垂直翻轉 沿y軸 左右翻轉
flip_1 = cv.flip(face, 1)
cv.imshow('flip_1', flip_1)
# flipcode = -1垂直+水平翻轉
flip = cv.flip(face, -1)
cv.imshow('flip_-1', flip)
cv.waitKey(0)
cv.destroyAllWindows()

結果如下

2 圖像仿射變換

????????仿射變換(Affine Transformation)是一種線性變換,保持了點之間的相對距離不變。

  • 仿射變換的基本性質

    • 保持直線

    • 保持平行

    • 比例不變性

    • 不保持角度和長度

  • 常見的仿射變換類型

    • 旋轉:繞著某個點或軸旋轉一定角度。

    • 平移:僅改變物體的位置,不改變其形狀和大小。

    • 縮放:改變物體的大小。

    • 剪切:使物體發生傾斜變形。

  • 仿射變換的基本原理

    • 線性變換

    • 二維空間中,圖像點坐標為(x,y),仿射變換的目標是將這些點映射到新的位置 (x', y')。

    • 為了實現這種映射,通常會使用一個矩陣乘法的形式:

      (類似于y=kx+b)

      • a,b,c,d 是線性變換部分的系數,控制旋轉、縮放和剪切。

      • t_x,t_y 是平移部分的系數,控制圖像在平面上的移動。

      • 輸入點的坐標被擴展為齊次坐標形式[x,y,1],以便能夠同時處理線性變換和平移

  • cv2.warpAffine()函數

    • 仿射變換函數

      cv2.warpAffine(img,M,dsize)
      • img:輸入圖像。

      • M:2x3的變換矩陣,類型為np.float32

      • dsize:輸出圖像的尺寸,形式為(width,height)

2.1 圖像旋轉

????????旋轉圖像可以將圖像繞著某個點旋轉一定的角度。

cv2.getRotationMatrix2D()函數

  • 獲取旋轉矩陣

    cv2.getRotationMatrix2D(center,angle,scale)
    • center:旋轉中心點的坐標,格式為(x,y)

    • angle:旋轉角度,單位為度,正值表示逆時針旋轉負值表示順時針旋轉。

    • scale:縮放比例,若設為1,則不縮放。

    • 返回值M,2x3的旋轉矩陣。

示例:

import cv2
import cv2 as cv
# 讀圖
pig = cv.imread('../images/pig.png')
pig = cv.resize(pig, (520,520))
# 獲取旋轉矩陣 cv2.getRotationMatrix2D(center,angle,scale)
M = cv2.getRotationMatrix2D((260, 260), -45, 1)
# 仿射變換函數cv.warpAffine(img,M,(w,h)
dst = cv.warpAffine(pig, M, (pig.shape[1], pig.shape[0]))
cv.imshow('pig', pig)
cv.imshow('pig_new', dst)
cv.waitKey(0)
cv.destroyAllWindows()

2.2 圖像平移

移操作可以將圖像中的每個點沿著某個方向移動一定的距離。

  • 假設我們有一個點 P(x,y),希望將其沿x軸方向平移t_x*個單位,沿y軸方向平移t_y個單位到新的位置P′(x′,y′),那么平移公式如下:

    x′=x+tx

    y′=y+ty

    在矩陣形式下,該變換可以表示為:

????????這里的t_x和t_y分別代表在x軸和y軸上的平移量。

示例:

import cv2
import cv2 as cv
import numpy as np# 讀圖
pig = cv.imread('../images/pig.png')
pig = cv.resize(pig, (520,520))
# 定義偏移量
tx = 80
ty = 120
# 定義平移矩陣
M = np.float32([[1, 0, tx], [0, 1, ty]])
# 仿射變換矩陣,找不到的就用黑色填充
dst = cv.warpAffine(pig, M, (520, 520))
cv.imshow('pig', pig)
cv.imshow('pig_new', dst)
cv.waitKey(0)
cv.destroyAllWindows()

2.3 圖像縮放

縮放操作可以改變圖片的大小。

  • 假設要把圖像的寬高分別縮放為0.5和0.8,那么對應的縮放因子sx=0.5,sy=0.8。

  • 點P(x,y)對應到新的位置P'(x',y'),縮放公式為:

    x′=sx*x

    y′=sy*y

    在矩陣形式下,該變換可以表示為:

    相較于圖像旋轉中只能等比例的縮放,圖像縮放更加靈活,可以在指定方向上進行縮放。

sx和sy分別表示在x軸和y軸方向上的縮放因子。

示例:

import cv2 as cv
import numpy as np# 讀圖
pig = cv.imread('../images/pig.png')
pig = cv.resize(pig, (520,520))
# 定義縮放移量
sx = 0.6
sy = 0.5
# 定義縮放矩陣
M = np.float32([[sx, 0, 0], [0, sy, 0]])
# 仿射變換矩陣,找不到的就用黑色填充
dst = cv.warpAffine(pig, M, (520, 520))
cv.imshow('pig', pig)
cv.imshow('pig_new', dst)
cv.waitKey(0)
cv.destroyAllWindows()

2.4 圖像剪切(了解即可)

剪切操作可以改變圖形的形狀,以便其在某個方向上傾斜,它將對象的形狀改變為斜邊平行四邊形,而不改變其面積

  • 想象我們手上有一張矩形紙片,如果你固定紙片的一邊,并沿著另一邊施加一個平行于該邊的力,這張紙片就會變形為一個平行四邊形。這就是剪切變換的一個直觀解釋。

  • 對于二維空間中的點P(x,y),對他進行剪切變換:

    沿x軸剪切:x'=x+shy*y? ? ? ?y'=y

    沿y軸剪切:x'=x? ? ? ?y'=shx*x+y

  • 當需要同時沿兩個方向進行剪切時,x'=x+shy*y , y'=shx*x+y

  • 在矩陣形式下,該變換可以表示為:

  • 來一個圖理解一下:

?

shy和shx分別對應沿x軸和y軸方向上的剪切因子。

  • 可以理解為,x不變,y偏移

總結:

????????本文講了 OpenCV 的兩種圖像變換。用cv.flip()能輕松實現圖像的垂直、水平翻轉。仿射變換里,通過矩陣設置,結合cv.warpAffine()可完成旋轉、平移、縮放和剪切。這些基礎操作是圖像處理的必備技能,多練就能熟練掌握。

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

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

相關文章

【運維】Linux運維命令記錄

重置root密碼使用命令重新設置一下root賬戶的密碼 passwd root根據提示設置一下密碼&#xff0c;然后使用sudo -i 時輸入密碼就可以切換到root賬戶了ssh登陸以后&#xff0c;要用sudo -i命令給用戶提權&#xff0c;提到超級管理員&#xff0c;然后輸入密碼才有用

PandasAI連接LLM進行智能數據分析

1. 引言 Pandas是一個數據分析開源組件庫&#xff0c;提供了高性能、易用的數據結構和數據分析工具。它的核心的功能是其DataFrame對象&#xff0c;這是一個帶有行和列標簽的二維表格數據結構&#xff0c;支持缺失數據處理、時間序列功能、靈活的數據輸入輸出方法、數據對齊和…

Spring之【Bean的生命周期】

目錄 1、生成BeanDefinition BeanDefinitionRegistry接口 DefaultListableBeanFactory實現類 2、合并BeanDefnition AbstractBeanFactory類 3、BeanFactoryPostProcessor的方法回調 AbstractApplicationContext類 PostProcessorRegistrationDelegate類 4、BeanPostPro…

搜狐新聞直播間適配HarmonyOs實現點贊動畫

01背景介紹隨著新聞客戶端鴻蒙單框架系統適配工作的推進&#xff0c;從原來的基礎功能到現在已經適配全功能的85%以上。與此同時&#xff0c;我們也在持續深入挖掘鴻蒙系統的特性&#xff0c;以提升整體應用的質量與用戶體驗。在這一過程中&#xff0c;動畫作為增強交互與視覺體…

83、設置有人DTU設備USR-M100采集傳感器數據,然后上傳阿里云服務

基本思想:設置M100 采集傳感器數據 一、首先將DTU設備USR-M100連接路由器上,然后使用python代碼搜索同一局域網設備, import platform import sys import os import time import threadinglive_ip = 0def get_os():os = platform.system()if os == "Windows":re…

P1019 [NOIP 2000 提高組] 單詞接龍

題目描述單詞接龍是一個與我們經常玩的成語接龍相類似的游戲&#xff0c;現在我們已知一組單詞&#xff0c;且給定一個開頭的字母&#xff0c;要求出以這個字母開頭的最長的“龍”&#xff08;每個單詞都最多在“龍”中出現兩次&#xff09;&#xff0c;在兩個單詞相連時&#…

詳解力扣高頻SQL50題之1633. 各賽事的用戶注冊率【簡單】

傳送門&#xff1a;1633. 各賽事的用戶注冊率 題目 用戶表&#xff1a; Users -------------------- | Column Name | Type | -------------------- | user_id | int | | user_name | varchar | -------------------- user_id 是該表的主鍵(具有唯一值的列)。 該表中的每行包…

FROM stakater/java8-alpine 構建cocker鏡像

在 Dockerfile 中&#xff0c;FROM stakater/java8-alpine 是第一條也是最核心的指令&#xff0c;它定義了構建新鏡像所基于的「基礎鏡像」。以下是逐層解析&#xff1a;&#x1f50d; 關鍵字拆解 1. FROM —— 起點指令 ? 作用&#xff1a;聲明當前鏡像的起點&#xff08;父鏡…

Word2Vec模型訓練全流程解析:從數據預處理到實體識別應用

請添加圖片描述 訓練Word2Vec模型 概述 問題 我們如何訓練Word2Vec模型&#xff1f;在特定數據集上訓練Word2Vec模型何時是有利的&#xff1f; 目標 理解在自有數據上訓練Word2Vec模型而非使用預訓練模型的優勢 Colab環境配置 運行以下代碼以啟用輔助函數并重新讀取數據…

在Ubuntu上使用QEMU學習RISC-V程序(2)gdb調試

文章目錄一、準備工作二、基本調試流程1. 設置斷點2. 執行程序3. 查看源代碼/匯編三、查看寄存器1. 查看通用寄存器2. 查看特殊寄存器四、查看內存1. 內存查看命令2. 內存修改命令五、調試實戰示例六、高級調試技巧1. 條件斷點2. 自動顯示3. 內存斷點&#xff08;觀察點&#x…

不止于“亮”:一盞智慧路燈的技術進化史——塔能科技用“落地性”定義行業標準

在凌晨3點的園區道路之上&#xff0c;路燈會隨著車輛的靠近而自動亮起&#xff0c;待車輛逐漸遠去之后&#xff0c;又會緩緩地調暗下來&#xff1b;當電纜意外被觸碰的時候&#xff0c;系統能夠在短短3秒之內自動發出報警信息&#xff0c;并且推送出維修工單&#xff1b;而當一…

Redis的String數據類型底層實現

redis就是用c語言寫&#xff0c;但redis的string并沒有直接用c語言的string&#xff0c;而是自己搞了一個 SDS 結構體來表示字符串。SDS 的全稱是 Simple Dynamic String&#xff0c;中文叫做“簡單動態字符串”。想知道為什么這么做&#xff0c;我們先看看c語言的string是什么…

【音視頻學習】四、深入解析視頻技術中的YUV數據存儲方式:從原理到實踐

文章目錄 引言 1. YUV 基礎:為什么它比 RGB 更適合視頻? 1.1 YUV 與 RGB 的核心區別 1.2 YUV色度下采樣簡介 2. YUV 的三大存儲方式 方式一:平面格式(Planar) 方式二:半平面格式(Semi-Planar ) 方式三:打包格式(Packed YUV) 三種存儲方式對比: 3. 如何選擇合適的 Y…

前端項目組成

一、前端項目常見模塊及功能&#xff08;以 Vue/React 通用結構為例&#xff09; 前端項目的模塊本質是「按功能拆分的代碼文件/文件夾」&#xff0c;就像蓋房子的「磚、梁、窗」各司其職&#xff1a;模塊類型功能說明&#xff08;大白話&#xff09;舉個例子pages&#xff08;…

聚觀早報 | 猿編程推動中美青少年AI實踐;華為Pura 80數字版售價公布;iPhone 17 Air電池曝光

聚觀早報每日整理最值得關注的行業重點事件&#xff0c;幫助大家及時了解最新行業動態&#xff0c;每日讀報&#xff0c;就讀聚觀365資訊簡報。整理丨肖羽7月24日消息猿編程推動中美青少年AI實踐華為Pura 80數字版售價公布iPhone 17 Air電池曝光亞馬遜收購AI初創公司Bee蜂巢半固…

unittest 案例執行順序詳解

unittest 案例執行順序詳解在 unittest 框架中&#xff0c;測試用例的執行順序有默認規則&#xff0c;也可通過自定義方式調整。以下是具體說明&#xff1a;一、默認執行順序規則unittest 對測試用例的執行順序遵循 “按測試方法名的 ASCII 碼排序” 原則&#xff0c;具體邏輯如…

【web大前端】001_前端開發入門:創建你的第一個網頁

前端開發入門&#xff1a;創建你的第一個網頁 在當今數字化時代&#xff0c;網頁已經成為人們獲取信息和交流的重要平臺。對于想要學習編程的人來說&#xff0c;前端開發往往是一個不錯的起點。本文將帶你通過簡單的兩步&#xff0c;創建屬于你的第一個網頁程序。 點擊這里去…

HTTP性能優化終極指南:從協議原理到企業級實踐

前言&#xff1a;為什么性能優化是Web開發的生命線&#xff1f;根據Google研究數據&#xff0c;當頁面加載時間從1秒增加到3秒時&#xff0c;跳出率提升32%&#xff1b;當達到5秒時&#xff0c;轉化率下降90%。本文將通過七層優化體系&#xff0c;帶您掌握HTTP性能優化的核心技…

Python 數據分析(二):Matplotlib 繪圖

目錄 1. 簡介2. 繪圖 2.1 折線圖 2.1.1 單線2.1.2 多線2.1.3 子圖 2.2 散點圖2.3 直方圖2.4 條形圖 2.4.1 縱置2.4.2 橫置2.4.3 多條 2.5 餅圖 1. 簡介 Matplotlib 是 Python 提供的一個繪圖庫&#xff0c;通過該庫我們可以很容易的繪制出折線圖、直方圖、散點圖、餅圖等豐…

Scrapy分布式爬蟲數據統計全棧方案:構建企業級監控分析系統

引言&#xff1a;數據統計在分布式爬蟲中的戰略價值在分布式爬蟲系統中&#xff0c;??數據統計與分析??是系統優化的核心驅動力。根據2023年爬蟲工程調查報告&#xff1a;實施專業統計方案的爬蟲系統性能提升??40%以上??數據驅動的優化策略可減少??70%??的資源浪費…