輕松掌握opencv的8種圖像變換

文章目錄

  • opencv的8種圖像變換
    • 1. 圖像放大、縮小
    • 2. 圖像平移
    • 3. 圖像旋轉
    • 4. 圖像仿射變換
    • 5. 圖像裁剪
    • 6. 圖像的位運算(AND, OR, XOR)
    • 7. 圖像的分離和融合
    • 8. 圖像的顏色空間

opencv的8種圖像變換

1. 圖像放大、縮小

我們先看下原圖
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread(‘image/logo.png’)
plt.imshow(img)
在這里插入圖片描述

看下圖像大小
#height,width, channel
height,width,channel = img.shape
在這里插入圖片描述

圖像放大縮小
使用cv2.resize()方法
cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
參數解釋
在這里插入圖片描述

dsize形參是個數組,數組的寬度在前,高度在后(output_width,output_height)
圖像縮放之后,肯定像素要進行重新計算的,就靠這個參數來指定重新計算像素的方式,有以下幾種:
INTER_NEAREST - 最近鄰插值
INTER_LINEAR - 雙線性插值,如果最后一個參數你不指定,默認使用這種方法
INTER_CUBIC - 4x4像素鄰域內的雙立方插值
INTER_LANCZOS4 - 8x8像素鄰域內的Lanczos插值

#圖像放大
resized_img = cv2.resize(img,(width2,height2),interpolation=cv2.INTER_LINEAR)
plt.imshow(resized_img)
在這里插入圖片描述

看下此時圖像大小,確守放大了1倍
在這里插入圖片描述

圖像縮小
#圖像縮小
smaller_img = cv2.resize(img,None,fx=0.5,fy=0.5,interpolation=cv2.INTER_LINEAR)
plt.imshow(smaller_img)
可以看到圖像縮小了一倍
在這里插入圖片描述

2. 圖像平移

warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
src:輸入圖像
M:運算矩陣,2行3列的,數據類型要求是float32位及以上
dsize:運算后矩陣的大小,也就是輸出圖片的尺寸。是個元祖,寬度在前,高度在后
dst:輸出圖像
flags:插值方法的組合,與resize函數中的插值一樣,可以查看cv2.resize
borderMode:像素外推方法,邊界像素的模型( int 類型),詳情參考官網
borderValue:在恒定邊框的情況下使用的borderValue值; 邊界填充的顏色, 默認為 (0, 0, 0) (黑色)

圖像平移
#圖像平移
#先獲取原來的高和寬
height,width = img.shape[:2]
M = np.float32([[1,0,20],[0,1,10]]) #圖像平移。向右平移20個像素,向下平移10個像素
move_img = cv2.warpAffine(img,M,(width,height))
在這里插入圖片描述

我們詳細分析下M這個矩陣
下面的M相當于就是一個運算矩陣。2行3列
在這里插入圖片描述

根據定義,我們的坐標就可以根據A,B來進行運算
在這里插入圖片描述

可以很輕易的得出以下方程
在這里插入圖片描述

通過方程我們就可以很輕易的看出,c1和c2就相當于是讓圖像平移,而a和b這2個參數就是對圖像進行旋轉,縮放等操作。

對圖片進行三維旋轉
#圖像旋轉
#先獲取原來的高和寬
height,width = img.shape[:2]
M = np.float32([[1,0.2,0],[0.2,1,0]]) #圖像平移。向右平移20個像素,向下平移10個像素
scoll_img = cv2.warpAffine(img,M,(width,height))

plt.imshow(scoll_img)
在這里插入圖片描述

3. 圖像旋轉

  1. rot_mat = cv2.getRotationMatrix2D(center, -5, 1)

參數說明:center表示中間點的位置,-5表示順時針旋轉5度,1表示進行等比列的縮放

  1. cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0]))

參數說明: img表示輸入的圖片,rot_mat表示仿射變化矩陣,(image.shape[1], image.shape[0])表示變換后的圖片大小
在這里插入圖片描述

#先獲取原來的高和寬
height,width = img.shape[:2]

