python學opencv|讀取圖像(十三)BGR圖像和HSV圖像互相轉換深入

【1】引言

前序學習過程中,我們偶然發現:如果原始圖像是png格式,將其從BGR轉向HSV,再從HSV轉回BGR后,圖像的效果要好于JPG格式。

文章鏈接為:

python學opencv|讀取圖像(十二)BGR圖像轉HSV圖像-CSDN博客

但之前“BGR轉向HSV,再從HSV轉回BGR”的過程分別寫了兩個程序。

在此實踐基礎上,我們嘗試在同一個程序內部實現BGR-HSV-BGR的閉環轉換。

【2】代碼編寫

在前述文章的基礎上,我們在pycharm等編輯器輸入下述代碼:

import cv2 as cv  # 引入cv2模塊
import numpy as npimage = cv.imread("cv-BGR-000.png")  # 讀取圖片
if image is not None:  # 成功讀取圖片cv.imshow('cvtest', image)  # 顯示為彩色圖# BGR向HSV轉化hsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV)  # BGR和HSV轉化image_bh = np.hstack((image, hsv_image))  # BGR和HSV圖像拼接cv.imshow('hcvtest', image_bh)  # 顯示為拼接圖cv.imwrite('cv-BGRTOHSV-001.png', hsv_image)  # 保存HSV圖cv.imwrite('cv-BGRTOHSV-002.png', image_bh)  # 保存BGR和HSV圖像拼接# HSV向BGR轉化bgr_image=cv.cvtColor(hsv_image, cv.COLOR_HSV2BGR)  # BGR和HSV轉化image_hb = np.hstack((hsv_image, bgr_image))  # BGR和HSV圖像拼接cv.imshow('bgrtest', image_hb)  # 顯示為拼接圖cv.imwrite('cv-HSVTOBGR-001.png', bgr_image)  # 保存BGR圖cv.imwrite('cv-HSVTOBGR-002.png', image_hb)  # 保存BGR和HSV圖像拼接cv.waitKey()  # 圖片顯示時間cv.destroyAllWindows()  # 釋放所有窗口
else:  # 未找到圖片print("Error: 圖片無法加載")

代碼看起來很長,但實際上可以大致分為三個模塊:

第一個模塊引入cv2和numpy模塊;

第二個模塊包括兩部分,第一部分實現BGR向HSV轉換,第二部分實現HSV向BGR轉換;

第三個模塊釋放所有對象。

【3】代碼測試

運行代碼前,我們準備的原始圖像cv-BGR-000.png為:

圖1 cv-BGR-000.png

運行代碼后,獲得的BGR轉HSV圖為cv-BGRTOHSV-001.png。

cv-BGRTOHSV-001.png和原cv-BGR-000.png對比效果為:

圖2 cv-BGR-000.png和cv-BGRTOHSV-001.png對比

顯然,在BGR轉向HSV圖像后,HSV圖像似乎染上了很多紅暈。

代碼繼續運行,獲得的HSV轉回的BGR圖為cv-HSVTOBGR-001.png。

cv-HSVTOBGR-001.png和原cv-BGRTOHSV-001.png對比效果為:

圖3 cv-BGRTOHSV-001和cv-HSVTOBGR-001.png對比

此時我們發現:由HSV轉回BGR后的圖像,似乎和原圖完全一致。

【4】圖像對比

為實現上述猜想,于是繼續增添代碼,將BGR-HSV-BGR的圖像和原圖進行對比:

# HSV向BGR轉化后和原圖對比
image_bhb = np.hstack((image, bgr_image))  # HSV轉回BGR圖像和原圖拼接
cv.imshow('bgrhsvbgrtest', image_bhb)  # 顯示為拼接圖
cv.imwrite('cv-BGRTOHSVTOBGR.png', image_bhb)  # 保存BGR圖

代碼運行后的效果為:

圖4 cv-BGRTOHSVTOBGR.png

由圖4可見,基于png格式圖像的BGR-HSV-BGR的閉環轉換,圖像幾乎是無損的回到了原來的模樣。

此時我們還會發現,轉回的新圖比原圖還大:

圖5 轉回的新圖比原圖還大

上述發現有助于大家在實際工作生活中進行靈活轉換圖像。

此時的完整代碼為:

