達美網(wǎng)站建設(shè)西安網(wǎng)站設(shè)計
【1】引言
前序?qū)W習(xí)過程中,我們偶然發(fā)現(xiàn):如果原始圖像是png格式,將其從BGR轉(zhuǎn)向HSV,再從HSV轉(zhuǎn)回BGR后,圖像的效果要好于JPG格式。
文章鏈接為:
python學(xué)opencv|讀取圖像(十二)BGR圖像轉(zhuǎn)HSV圖像-CSDN博客
但之前“BGR轉(zhuǎn)向HSV,再從HSV轉(zhuǎn)回BGR”的過程分別寫了兩個程序。
在此實踐基礎(chǔ)上,我們嘗試在同一個程序內(nèi)部實現(xiàn)BGR-HSV-BGR的閉環(huán)轉(zhuǎn)換。
【2】代碼編寫
在前述文章的基礎(chǔ)上,我們在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轉(zhuǎn)化hsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV) # BGR和HSV轉(zhuǎn)化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轉(zhuǎn)化bgr_image=cv.cvtColor(hsv_image, cv.COLOR_HSV2BGR) # BGR和HSV轉(zhuǎn)化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模塊;
第二個模塊包括兩部分,第一部分實現(xiàn)BGR向HSV轉(zhuǎn)換,第二部分實現(xiàn)HSV向BGR轉(zhuǎn)換;
第三個模塊釋放所有對象。
【3】代碼測試
運行代碼前,我們準備的原始圖像cv-BGR-000.png為:
圖1 cv-BGR-000.png
運行代碼后,獲得的BGR轉(zhuǎn)HSV圖為cv-BGRTOHSV-001.png。
cv-BGRTOHSV-001.png和原cv-BGR-000.png對比效果為:
圖2 cv-BGR-000.png和cv-BGRTOHSV-001.png對比
顯然,在BGR轉(zhuǎn)向HSV圖像后,HSV圖像似乎染上了很多紅暈。
代碼繼續(xù)運行,獲得的HSV轉(zhuǎn)回的BGR圖為cv-HSVTOBGR-001.png。
cv-HSVTOBGR-001.png和原cv-BGRTOHSV-001.png對比效果為:
圖3 cv-BGRTOHSV-001和cv-HSVTOBGR-001.png對比
此時我們發(fā)現(xiàn):由HSV轉(zhuǎn)回BGR后的圖像,似乎和原圖完全一致。
【4】圖像對比
為實現(xiàn)上述猜想,于是繼續(xù)增添代碼,將BGR-HSV-BGR的圖像和原圖進行對比:
# HSV向BGR轉(zhuǎn)化后和原圖對比 image_bhb = np.hstack((image, bgr_image)) # HSV轉(zhuǎn)回BGR圖像和原圖拼接 cv.imshow('bgrhsvbgrtest', image_bhb) # 顯示為拼接圖 cv.imwrite('cv-BGRTOHSVTOBGR.png', image_bhb) # 保存BGR圖
代碼運行后的效果為:
圖4 cv-BGRTOHSVTOBGR.png
由圖4可見,基于png格式圖像的BGR-HSV-BGR的閉環(huán)轉(zhuǎn)換,圖像幾乎是無損的回到了原來的模樣。
此時我們還會發(fā)現(xiàn),轉(zhuǎn)回的新圖比原圖還大:
圖5 轉(zhuǎn)回的新圖比原圖還大
上述發(fā)現(xiàn)有助于大家在實際工作生活中進行靈活轉(zhuǎn)換圖像。
此時的完整代碼為:
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轉(zhuǎn)化hsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV) # BGR和HSV轉(zhuǎn)化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轉(zhuǎn)化bgr_image=cv.cvtColor(hsv_image, cv.COLOR_HSV2BGR) # BGR和HSV轉(zhuǎn)化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轉(zhuǎn)化后和原圖對比image_bhb = np.hstack((image, bgr_image)) # HSV轉(zhuǎn)回BGR圖像和原圖拼接cv.imshow('bgrhsvbgrtest', image_bhb) # 顯示為拼接圖cv.imwrite('cv-BGRTOHSVTOBGR.png', image_bhb) # 保存BGR圖cv.waitKey() # 圖片顯示時間cv.destroyAllWindows() # 釋放所有窗口
else: # 未找到圖片print("Error: 圖片無法加載")
?【5】總結(jié)
探索了png格式的圖像,進行BGR-HSV-BGR格式比轉(zhuǎn)換后的對比,發(fā)現(xiàn)新圖比原圖質(zhì)量更高。