《數(shù)字圖像處理-OpenCV/Python》連載(4)圖像的讀取與保存
本書京東優(yōu)惠購(gòu)書鏈接:https://item.jd.com/14098452.html
本書CSDN獨(dú)家連載專欄:https://blog.csdn.net/youcans/category_12418787.html
第1章 圖像的基本操作
為了方便初學(xué)者從零開始學(xué)習(xí)OpenCV-Python,本書從圖像的讀取、保存和顯示等基本操作開始介紹,使讀者可以循序漸進(jìn)地使用和理解本書的每一個(gè)例程。
本章內(nèi)容概要
◎ 圖像、視頻文件和多幀圖像(動(dòng)圖)的讀取與保存。
◎ 從網(wǎng)絡(luò)地址讀取圖像和含中文路徑圖像的讀取方法。
◎ 圖像的顯示方法,包括使用Matplotlib顯示圖像。
◎ 使用攝像頭拍攝視頻及圖像的方法。
1.1 圖像的讀取與保存
1.1.1 圖像的讀取
函數(shù)cv.imread用于從指定文件加載圖像并返回該圖像的矩陣。
函數(shù)原型
cv.imread(filename[, flags=IMREAD_COLOR]) → retval
參數(shù)說(shuō)明
- filename:讀取圖像的文件路徑和文件名,包括文件擴(kuò)展名。
- flags:讀取方式的參數(shù),可選項(xiàng)如下。
- IMREAD_COLOR:始終將圖像轉(zhuǎn)換為三通道BGR格式的彩色圖像,是默認(rèn)方式。
- IMREAD_GRAYSCALE:始終將圖像轉(zhuǎn)換為單通道灰度圖像。
- IMREAD_UNCHANGED:按原樣返回加載的圖像(使用Alpha通道)。
- IMREAD_ANYDEPTH:輸入具有相應(yīng)深度時(shí)會(huì)返回16位或32位圖像,否則會(huì)轉(zhuǎn)換為8位圖像。
- IMREAD_ANYCOLOR:以任何可能的顏色格式讀取圖像。
- retval:返回值,讀取的OpenCV圖像為多維Numpy數(shù)組。
注意問(wèn)題
(1) 在OpenCV中,最常用的圖像數(shù)據(jù)結(jié)構(gòu)是C++語(yǔ)言定義的Mat類。在Python語(yǔ)言中,Mat類的對(duì)象創(chuàng)建和操作是通過(guò)Numpy數(shù)組實(shí)現(xiàn)的。OpenCV對(duì)圖像的任何操作,本質(zhì)上都是對(duì) Numpy數(shù)組的運(yùn)算。
(2) OpenCV讀取圖像文件,返回值是二維或三維Numpy數(shù)組。當(dāng)讀取灰度圖像時(shí),返回值是形為(h,w)的二維數(shù)組;當(dāng)讀取彩色圖像時(shí),返回值是形為(h,w,ch)的三維數(shù)組。
(3) 如果無(wú)法讀取圖像(如文件不存在、權(quán)限不正確、格式不被支持或無(wú)效),并不會(huì)有報(bào)錯(cuò)提示,而會(huì)返回一個(gè)空矩陣。
(4) 該函數(shù)不支持帶有中文或空格的文件路徑和文件名,但也不會(huì)出現(xiàn)報(bào)錯(cuò)提示。當(dāng)必須使用中文路徑或文件名時(shí),可以使用函數(shù)cv.imdecode 處理,具體參見【例程0103】。
(5) 在OpenCV中,使用的彩色圖像為BGR格式的圖像,讀取圖像文件后,圖像文件可按B/G/R的順序存儲(chǔ)為多維數(shù)組。PIL、PyQt、Matplotlib 等庫(kù)使用的是RGB格式的圖像,圖像文件按R/G/B的順序存儲(chǔ)。
(6) 該函數(shù)默認(rèn)忽略圖像的透明通道(Alpha通道),通過(guò)設(shè)置參數(shù)flags=IMAGE_
UNCHANGED可以讀取透明通道。
(7) 對(duì)于彩色圖像文件,該函數(shù)默認(rèn)按彩色圖像格式讀取,也可以通過(guò)設(shè)置flags=0讀取為灰度圖像格式。將彩色圖像格式讀取為灰度圖像格式,本質(zhì)上是讀取的彩色圖像,并將彩色圖像轉(zhuǎn)換為灰度圖像。
(8) 目前支持的文件及擴(kuò)展名如下。
◎ Windows 位圖:.bmp、.dib。
◎ JPEG 文件:.jpeg、.jpg、.jpe。
◎ JPEG 2000文件:.jp2。
◎ 便攜式網(wǎng)絡(luò)圖形:.png。
◎ WebP:.webp。
◎ 便攜式圖像:.pbm、.pgm、.ppm、.pxm、.pnm。
◎ TIFF 文件:.tiff、.tif。
1.1.2 圖像的保存
函數(shù)cv.imwrite可以基于擴(kuò)展名的格式將圖像保存到指定文件。
函數(shù)原型
cv.imwrite(filename, img[,params]) → retval
參數(shù)說(shuō)明
- filename:保存圖像的文件路徑和文件名,包括文件擴(kuò)展名。
- img:要保存的 OpenCV 圖像,格式為多維Numpy數(shù)組。
- params:編碼格式參數(shù),可選項(xiàng)如下。
- IMWRITE_JPEG_QUALITY:設(shè)置JPEG/JPG格式圖片的質(zhì)量。數(shù)值越大,圖片質(zhì)量越高,取值范圍為0~100,默認(rèn)值為95。
- IMWRITE_PNG_COMPRESSION:設(shè)置PNG 格式圖片的壓縮比。數(shù)值越大,壓縮比越大,取值范圍為0~9,默認(rèn)值為3。
- IMWRITE_TIFF_RESUNIT:設(shè)置TIF 格式圖片的分辨率。
- IMWRITE_WEBP_QUALITY:設(shè)置WEBP 格式圖片的質(zhì)量。數(shù)值越大,圖片質(zhì)量越高,取值范圍為1~100,默認(rèn)值為100。
- IMWRITE_JPEG2000_COMPRESSION_X1000:設(shè)置JPEG2000格式圖片的質(zhì)量,默認(rèn)值為1000。
- retval:返回值,是布爾值,保存成功標(biāo)志。
?
注意問(wèn)題
(1) 圖像通常保存為8位單通道圖像或BGR三通道彩色圖像,而BGRA四通道圖像可以使用Alpha通道保存為PNG圖像,更多設(shè)置詳見OpenCV說(shuō)明文檔(鏈接1-1)。
(2) 函數(shù)cv.imwrite將OpenCV圖像(多維Numpy數(shù)組)保存為圖像文件,圖像的保存格式由filename的擴(kuò)展名決定,與讀取圖像文件時(shí)的圖像格式無(wú)關(guān)。
(3) 函數(shù)cv.imwrite不支持帶有中文或空格的文件路徑和文件名,但也不會(huì)有報(bào)錯(cuò)提示。需要使用中文路徑或文件名時(shí),可以使用函數(shù)cv.imdecode 處理,參見【例程0103】。
【例程0101】用OpenCV讀取和保存圖像文件
本例程用OpenCV讀取和保存圖像文件,注意讀取圖像文件時(shí)的參數(shù)設(shè)置。
# 【0101】用OpenCV 讀取和保存圖像文件 import cv2 as cv if __name__ == '__main__': # 讀取圖像文件,支持 BMP、JPG、PNG、TIFF 等常用格式 filepath = "../images/Lena.tif" # 讀取圖像文件的路徑 img = cv.imread(filepath, flags=1) # flags=1 讀取彩色圖像文件(BGR) gray = cv.imread(filepath, flags=0) # flags=0 讀取為灰度圖像 saveFile = "../images/imgSave1.png" # 保存圖像文件的路徑 cv.imwrite(saveFile, img, [int(cv.IMWRITE_PNG_COMPRESSION), 8]) cv.imwrite("../images/imgSave2.png", gray)
程序說(shuō)明
(1) 本例程讀取的圖像文件是彩色圖像文件。讀取為彩色圖像時(shí)可以設(shè)置flags=1,也可以省略;讀取為灰度圖像時(shí)必須設(shè)置flags=0。
(2) 讀取和保存圖像文件可以使用相對(duì)路徑或絕對(duì)路徑。
(3) 讀取文件時(shí)要注意檢查指定路徑的圖像文件是否存在。【例程0102】從網(wǎng)絡(luò)地址讀取圖像文件
本例程使用函數(shù)cv.imdecode從指定的內(nèi)存緩存中讀取數(shù)據(jù),并將數(shù)據(jù)轉(zhuǎn)換為圖像格式,用于從網(wǎng)絡(luò)傳輸數(shù)據(jù)中恢復(fù)圖像。
# 【0102】從網(wǎng)絡(luò)地址讀取圖像文件 import cv2 as cv import numpy as np if __name__ == '__main__': import urllib.request as request response = request.urlopen\ ("https://profile.yssmx.com/8/E/F/0_youcans") # 指定的 url 地址 imgUrl = cv.imdecode(np.array(bytearray(response.read()), dtype=np.uint8), -1) cv.imshow("imgUrl", imgUrl) # 在窗口顯示圖像 key = cv.waitKey(5000) # 5000 毫秒后自動(dòng)關(guān)閉 cv.destroyAllWindows()
程序說(shuō)明
(1) 從網(wǎng)絡(luò)地址讀取圖像文件不能使用函數(shù)cv.imread,而要使用函數(shù)cv.imdecode。
(2) 函數(shù)cv.imdecode能將圖像編碼為流數(shù)據(jù),賦值到內(nèi)存緩存中,以方便網(wǎng)絡(luò)傳輸。
【例程0103】讀取和保存文件路徑中帶有中文字符的圖像
本例程用于讀取/保存文件路徑中帶有中文字符的圖像。
# 【0103】讀取和保存文件路徑中帶有中文字符的圖像
import cv2 as cv
import numpy as np
if __name__ == '__main__':
filepath = "../images/測(cè)試圖01.tif" # 帶有中文的文件路徑和文件名
# img1 = cv.imread(filepath, flags=1) # 中文路徑讀取失敗,但不會(huì)報(bào)錯(cuò)
img2 = cv.imdecode(np.fromfile(filepath, dtype=np.uint8), flags=-1)
saveFile = "../images/測(cè)試圖02.tif" # 帶有中文的保存文件路徑
# cv.imwrite(saveFile, img2) # 中文路徑保存失敗,但不會(huì)報(bào)錯(cuò)
cv.imencode(".jpg", img2)[1].tofile(saveFile)
程序說(shuō)明
如果讀取/保存圖像的路徑和文件名中含有中文字符,則不能用函數(shù)cv.imread/cv.imwrite操作,可以使用函數(shù)cv.imdecode/cv.imencode處理。
本書京東優(yōu)惠購(gòu)書鏈接:https://item.jd.com/14098452.html
版權(quán)聲明:
youcans@xupt 原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接:(https://blog.csdn.net/youcans/article/details/132635637)
Copyright 2023 youcans, XUPT
Crated:2023-09-01文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-705231.html
歡迎關(guān)注本書CSDN獨(dú)家連載專欄
《數(shù)字圖像處理-OpenCV/Python》連載: https://blog.csdn.net/youcans/category_12418787.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-705231.html
到了這里,關(guān)于《數(shù)字圖像處理-OpenCV/Python》連載(4)圖像的讀取與保存的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!