import cv2 as cv  # 引入cv2模塊
import numpy as npimage = cv.imread("cv-BGR-000.png")  # 讀取圖片
if image is not None:  # 成功讀取圖片cv.imshow('cvtest', image)  # 顯示為彩色圖# BGR向HSV轉化hsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV)  # BGR和HSV轉化image_bh = np.hstack((image, hsv_image))  # BGR和HSV圖像拼接cv.imshow('hcvtest', image_bh)  # 顯示為拼接圖cv.imwrite('cv-BGRTOHSV-001.png', hsv_image)  # 保存HSV圖cv.imwrite('cv-BGRTOHSV-002.png', image_bh)  # 保存BGR和HSV圖像拼接# HSV向BGR轉化bgr_image=cv.cvtColor(hsv_image, cv.COLOR_HSV2BGR)  # BGR和HSV轉化image_hb = np.hstack((hsv_image, bgr_image))  # BGR和HSV圖像拼接cv.imshow('bgrtest', image_hb)  # 顯示為拼接圖cv.imwrite('cv-HSVTOBGR-001.png', bgr_image)  # 保存BGR圖cv.imwrite('cv-HSVTOBGR-002.png', image_hb)  # 保存BGR和HSV圖像拼接# HSV向BGR轉化后和原圖對比image_bhb = np.hstack((image, bgr_image))  # HSV轉回BGR圖像和原圖拼接cv.imshow('bgrhsvbgrtest', image_bhb)  # 顯示為拼接圖cv.imwrite('cv-BGRTOHSVTOBGR.png', image_bhb)  # 保存BGR圖cv.waitKey()  # 圖片顯示時間cv.destroyAllWindows()  # 釋放所有窗口
else:  # 未找到圖片print("Error: 圖片無法加載")

?【5】總結

探索了png格式的圖像,進行BGR-HSV-BGR格式比轉換后的對比,發現新圖比原圖質量更高。

 

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

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

相關文章

解決node.js的req.body為空的問題

從昨晚一直在試,明明之前用的封裝的axios發送請求給其他的后端(springboot)是可以的,但昨天用了新項目的后端(node.js)就不行。 之前用了代理,所以瀏覽器發送的post請求不會被攔截,…

【嵌入式】嵌入式面試題 36 問

1. volatile 是否可以修飾 const 是的,volatile 可以修飾 const。const 表示變量的值不能被修改,而 volatile 表示變量的值可能在程序之外被修改(例如,由硬件修改)。 將 volatile 用于 const 變量意味著該變量的值雖然…

java基礎概念49-數據結構2

一、樹 1-1、樹的基本概念 1、樹的節點 2、二叉樹 3、樹的高度 1-2、二叉查找樹 普通二叉樹沒有規律,不方便查找,沒什么作用。 1、基本概念 2、添加節點 此時,該方式添加形成的二叉查找樹,根節點就是第一個節點。 3、查找節點 4…

GhatGPT缺陷不足和商業應用

1. 引言 ChatGPT的興起: 2022年末推出,迅速在自然語言處理和人工智能領域引起廣泛關注。數億用戶體驗其強大智能,感嘆機器智能的飛速發展。 存在的缺陷: 事實性錯誤:生成的文本中包含錯誤信息。無法實時更新&#xff1…

【Linux】Macvlan介紹及LInux下例子實現

Macvlan Macvlan 是一種網絡虛擬化技術,允許在同一物理網絡接口上創建多個虛擬網絡接口,每個虛擬接口都有自己獨立的 MAC 地址。這對于需要在同一物理主機上運行多個網絡隔離的應用程序或容器時非常有用。 Macvlan 的特點和用途 獨立的 MAC 地址 每個 …

Jackson @JsonInclude 注解

1. 概述 Jackson 是一個著名的Java庫,以轉換Java對象為JSON格式以及從JSON反序列化回Java對象而聞名。有時候,我們可能希望僅在某些字段滿足特定條件時才將其包含在JSON輸出中,而Jackson的JsonInclude注解正是為此目的量身定制的。 JsonInc…

12.12 枚舉 共用體 數據結構 創建順序表

1.思維導圖 2. 創建順序表 1>頭文件 test.h #ifndef __TEST_H__ #define __TEST_H__#include<stdlib.h> #include<stdio.h> #include<string.h>#define MAX 30 //typedef int datatype;typedef struct sequence {int data[MAX];int len;}seqlist,*se…

next.js 存在緩存中毒漏洞(CVE-2024-46982)

免責聲明: 本文旨在提供有關特定漏洞的深入信息,幫助用戶充分了解潛在的安全風險。發布此信息的目的在于提升網絡安全意識和推動技術進步,未經授權訪問系統、網絡或應用程序,可能會導致法律責任或嚴重后果。因此,作者不對讀者基于本文內容所采取的任何行為承擔責任。讀者在…

如何對小型固定翼無人機進行最優的路徑跟隨控制?