#設置旋轉的中心
center = (width //2.0, height//2.0) #旋轉中心

M2 = cv2.getRotationMatrix2D(center,180,1) #1表示旋轉過程中有沒縮放,180表示逆時針旋轉,負數表示順時針旋轉

rotation_img = cv2.warpAffine(img,M2,(width,height))

plt.imshow(rotation_img)

等比例旋轉180
在這里插入圖片描述

4. 圖像仿射變換

對于更復雜仿射變換,OpenCV提供了函數cv2.getAffineTransform()來生成仿射函數cv2.warpAffine()所使用的轉換矩陣M。
該函數的語法格式為:
retval=cv2.getAffineTransform(src, dst)
src代表輸入圖像的三個點坐標。
dst代表輸出圖像的三個點坐標。
參數值src和dst是包含三個一維數組(x, y)點的二維數組。
指代原始圖像和目標圖像內平行四邊形的三個頂點(左上角、右上角、左下角)

上述參數通過函數cv2.getAffineTransform()定義了兩個平行四邊形。
src和dst中的三個點分別對應平行四邊形的左上角、右上角、左下角三個點。
函數cv2.warpAffine()以函數cv2.getAffineTransform()獲取的轉換矩陣M為參數,將src中的點仿射到dst中。
函數cv2.getAffineTransform()對所指定的點完成映射后,將所有其他點的映射關系按照指定點的關系計算確定。

#圖像仿射變換
p1 = np.float32([[120,35],[215,45],[135,120]])
p2 = np.float32([[135,45],[300,110],[130,230]])
M3 = cv2.getAffineTransform(p1,p2) #計算一個變換矩陣
trans_img = cv2.warpAffine(img,M3,(width,height))
plt.imshow(trans_img)
在這里插入圖片描述

5. 圖像裁剪

#圖像剪裁,裁剪像素范圍

crop_img = img[20:100,20:40]
plt.imshow(crop_img)
在這里插入圖片描述

6. 圖像的位運算(AND, OR, XOR)

位運算都是針對多張圖形來計算的
我們先創建兩個圖形
繪制長方形
#長方形
rectangle = np.zeros((300,300),dtype=‘uint8’)
rect_img = cv2.rectangle(rectangle,(25,25),(275,275),255,-1)
cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift )

參數表示依次為: (圖片,長方形框左上角坐標, 長方形框右下角坐標, 字體顏色,字體粗細)

plt.imshow(rect_img)
在這里插入圖片描述

畫布畫圓
circle(img, center, radius, color, thickness=None, lineType=None, shift=None):
含義:圖片,中心店,半徑,顏色,圓輪廓粗細,線類型。

#畫圓
rectangle = np.zeros((300,300),dtype=‘uint8’)
circle_img = cv2.circle(rectangle,(150,150),150,255,-1)
plt.imshow(circle_img)
在這里插入圖片描述

#與運算
and_img = cv2.bitwise_and(rect_img,circle_img)
plt.imshow(and_img)

可見兩張圖重合的部分被畫出
在這里插入圖片描述

#或運算 OR
or_img = cv2.bitwise_or(rect_img,circle_img)
plt.imshow(or_img)
在這里插入圖片描述

#異或運算 XOR
兩張圖片不重疊的部分
xor_img = cv2.bitwise_xor(rect_img,circle_img)
plt.imshow(xor_img)
在這里插入圖片描述

7. 圖像的分離和融合

#圖像的分離
B,G,R = cv2.split(img)

plt.imshow(B)
在這里插入圖片描述

plt.imshow(G)
在這里插入圖片描述

plt.imshow?
在這里插入圖片描述

在使用opencv和matplotlib的過程中會遇到圖像反色或者生成的是偽彩色圖像的問題,
原因是兩個讀取RGB通道的順序是不一樣的,opencv的順序是B-G-R,而matplotlib的順序是R-G-B,所以這個區分就會產生一些矛盾。

圖像合并
matplotlib這樣顯示才是正常顏色
plt.imshow(cv2.merge([R,G,B]))
在這里插入圖片描述

對比下直接用matplotlib和cv2的顯示
在這里插入圖片描述

8. 圖像的顏色空間

#顏色空間
#灰度
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.imshow(gray)
在這里插入圖片描述

#HSV(色度,飽和度,純度)
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
plt.imshow(hsv)
在這里插入圖片描述

