日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

youcans 的 OpenCV 学习课—2.图像读取与显示

發布時間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 多維數組

注意事項:

  • OpenCV 讀取圖像文件,返回值是一個nparray 多維數組。OpenCV 對圖像的任何操作,本質上就是對 Numpy 多維數組的運算。
  • OpenCV 中彩色圖像使用 BGR 格式,而 PIL、PyQt、matplotlib 等庫使用的是 RGB 格式。
  • cv2.imread() 如果無法從指定文件讀取圖像,并不會報錯,而是數返回一個空矩陣。
  • cv2.imread() 指定圖片的存儲路徑和文件名,在 python3 中不支持中文和空格(但并不會報錯)。必須使用中文時,可以使用 cv2.imdecode() 處理,參見擴展例程。
  • cv2.imread() 讀取圖像時默認忽略透明通道,但可以使用 CV_LOAD_IMAGE_UNCHANGED 參數讀取透明通道。
  • 對于彩色圖像,可以使用 flags=0 按照讀取為灰度圖像。
  • 基本例程:

    # 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),數值越大則壓縮比越大。

    注意事項:

  • cv2.imwrite() 保存的是 OpenCV 圖像(多維數組),不是 cv2.imread() 讀取的圖像文件,所保存的文件格式是由 filename 的擴展名決定的,與讀取的圖像文件的格式無關。
  • 對 4 通道 BGRA 圖像,可以使用 Alpha 通道保存為 PNG 圖像。
  • cv2.imwrite() 指定圖片的存儲路徑和文件名,在 python3 中不支持中文和空格(但并不會報錯)。必須使用中文時,可以使用 cv2.imencode() 處理,參見擴展例程。
  • 基本例程:

    # 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 多維數組

    注意事項:

  • 函數 cv2.imshow() 之后要用 waitKey() 函數設定圖像窗口的顯示時長,否則不會顯示圖像窗口。
  • 圖像窗口將在 waitKey() 函數所設定的時長(毫秒)后自動關閉,waitKey(0) 表示窗口顯示時長為無限。
  • 可以創建多個不同的顯示窗口,每個窗口必須命名不同的 filename。
  • 可以用 destroyWindow() 函數關閉指定的顯示窗口,也可以用 destroyAllWindows() 函數關閉所有的顯示窗口。
  • 基本例程:

    # 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 顏色空間

    注意事項:

  • OpenCV 和 matplotlib 中的彩色圖像都是 Numpy 多維數組。但 OpenCV 使用 BGR 格式,顏色分量按照藍/綠/紅的次序排列,而 matplotlib 使用 RGB 格式,顏色分量按照紅/綠/藍的次序排序。因此用 plt.imshow() 顯示 OpenCV 彩色圖像時,先要進行顏色空間轉換,將Numpy 多維數組按照紅/綠/藍的次序排序。
  • plt.imshow() 可以直接顯示 OpenCV 灰度圖像,不需要格式轉換,但需要使用 cmap=‘gray’ 進行參數設置。
  • plt.imshow() 可以使用 matplotlib 庫中的各種方法繪圖,如標題、坐標軸、插值等,詳見 matploblib Document。
  • PyQt5 也使用 RGB 格式,因此在 PyQt5 中顯示 OpenCV 彩色圖像時,也要進行顏色空間轉換。
  • 基本例程:

    # 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.图像读取与显示的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。