控制架構 文章繼續采用的是 ULTRA-Extra無人機&#xff0c;相關參數如下&#xff1a; 這里用于guidance law的無人機運動學模型為&#xff1a; { x ˙ p V a cos ? γ cos ? χ V w cos ? γ w cos ? χ w y ˙ p V a cos ? γ sin ? χ V w cos ? γ w sin ? χ…

【Flink-scala】DataStream編程模型之延遲數據處理

DataStream API編程模型 1.【Flink-Scala】DataStream編程模型之數據源、數據轉換、數據輸出 2.【Flink-scala】DataStream編程模型之 窗口的劃分-時間概念-窗口計算程序 3.【Flink-scala】DataStream編程模型之水位線 4.【Flink-scala】DataStream編程模型之窗口計算-觸發器-…

react useRef、useContext、useReducer使用中遇到的問題及解決辦法

在 React 中&#xff0c;useRef、useContext 和 useReducer 是三個非常有用的 Hook&#xff0c;它們可以幫助我們更好地管理組件的狀態和行為。然而&#xff0c;在使用這些 Hook 時&#xff0c;可能會遇到一些問題和困惑。本文將詳細解釋這三個 Hook 的工作原理&#xff0c;并提…

2024告別培訓班 數通、安全、云計算、云服務、存儲、軟考等1000G資源分享

大類有&#xff1a;軟考初級 軟考中級 軟考高級 華為認證 華三認證&#xff1a; 軟考初級&#xff1a; 信息處理技術員 程序員 網絡管理員 軟考中級&#xff1a; 信息安全工程師 信息系統監理師 信息系統管理工程師 嵌入式系統設計時 數據庫系統工程師 電子商務設…

《操作系統 - 清華大學》8 -1:進程的組成

文章目錄 1. 進程的組成2. 進程與程序的聯系3. 進程與程序的區別4. 進程與程序關系 1. 進程的組成 進程具體包含哪些東西&#xff1a; 首先要執行相應的代碼&#xff0c;所以執行代碼需要放到內存中代碼執行需要處理數據&#xff0c;數據需要放到內存中需要知道現在要執行哪條…

【Java】String類API

創建字符串 字符串字面量"Hello"高效&#xff0c;常量池復用常見、簡單的字符串創建 new 關鍵字new String("Hello")每次創建新對象&#xff0c;性能開銷較高顯式創建新對象 字符數組new String(char[])轉換字符數組字符數組轉字符串 StringBuilder/St…

數據結構初階---二叉樹---堆

一、樹 1.樹的概念 樹是一種非線性的數據結構&#xff0c;由n(n≥0)個有限結點組成的一個有層次關系的集合。形狀類似一棵倒掛的樹&#xff0c;根朝上&#xff0c;分支向下。 根結點沒有前驅結點&#xff0c;可以有n(n≥0)個后繼結點。 其余結點被分為M個互不相交的集合&am…

CocosCreator對配置文件加密

一、加密 1.首先假設你已經將Excel表格數據導出為了json數據 2.然后可以通關nodejs對其進行xor加密 const fs require(fs);// 讀取配置文件 const path "hero_info.json"; const data fs.readFileSync(path, utf-8); const jsonObject JSON.parse(data);// XO…

學習 Dockerfile 常用指令

學習 Dockerfile 常用指令 在構建 Docker 鏡像時&#xff0c;Dockerfile 文件是一份至關重要的配置文件&#xff0c;它定義了構建鏡像的所有步驟。通過在 Dockerfile 中使用不同的指令&#xff08;命令&#xff09;&#xff0c;我們可以控制鏡像的構建過程、設置環境、指定執行…

D95【python 接口自動化學習】- pytest進階之fixture用法

day95 pytest的fixture詳解&#xff08;二&#xff09; 學習日期&#xff1a;20241210 學習目標&#xff1a;pytest基礎用法 -- pytest的fixture詳解&#xff08;二&#xff09; 學習筆記&#xff1a; fixture(autouseTrue) func的autouse是TRUE時&#xff0c;所有函數方法…

C語言 字符串輸入輸出函數、scanf(“%[^\n]“,)可輸入空格 、fgets刪除換行符

字符串輸入函數&#xff1a; scanf&#xff08;"%s"&#xff0c;數組名&#xff09; gets&#xff08;數組名&#xff09; fgets&#xff08;&#xff09; --- 文件流輸入函數 函數原型&#xff1a; int scanf( const char *format, ...…

深度學習camp-第J4周:ResNet與DenseNet結合探索

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 本周任務&#xff1a; 探索ResNet和DenseNet的結合可能性本周任務較難&#xff0c;我們在chatGPT的幫助下完成 一、網絡的構建 設計一種結合 ResNet 和 Den…