#lab
lab = cv2.cvtColor(img,cv2.COLOR_BGR2LAB)
plt.imshow(lab)
在這里插入圖片描述

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

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

相關文章

C++面試:程序的編譯與運行

程序的編譯和運行是軟件開發中的基本環節,尤其是在使用編譯型語言(如C/C、Java等)進行開發時。這個過程涉及將人類可讀的源代碼轉換成機器能夠執行的指令,然后運行這些指令來完成既定的任務。下面是這一過程的詳細介紹&#xff0c…

基于java+springboot+vue實現的美食信息推薦系統(文末源碼+Lw)23-170

1 摘 要 使用舊方法對美食信息推薦系統的信息進行系統化管理已經不再讓人們信賴了,把現在的網絡信息技術運用在美食信息推薦系統的管理上面可以解決許多信息管理上面的難題,比如處理數據時間很長,數據存在錯誤不能及時糾正等問題。這次開發…

Shell好用的工具: cut

目標 使用cut可以切割提取指定列\字符\字節的數據 介紹 cut 譯為“剪切, 切割” , 是一個強大文本處理工具,它可以將文本按列進行劃分的文本處理。cut命令逐行讀入文本,然后按列劃分字段并進行提取、輸出等操作。 語法 cut [options] filename opti…

樹中枝繁葉茂:探索 B+ 樹、B 樹、二叉樹、紅黑樹和跳表的世界

歡迎來到我的博客,代碼的世界里,每一行都是一個故事 樹中枝繁葉茂:探索 B 樹、B 樹、二叉樹、紅黑樹和跳表的世界 前言B樹和B樹B樹(Binary Tree):B樹(B Plus Tree):應用場…

Cobra在ubuntu中設置自動補全

Cobra在ubuntu中設置自動補全 yourprogram指的是你程序&#xff0c;并且必須是使用了Cobra cli bash設置 $ source <(yourprogram completion bash)$ yourprogram completion bash > /etc/bash_completion.d/yourprogramzsh設置 $ echo "autoload -U compinit; …

Linux之用戶和用戶組用戶賬號系統文件

一、簡介 1.用戶的定義 在linux系統中用戶&#xff08;User&#xff09;需要用用戶賬號來訪問系統&#xff0c;服務和信息&#xff0c;系統中的每個進程&#xff08;運行的程序&#xff09;都是使用一個特定的用戶運行。每個文件都屬于一個特定的用戶所有。對文件和目錄的訪…

STM32Cubemx TB6612直流電機驅動

一、TB6612FNG TB6612是一個支持雙電機的驅動模塊&#xff0c;支持PWM調速。PWMA、AIN1、AIN2 為一組控制引腳&#xff0c;PWMA 為 PWM 速度控制引腳&#xff0c;AIN1、AIN2 為方向控制引腳&#xff1b;PWMB、BIN1、BIN2 為一組控制引腳&#xff0c;PWMB 為 PWM 速度控制引腳&…

【力扣hot100】刷題筆記Day11

前言 科研不順啊......又不想搞了&#xff0c;隨便弄弄吧&#xff0c;多花點時間刷題&#xff0c;今天開啟二叉樹&#xff01; 94. 二叉樹的中序遍歷 - 力扣&#xff08;LeetCode&#xff09; 遞歸 # 最簡單遞歸 class Solution:def inorderTraversal(self, root: TreeNode) …

idea運行項目時右下角彈出“Lombok requires enabled annotation processing”

文章目錄 錯誤描述原因分析解決方式參考 錯誤描述 Lombok requires enabled annotation processing&#xff1a;翻譯過來就是Lombok 需要啟用注釋處理 原因分析 idea安裝了Lombok插件&#xff0c;但有些設置未做。 解決方式 參考 idea配置和使用Lombok

全文搜索的工作原理講解

Elasticsearch全文搜索是一種強大的搜索技術&#xff0c;它基于Lucene構建&#xff0c;能夠處理大規模數據集&#xff0c;提供快速、準確的搜索結果。要充分利用Elasticsearch的全文搜索能力&#xff0c;關鍵在于理解和應用其核心組件&#xff1a;分詞&#xff08;Tokenization…

