《數字圖像處理-OpenCV/Python》連載(10)圖像屬性與數據類型
本書京東優(yōu)惠購書鏈接:https://item.jd.com/14098452.html
本書CSDN獨家連載專欄:https://blog.csdn.net/youcans/category_12418787.html
第2章 圖像的數據格式
在Python語言中,OpenCV以Numpy數組存儲圖像,對圖像的訪問和處理都是通過Numpy數組的操作來實現(xiàn)的。
本章內容概要
- 介紹Python語言中OpenCV的數據結構,學習獲取圖像的基本屬性。
- 學習使用Numpy數組實現(xiàn)圖像的創(chuàng)建、復制、裁剪、拼接、拆分與合并的方法。
- 學習使用查找表(LUT)快速實現(xiàn)像素值的替換。
2.1 圖像屬性與數據類型
2.1.1 圖像顏色分類
按照圖像顏色分類,圖像可以分為二值圖像、灰度圖像和彩色圖像。
- 二值圖像:只有黑色和白色兩種顏色的圖像。每個像素點的像素值可以用0/1或0/255表示,0表示黑色,1或255表示白色。
- 灰度圖像:只有灰度的圖像。每個像素點的像素值可以用8bit數字[0, 255]表示灰度級,如0表示純黑,255表示純白。
- 彩色圖像:彩色圖像可以采用藍色(B)、綠色(G)和紅色(R)三個顏色通道的組合來表示。每個像素點可以用3個 8bit 數字[0, 255]分別表示紅色、綠色和藍色的顏色分量,如(0,0,0) 表示黑色,(0,0,255) 表示紅色,(255,255,255) 表示白色。
OpenCV使用BGR格式讀取圖像解碼后,按B/G/R順序存儲為多維Numpy數組,而PIL、PyQt、Matplotlib等庫使用的是RGB格式。
在數字圖像處理中,可以根據需要對圖像的顏色通道順序進行轉換,或將彩色圖像轉換為灰度圖像和二值圖像。
2.1.2 以Numpy數組表示數字圖像
數字圖像由像素點組成的矩陣來描述,以多維Numpy數組來表示和處理。
OpenCV在C++語言中定義的Mat類,是最基本的圖像存儲格式。在Python語言的API中則基于Numpy庫來存儲和處理多維數組,即以多維Numpy數組來存儲和處理圖像。在Python語言中,OpenCV對圖像的任何操作,本質上都是對多維Numpy數組的操作和運算。
OpenCV中的二值圖像和灰度圖像用二維數組表示,數組的形狀是(h,w),行與列分別表示圖像的高度與寬度。數組中每個元素的值表示對應行/列像素點的灰度值。二值圖像是特殊的灰度圖像,像素值取0/1或0/255。
OpenCV中的彩色圖像用三維數組(h,w,ch) 表示,ch=3表示通道數,數據組織形式如圖2-1所示。數組中的每個元素對應像素點的某種顏色分量值。
OpenCV顏色通道的順序為B/G/R,因此img[:,:,0]表示彩色圖像img的B通道,img[:,:,1]表示G通道,img[:,:,2]表示R通道。
在OpenCV中,圖像的數據結構是Numpy數組,因此Numpy數組的所有屬性和操作方法都適用于OpenCV的圖像對象。例如:
- img.ndim:查看圖像的維數,彩色圖像的維數為3,灰度圖像的維數為2。
- img.shape:查看圖像的形狀(h,w,ch),即圖像的行數(高度)、列數(寬度)和通道數。
- img.size:查看圖像數組元素的總數,即圖像像素的數量與通道數的乘積。
2.1.3 圖像的數據類型
OpenCV函數對于數據類型有嚴格要求,錯誤的數據類型會導致語法錯誤。
OpenCV中圖像數據類型的參數命名格式如下。
CV_{數字位數}{數字類型}C{通道數}
例如,CV_8UC3表示三通道8位無符號整型數據格式的矩陣。
OpenCV數據類型與Numpy數據類型的對照關系如表2-1所示。在圖像處理中,最常用的數據類型是8位無符號整型數據CV_8U,對應的Numpy數據類型是uint8。
推薦在調用Numpy庫函數時使用Numpy數據類型的名稱,而在調用OpenCV函數時使用OpenCV數據類型的名稱,以免發(fā)生錯誤。
使用img.dtype可以獲得Numpy數組的數據類型,使用img.astype可以把圖像的數據類型轉換成指定的Numpy數據類型。
【例程0201】圖像屬性與數據類型轉換
本例程使用Numpy數組的操作方法,獲取圖像屬性和數據格式。
# 【0201】圖像屬性與數據類型轉換
import cv2 as cv
import numpy as np
if __name__ == '__main__':
# 讀取圖像,支持 BMP、JPG、PNG、TIFF 等常用格式
filepath = "../images/imgLena.tif" # 讀取文件的路徑
img = cv.imread(filepath, flags=1) # flags=1 讀取彩色圖像(BGR)
gray = cv.imread(filepath, flags=0) # flags=0 讀取為灰度圖像
# 維數(Ndim)、形狀(Shape)、元素總數(Size)、數據類型(Dtype)
print("Ndim of img(BGR): {}, gray: {}".format(img.ndim, gray.ndim))
print("Shape of img(BGR): {}, gray: {}".format(img.shape, gray.shape)) # number of rows, columns and channels
print("Size of img(BGR): {}, gray: {}".format(img.size, gray.size)) # size = rows × columns × channels
imgFloat = img.astype(np.float32) / 255
print("Dtype of img(BGR): {}, gray: {}".format(img.dtype, gray.dtype)) # uint8
print("Dtype of imgFloat: {}".format(imgFloat.dtype)) # float32
運行結果:
Ndim of img(BGR): 3, gray: 2
Shape of img(BGR): (512, 512, 3), gray: (512, 512)
Size of img(BGR): 786432, gray: 262144
Dtype of img(BGR): uint8, gray: uint8
Dtype of imgFloat: float32
程序說明:
(1) 彩色圖像是三維Numpy數組,灰度圖像是二維Numpy數組。因此,相同尺寸的彩色圖像與灰度圖像的像素數量相同,但數組元素的數量不同。
(2) 彩色圖像的形狀為(h, w, 3),灰度圖像的形狀為(h, w)。在查看圖像高度和寬度時,推薦使用h, w=img.shape[:2],不推薦使用h, w=img.shape。
本書京東優(yōu)惠購書鏈接:https://item.jd.com/14098452.html
版權聲明:
youcans@xupt 原創(chuàng)作品,轉載必須標注原文鏈接:(https://blog.csdn.net/youcans/article/details/133561857)
Copyright 2023 youcans, XUPT
Crated:2023-10-05文章來源:http://www.zghlxwxcb.cn/news/detail-723625.html
歡迎關注本書CSDN獨家連載專欄
《數字圖像處理-OpenCV/Python》連載: https://blog.csdn.net/youcans/category_12418787.html文章來源地址http://www.zghlxwxcb.cn/news/detail-723625.html
到了這里,關于《數字圖像處理-OpenCV/Python》連載(10)圖像屬性與數據類型的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!