youcans 的 OpenCV 学习课—2.图像读取与显示
youcans 的 OpenCV 學習課—2.圖像讀取與顯示
本系列面向 Python 小白,從零開始實戰解說 OpenCV 項目實戰。
本節介紹圖像的讀取、保存和顯示。除基本方法和例程外,還給出了從網絡讀取圖像、讀取/保存中文路徑圖像、按指定大小顯示圖像、組合顯示多個圖像、通過 matplotlib 顯示彩色和灰度圖像的例程。
歡迎關注 『youcans 的 OpenCV 學習課 系列,持續更新
youcans 的 OpenCV 學習課—1.安裝與環境配置
youcans 的 OpenCV 學習課—2.圖像讀取與顯示
youcans 的 OpenCV 學習課—3.圖像的創建與修改
youcans 的 OpenCV 學習課—4.圖像的疊加與混合
youcans 的 OpenCV 學習課—5.圖像的幾何變換
youcans 的 OpenCV 學習課—6.灰度變換與直方圖處理
youcans 的 OpenCV 學習課—7.空間域圖像濾波
youcans 的 OpenCV 學習課—8.頻率域圖像濾波(上)
youcans 的 OpenCV 學習課—9.頻率域圖像濾波(下)
1. 圖像的讀取
函數 cv2.imread() 用于從指定的文件讀取圖像。
函數說明:
cv.imread(filename[, flags]) -> retval
- 函數 cv2.imread() 從指定文件加載圖像并返回該圖像的矩陣。
- 如果無法讀取圖像(文件丟失,權限不正確,格式不支持或無效),該函數返回一個空矩陣。
- 目前支持的文件格式:
- Windows 位圖 - * .bmp,* .dib
- JPEG 文件 - * .jpeg,* .jpg,*.jpe
- JPEG 2000文件 - * .jp2
- 便攜式網絡圖形 - * .png
- WebP - * .webp
- 便攜式圖像格式 - * .pbm,* .pgm,* .ppm * .pxm,* .pnm
- TIFF 文件 - * .tiff,* .tif
參數說明:
- filename:要加載的文件的路徑和名稱
- flags:讀取圖片的方式,可選項
- cv2.IMREAD_COLOR(1):始終將圖像轉換為 3 通道BGR彩色圖像,默認方式
- cv2.IMREAD_GRAYSCALE(0):始終將圖像轉換為單通道灰度圖像
- cv2.IMREAD_UNCHANGED(-1):按原樣返回加載的圖像(使用Alpha通道)
- cv2.IMREAD_ANYDEPTH(2):在輸入具有相應深度時返回16位/ 32位圖像,否則將其轉換為8位
- cv2.IMREAD_ANYCOLOR(4):以任何可能的顏色格式讀取圖像
- 返回值 retval:OpenCV 圖像,nparray 多維數組
注意事項:
基本例程:
# 1.1 圖像的讀取imgFile = "../images/imgLena.tif" # 讀取文件的路徑img1 = cv2.imread(imgFile, flags=1) # flags=1 讀取彩色圖像(BGR)img2 = cv2.imread(imgFile, flags=0) # flags=0 讀取為灰度圖像擴展例程:
# 1.2 從網絡讀取圖像import urllib.request as requestresponse = request.urlopen("https://profile.csdnimg.cn/8/E/F/0_youcans")imgUrl = cv2.imdecode(np.array(bytearray(response.read()), dtype=np.uint8), -1) # 1.3 讀取中文路徑的圖像imgFile = "../images/測試圖01.png" # 帶有中文的文件路徑和文件名# imread() 不支持中文路徑和文件名,讀取失敗,但不會報錯!# img = cv2.imread(imgFile, flags=1)# 使用 imdecode 可以讀取帶有中文的文件路徑和文件名img = cv2.imdecode(np.fromfile(imgFile, dtype=np.uint8), -1)2. 圖像的保存
函數 cv2.imwrite() 用于將圖像保存到指定的文件。
函數說明:
cv2.imwrite(filename, img [, flags])
- cv2.imwrite() 將 OpenCV 圖像保存到指定的文件。
- cv2.imwrite() 基于保存文件的擴展名選擇保存圖像的格式。
- cv2.imwrite() 只能保存 BGR 3通道圖像,或 8 位單通道圖像、或 PNG/JPEG/TIFF 16位無符號單通道圖像。
參數說明:
- filename:要保存的文件的路徑和名稱
- img:要保存的 OpenCV 圖像,nparray 多維數組
- flags:不同編碼格式的參數,可選項
- cv2.CV_IMWRITE_JPEG_QUALITY:設置 .jpeg/.jpg 格式的圖片質量,取值為 0-100(默認值 95),數值越大則圖片質量越高;
- cv2.CV_IMWRITE_WEBP_QUALITY:設置 .webp 格式的圖片質量,取值為 0-100;
- cv2.CV_IMWRITE_PNG_COMPRESSION:設置 .png 格式圖片的壓縮比,取值為 0-9(默認值 3),數值越大則壓縮比越大。
注意事項:
基本例程:
# 1.4 圖像的保存imgFile = "../images/logoCV.png" # 讀取文件的路徑img3 = cv2.imread(imgFile, flags=1) # flags=1 讀取彩色圖像(BGR)saveFile = "../images/imgSave.png" # 保存文件的路徑# cv2.imwrite(saveFile, img3, [int(cv2.IMWRITE_PNG_COMPRESSION), 8]) # 保存圖像文件, 設置壓縮比為 8cv2.imwrite(saveFile, img3) # 保存圖像文件擴展例程:
# 1.5 保存中文路徑的圖像imgFile = "../images/logoCV.png" # 讀取文件的路徑img3 = cv2.imread(imgFile, flags=1) # flags=1 讀取彩色圖像(BGR)saveFile = "../images/測試圖02.jpg" # 帶有中文的保存文件路徑# cv2.imwrite(saveFile, img3) # imwrite 不支持中文路徑和文件名,讀取失敗,但不會報錯!img_write = cv2.imencode(".jpg", img3)[1].tofile(saveFile)3. 圖像的顯示
函數 cv2.imshow() 用于在窗口中顯示圖像。
函數說明:
imshow(winname, img) -> None
- 函數 cv2.imshow() 在指定窗口中顯示 OpenCV 圖像,窗口自適應圖像大小。
- 顯示圖像的縮放取決于圖像深度:
- 對 8 位無符號圖像,按原樣顯示;
- 對 16 位無符號或 32 位整數圖像,將像素值范圍 [0,255 * 256] 映射到 [0,255] 顯示;
- 對 32 位浮點圖像,將像素值范圍 [0,1] 映射到 [0,255] 顯示;
- 如果指定窗口尚未創建,則創建一個自適應圖像大小的窗口;
- 如果要顯示大于屏幕分辨率的圖像,需要先調用 namedWindow("",WINDOW_NORMAL)。
參數說明:
- winname:字符串,顯示窗口的名稱。
- img:所顯示的 OpenCV 圖像,nparray 多維數組
注意事項:
基本例程:
# 1.6 圖像的顯示(cv2.imshow)imgFile = "../images/imgLena.tif" # 讀取文件的路徑img1 = cv2.imread(imgFile, flags=1) # flags=1 讀取彩色圖像(BGR)img2 = cv2.imread(imgFile, flags=0) # flags=0 讀取為灰度圖像cv2.imshow("Demo1", img1) # 在窗口 "Demo1" 顯示圖像 img1cv2.imshow("Demo2", img2) # 在窗口 "Demo2" 顯示圖像 img2key = cv2.waitKey(1000) # 等待按鍵命令, 1000ms 后自動關閉擴展例程:
# 1.7 圖像顯示(按指定大小的窗口顯示圖像)imgFile = "../images/imgLena.tif" # 讀取文件的路徑img1 = cv2.imread(imgFile, flags=1) # flags=1 讀取彩色圖像(BGR)cv2.namedWindow("Demo3", cv2.WINDOW_NORMAL)cv2.resizeWindow("Demo3", 400, 300)cv2.imshow("Demo3", img1) # 在窗口 "Demo3" 顯示圖像 img1key = cv2.waitKey(0) # 等待按鍵命令 # 1.8 圖像顯示(多個圖像組合顯示)imgFile1 = "../images/imgLena.tif" # 讀取文件的路徑img1 = cv2.imread(imgFile1, flags=1) # flags=1 讀取彩色圖像(BGR)imgFile2 = "../images/imgGaia.tif" # 讀取文件的路徑img2 = cv2.imread(imgFile2, flags=1) # # flags=1 讀取彩色圖像(BGR)imgStack = np.hstack((img1, img2)) # 相同大小圖像水平拼接cv2.imshow("Demo4", imgStack) # 在窗口 "Demo4" 顯示圖像 imgStackkey = cv2.waitKey(0) # 等待按鍵命令4. 通過 matplotlib 庫顯示圖像
函數 plt.imshow() 用于通過 matplotlib 庫顯示圖像。
函數說明:
matplotlib.pyplot.imshow(img[, cmap])
OpenCV 使用 BGR 格式,matplotlib/PyQt 使用 RGB 格式。使用 matplotlib/PyQt 顯示 openCV 圖像,要將 BGR 格式轉換為 RGB 格式:
# 圖片格式轉換:BGR(OpenCV) -> RGB(PyQt5) imgRGB = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB)參數說明:
- img:圖像數據,nparray 多維數組,對于 openCV(BGR)格式圖像要先進行格式轉換
- cmap:顏色圖譜(colormap),默認為 RGB(A) 顏色空間
- gray:灰度顯示
- hsv:hsv 顏色空間
注意事項:
基本例程:
# 1.10 圖像顯示(plt.imshow)imgFile = "../images/imgLena.tif" # 讀取文件的路徑img1 = cv2.imread(imgFile, flags=1) # flags=1 讀取彩色圖像(BGR)imgRGB = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB) # 圖片格式轉換:BGR(OpenCV) -> RGB(PyQt5)img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) # 圖片格式轉換:BGR(OpenCV) -> Grayplt.rcParams['font.sans-serif'] = ['FangSong'] # 支持中文標簽plt.subplot(221), plt.title("1. RGB 格式(mpl)"), plt.axis('off')plt.imshow(imgRGB) # matplotlib 顯示彩色圖像(RGB格式)plt.subplot(222), plt.title("2. BGR 格式(OpenCV)"), plt.axis('off')plt.imshow(img1) # matplotlib 顯示彩色圖像(BGR格式)plt.subplot(223), plt.title("3. 設置 Gray 參數"), plt.axis('off')plt.imshow(img2, cmap='gray') # matplotlib 顯示灰度圖像,設置 Gray 參數plt.subplot(224), plt.title("4. 未設置 Gray 參數"), plt.axis('off')plt.imshow(img2) # matplotlib 顯示灰度圖像,未設置 Gray 參數plt.show()程序說明:
圖 1 中 OpenCV 的 BGR 彩色圖像已轉換為 RGB 格式,彩色圖像的顏色顯示正常;
圖 2 中 OpenCV 的 BGR 彩色圖像格式未做轉換,彩色圖像的顏色顯示異常;
圖 3 中 plt.imshow() 設置 cmap=‘gray’,灰度圖像的顏色顯示正常;
圖 4 中 plt.imshow() 未設置 cmap=‘gray’,灰度圖像的顏色顯示異常。
【本節完】
版權聲明:
『youcans 的 OpenCV 學習課』
原創作品,轉載必須標注原文鏈接:https://blog.csdn.net/youcans/article/details/121068773
Copyright 2021 youcans, XUPT
Crated:2021-11-01
歡迎關注 『youcans 的 OpenCV 學習課』 系列,持續更新
youcans 的 OpenCV 學習課—1.安裝與環境配置
youcans 的 OpenCV 學習課—2.圖像讀取與顯示
youcans 的 OpenCV 學習課—3.圖像的創建與修改
youcans 的 OpenCV 學習課—4.圖像的疊加與混合
youcans 的 OpenCV 學習課—5.圖像的幾何變換
youcans 的 OpenCV 學習課—6.灰度變換與直方圖處理
youcans 的 OpenCV 學習課—7.空間域圖像濾波
youcans 的 OpenCV 學習課—8.頻率域圖像濾波(上)
youcans 的 OpenCV 學習課—9.頻率域圖像濾波(下)
總結
以上是生活随笔為你收集整理的youcans 的 OpenCV 学习课—2.图像读取与显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python数模笔记-PuLP库(3)线
- 下一篇: 【OpenCV 例程200篇】100.