【FPGA】高云FPGA之數字鐘實驗->HC595驅動數碼管

高云FPGA之IP核的使用 1、設計定義2、設計輸入2.1 數碼管譯碼顯示2.2 74HC595驅動2.3 主模塊設計 3、分析和綜合4、功能仿真6.1 hex8模塊仿真6.2 HC595模塊 5、布局布線6、時序仿真7、IO分配以及配置文件&#xff08;bit流文件&#xff09;的生成8、配置&#xff08;燒錄&#…

代碼檢測規范和git提交規范

摘要&#xff1a;之前開發的項目&#xff0c;代碼檢測和提交規范都是已經配置好的&#xff0c;最近自己新建的項目就記錄下相關配置過程。 1. ESlint配置 2013年6月創建開源項目&#xff0c;提供一個插件化的JavaScript代碼檢測工具&#xff0c;創建項目是生成的eslintrc.js文…

【算法分析與設計】

&#x1f4dd;個人主頁&#xff1a;五敷有你 &#x1f525;系列專欄&#xff1a;算法分析與設計 ??穩中求進&#xff0c;曬太陽 題目 編寫一個函數&#xff0c;輸入是一個無符號整數&#xff08;以二進制串的形式&#xff09;&#xff0c;返回其二進制表達式中數字位…

如何使用Express框架構建一個簡單的Web應用

在這個數字化時代&#xff0c;Web應用的需求越來越多樣化和復雜化。在前端開發領域&#xff0c;Express框架作為一個快速、靈活的Node.js Web應用程序框架&#xff0c;擁有強大的功能和豐富的生態系統&#xff0c;深受開發者們的青睞。本篇博客將帶您一步步探索如何使用Express…

AUTOSAR汽車電子嵌入式編程精講300篇-基于深度學習的車載總線網絡入侵檢測

目錄 前言 國內外研究現狀 汽車 CAN 網絡攻擊現狀 2 汽車 CAN 總線介紹及信息安全問題分析</

MR混合現實情景實訓教學系統在高空作業課堂中的應用

高空作業是一項高風險的工作&#xff0c;對于從業者來說&#xff0c;不僅需要具備專業的技能&#xff0c;還需要有豐富的實踐經驗。然而&#xff0c;傳統的課堂教學往往只能通過理論講解和模擬訓練來傳授知識&#xff0c;無法提供真實的實踐環境。而MR混合現實情景實訓教學系統…

Alias許可分析中的數據可視化

Alias許可分析中的數據可視化&#xff1a;引領企業洞察合規之道的明燈 在信息化時代&#xff0c;數據可視化已成為各行各業的重要工具&#xff0c;能夠幫助用戶直觀地理解和分析復雜的數據。在Alias許可分析中&#xff0c;數據可視化同樣發揮著至關重要的作用&#xff0c;為企…

【小程序】應用程序編程接口匯總——授權API、OTA API、家庭API

授權API ty.authorize 權限請求方法 需引入BaseKit&#xff0c;且在>1.2.10版本才可使用 參數 Object object 屬性類型默認值必填說明scopestring是scope 權限名稱 舉例子&#xff1a; scope.bluetooth 藍牙權限 scope.writePhotosAlbum 寫入相冊權限 scope.userLocatio…

知乎高贊回復合集,句句道出生活的真相

1. 怎么定義“想清楚了”&#xff1f; “想清楚了”就是以后出了什么問題&#xff0c;你只能找個沒人的地方抽自己&#xff0c;再也不能抱怨別人了。 2. “別讓孩子輸在起跑線上”有道理嗎&#xff1f; 一輩子都要和別人去比較&#xff0c;是人生悲劇的源頭。 3. 太在乎自己…

鴻蒙OS運行報錯 ‘ToDoListItem({ item })‘ does not meet UI component syntax.

在學習harmonyOS時&#xff0c;原本是好好運行的。但是突然報錯 ToDoListItem({ item }) does not meet UI component syntax. 一臉懵逼&#xff0c;以為是自己語法問題檢查了半天也沒問題。 網上搜索了一下&#xff0c;說把多余的js\map文件刪除就行 才發現我的 鴻蒙的開…