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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

youcans 的 OpenCV 学习课—3.图像的创建与修改

發(fā)布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 youcans 的 OpenCV 学习课—3.图像的创建与修改 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

youcans 的 OpenCV 學習課—3.圖像的創(chuàng)建與修改


本系列面向 Python 小白,從零開始實戰(zhàn)解說 OpenCV 項目實戰(zhàn)。

OpenCV 中圖像的數(shù)據(jù)結構是 ndarray 多維數(shù)組,對圖像的任何操作本質上都是對 ndarray 多維數(shù)組的操作和運算。

本節(jié)介紹圖像的格式和 Numpy 方法圖像處理,提供完整例程和運行結果:查看圖像屬性,像素讀取與編輯,創(chuàng)建空白、黑色、白色、隨機圖像,圖像復制,圖像裁剪,ROI裁剪,圖像拼接、圖像通道的拆分與合并。


歡迎關注 『youcans 的 OpenCV 學習課』 系列,持續(xù)更新
youcans 的 OpenCV 學習課—1.安裝與環(huán)境配置
youcans 的 OpenCV 學習課—2.圖像讀取與顯示
youcans 的 OpenCV 學習課—3.圖像的創(chuàng)建與修改
youcans 的 OpenCV 學習課—4.圖像的疊加與混合
youcans 的 OpenCV 學習課—5.圖像的幾何變換
youcans 的 OpenCV 學習課—6.灰度變換與直方圖處理
youcans 的 OpenCV 學習課—7.空間域圖像濾波
youcans 的 OpenCV 學習課—8.頻率域圖像濾波(上)
youcans 的 OpenCV 學習課—9.頻率域圖像濾波(下)


1. 圖像基本知識

1.1 圖像顏色的分類

按照顏色對圖像進行分類,可以分為二值圖像、灰度圖像和彩色圖像。

  • 二值圖像:只有黑色和白色兩種顏色的圖像。每個像素點可以用 0/1 表示,0 表示黑色,1 表示白色。
  • 灰度圖像:只有灰度的圖像。每個像素點用 8bit 數(shù)字 [0,255] 表示灰度,如:0 表示純黑,255 表示純白。
  • 彩色圖像:彩色圖像通常采用紅色(R)、綠色(G)和藍色(B)三個色彩通道的組合表示。每個像素點可以用 3個 8bit 數(shù)字 [0,255] 分別表示紅色、綠色和藍色的顏色分量,如:(0,0,0) 表示黑色,(255,255,255) 表示白色。

彩色圖像可以采用不同的表達方式。OpenCV 使用 BGR 格式,色彩通道按照 B/G/R 的順序排列;而 matplotlib、PyQt5、Pillow 中使用 RGB 格式,色彩通道按照 R/G/B 的順序排列的。

一些彩色圖像格式還支持透明通道(alpha 通道),每個像素點用 8bit 數(shù)字 [0,255] 表示透明度,0 表示完全透明,255 表示完全不透明。

在數(shù)字圖像處理中,可以根據(jù)需要對圖像的通道順序進行轉換,或將彩色圖像轉換為灰度圖像、二值圖像。


1.2 數(shù)字圖像的表示

數(shù)字圖像是通過柵格排列的像素組成的,在計算機中以多維數(shù)據(jù)集來表示和處理。

OpenCV 的 Python API 是基于 Numpy 來存儲和處理多維數(shù)組,圖像的數(shù)據(jù)結構是 ndarray 多維數(shù)組。OpenCV 中對圖像的任何操作,本質上都是對 ndarray 多維數(shù)組的操作和運算。

OpenCV 中的二值圖像和灰度圖像用二維數(shù)組 (h, w) 表示,數(shù)組中的每個元素表示對應一個像素的灰度,每個像素的位深度為 8位。

OpenCV 中二值圖像被作為特殊的灰度圖像,每個像素點的值為 0(黑色)或 255(白色)。

OpenCV 中的彩色圖像用三維數(shù)組 (h, w, ch=3) 表示,數(shù)組中的每個元素對應一個像素的某種顏色分量,每個像素的位深度為 24位。

OpenCV 使用 BGR 格式,色彩通道順序為 B/G/R,因此 B 通道是 img[:, :, 0], G 通道是 img[:, :, 1], R 通道是 img[:, :, 2]。



1.3 數(shù)字圖像的屬性

OpenCV 中圖像對象的數(shù)據(jù)結構是 ndarray 多維數(shù)組,因此 ndarray 數(shù)組的屬性和操作方法也都適用于 OpenCV 的圖像對象。例如:

  • img.ndim:查看圖像的維數(shù),彩色圖像的維數(shù)為 3,灰度圖像的維數(shù)為 2。

  • img.shape:查看圖像的形狀,即圖像柵格的行數(shù)(高度)、列數(shù)(寬度)、通道數(shù)。

  • img.size:查看圖像數(shù)組元素總數(shù),灰度圖像的數(shù)組元素總數(shù)為像素數(shù)量,彩色圖像的數(shù)組元素總數(shù)為像素數(shù)量與通道數(shù)的乘積。

基本例程:

# 1.11 圖像數(shù)組的屬性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) # 在窗口顯示圖像# key = cv2.waitKey(0) # 等待按鍵命令# 維數(shù)(ndim), 形狀(shape), 元素總數(shù)(size), 元素類型(dtype)print("Ndim of img1(BGR): {}, img2(Gray): {}".format(img1.ndim, img2.ndim)) # number of rows, columns and channelsprint("Shape of img1(BGR): {}, img2(Gray): {}".format(img1.shape, img2.shape)) # number of rows, columns and channelsprint("Size of img1(BGR): {}, img2(Gray): {}".format(img1.size, img2.size)) # size = rows * columns * channelsprint("Dtype of img1(BGR): {}, img2(Gray): {}".format(img1.dtype, img2.dtype)) # uint8

本例程的運行結果如下:

Ndim of img1(BGR): 3, img2(Gray): 2 Shape of img1(BGR): (512, 512, 3), img2(Gray): (512, 512) Size of img1(BGR): 786432, img2(Gray): 262144 Dtype of img1(BGR): uint8, img2(Gray): uint8

通過資源管理器查看彩色圖像和灰度圖像的屬性如下圖,彩色圖像的位深度為 24,灰度圖像的位深度為 8。


2. 像素的編輯

像素是構成數(shù)字圖像的基本單位,像素處理是圖像處理的基本操作。

對像素的訪問、修改,可以使用 Numpy 方法直接訪問數(shù)組元素。

基本例程:

# 1.13 Numpy 獲取和修改像素值img1 = cv2.imread("../images/imgLena.tif", flags=1) # flags=1 讀取彩色圖像(BGR)x, y = 10, 10 # 指定像素位置 x, y# (1) 直接訪問數(shù)組元素,獲取像素值(BGR)pxBGR = img1[x,y] # 訪問數(shù)組元素[x,y], 獲取像素 [x,y] 的值print("x={}, y={}\nimg[x,y] = {}".format(x,y,img1[x,y]))# (2) 直接訪問數(shù)組元素,獲取像素通道的值print("img[{},{},ch]:".format(x,y))for i in range(3):print(img1[x, y, i], end=' ') # i=0,1,2 對應 B,G,R 通道# (3) img.item() 訪問數(shù)組元素,獲取像素通道的值print("\nimg.item({},{},ch):".format(x,y))for i in range(3):print(img1.item(x, y, i), end=' ') # i=0,1,2 對應 B,G,R 通道# (4) 修改像素值:img.itemset() 訪問數(shù)組元素,修改像素通道的值ch, newValue = 0, 255print("\noriginal img[x,y] = {}".format(img1[x,y]))img1.itemset((x, y, ch), newValue) # 將 [x,y,channel] 的值修改為 newValueprint("updated img[x,y] = {}".format(img1[x,y]))

本例程的運行結果如下:

x=10, y=10img[x,y] = [113 131 226]img[10,10,ch]: 113 131 226 img.item(10,10,ch): 113 131 226 original img[x,y] = [113 131 226]updated img[x,y] = [255 131 226]

3. 圖像的創(chuàng)建

OpenCV 中圖像對象的數(shù)據(jù)結構是 ndarray 多維數(shù)組,因此可以用 Numpy 創(chuàng)建多維數(shù)組來生成圖像。特別對于空白、黑色、白色、隨機等特殊圖像,用 Numpy 創(chuàng)建圖像非常方便。

Numpy 可以使用 np.zeros() 等方法創(chuàng)建指定大小、類型的圖像對象,也可以使用 np.zeros_like() 等方法創(chuàng)建與已有圖像大小、類型相同的新圖像。

函數(shù)說明:

numpy.empty(shape[, dtype, order]) # 返回一個指定形狀和類型的空數(shù)組

numpy.zeros(shape[, dtype, order]) # 返回一個指定形狀和類型的全零數(shù)組

numpy.ones(shape[, dtype, order]) # 返回一個指定形狀和類型的全一數(shù)組

numpy.empty_like(img) # 返回一個與圖像 img 形狀和類型相同的空數(shù)組

numpy.zeros_like(img) # 返回一個與圖像 img 形狀和類型相同的全零數(shù)組

numpy.ones_like(img) # 返回一個與圖像 img 形狀和類型相同的全一數(shù)組

參數(shù)說明:

  • shape:整型元組,定義返回多維數(shù)組的形狀
  • dtype:數(shù)據(jù)類型,定義返回多維數(shù)組的類型,可選項
  • img:ndarray 多維數(shù)組,表示一個灰度或彩色圖像

基本例程:

# 1.14 Numpy 創(chuàng)建圖像# 創(chuàng)建彩色圖像(RGB)# (1) 通過寬度高度值創(chuàng)建多維數(shù)組width, height, channels = 400, 300, 3 # 行/高度, 列/寬度, 通道數(shù)imgEmpty = np.empty((width, height, channels), np.uint8) # 創(chuàng)建空白數(shù)組imgBlack = np.zeros((width, height, channels), np.uint8) # 創(chuàng)建黑色圖像 RGB=0imgWhite = np.ones((width, height, channels), np.uint8) * 255 # 創(chuàng)建白色圖像 RGB=255# (2) 創(chuàng)建相同形狀的多維數(shù)組img1 = cv2.imread("../images/imgLena.tif", flags=1) # flags=1 讀取彩色圖像(BGR)imgBlackLike = np.zeros_like(img1) # 創(chuàng)建與 img1 相同形狀的黑色圖像imgWhiteLike = np.ones_like(img1) * 255 # 創(chuàng)建與 img1 相同形狀的白色圖像# (3) 創(chuàng)建彩色隨機圖像 RGB=randomimport osrandomByteArray = bytearray(os.urandom(width * height * channels))flatNumpyArray = np.array(randomByteArray)imgRGBRand = flatNumpyArray.reshape(width, height, channels)# (4) 創(chuàng)建灰度圖像imgGrayWhite = np.ones((width, height), np.uint8) * 255 # 創(chuàng)建白色圖像 Gray=255imgGrayBlack = np.zeros((width, height), np.uint8) # 創(chuàng)建黑色圖像 Gray=0imgGrayEye = np.eye(width) # 創(chuàng)建對角線元素為1 的單位矩陣 randomByteArray = bytearray(os.urandom(width * height))flatNumpyArray = np.array(randomByteArray)imgGrayRand = flatNumpyArray.reshape(width, height) # 創(chuàng)建灰度隨機圖像 Gray=random

本例程的運行結果如下:



4. 圖像的復制

使用 Numpy 的 np.copy() 函數(shù)可以進行圖像的復制,不能通過直接賦值進行圖像的復制。

函數(shù)說明:

arr = numpy.copy(img) # 返回一個復制的圖像

參數(shù)說明:

  • img:ndarray 多維數(shù)組,表示一個灰度或彩色圖像

注意事項:

  • Python 中的 “復制” 有無拷貝、淺拷貝和深拷貝之分,無拷貝相當于引用,淺拷貝只是對原變量內存地址的拷貝,深拷貝是對原變量(ndarray數(shù)組)的所有數(shù)據(jù)的拷貝。
  • Numpy 直接賦值是無拷貝,np.copy() 方法是深拷貝,切片操作是特殊的淺拷貝。
  • 直接賦值得到的新圖像相當于引用,改變新圖像的值時原圖像的值也發(fā)生改變;np.copy() 方法復制圖像(ndarray數(shù)組)得到的新圖像才是深拷貝,改變復制圖像的形狀或數(shù)值,原來圖像并不會發(fā)生改變。
  • 基本例程:

    # 1.15 圖像的復制img1 = cv2.imread("../images/imgLena.tif", flags=1) # flags=1 讀取彩色圖像(BGR)img2 = img1.copy()print("img2=img1.copy(), img2 is img1?", img2 is img1)for col in range(100):for row in range(100):img2[col, row, :] = 0img3 = cv2.imread("../images/imgLena.tif", flags=1) # flags=1 讀取彩色圖像(BGR)img4 = img3print("img4=img3, img4 is img3?", img4 is img3)for col in range(100):for row in range(100):img4[col, row, :] = 0cv2.imshow("Demo1", img1) # 在窗口顯示圖像cv2.imshow("Demo2", img2) # 在窗口顯示圖像cv2.imshow("Demo3", img3) # 在窗口顯示圖像cv2.imshow("Demo4", img4) # 在窗口顯示圖像key = cv2.waitKey(0) # 等待按鍵命令

    本例程中,img4=img3 直接賦值,改變 img4 的數(shù)值后 img3 的數(shù)值也被改變了;img2 = img1.copy(),改變 img2 的數(shù)值后 img1 并未發(fā)生改變。

    本例程的運行結果如下,使用 np.copy() 方法得到的新圖像才是深拷貝。

    img2=img1.copy(), img2 is img1? False img4=img3, img4 is img3? True

    5. 圖像的裁剪

    用 Numpy 的切片方法可以進行圖像的裁剪,操作簡單方便。

    方法說明:

    retval = img[y:y+h, x:x+w].copy()

    • 對圖像 img 裁剪并返回指定的矩陣區(qū)域圖像。

    參數(shù)說明:

    • img:圖像數(shù)據(jù),ndarray 多維數(shù)組
    • x, y:整數(shù),像素值,裁剪矩形區(qū)域左上角的坐標值
    • w, h:整數(shù),像素值,裁剪矩形區(qū)域的寬度、高度
    • 返回值 retval:裁剪后獲得的 OpenCV 圖像,nparray 多維數(shù)組

    注意事項:

  • Numpy 多維數(shù)組的切片是原始數(shù)組的淺拷貝,切片修改后原始數(shù)組也會改變。推薦采用 .copy() 進行深拷貝,得到原始圖像的副本。
  • Numpy 數(shù)組切片,當上界或下界為數(shù)組邊界時可以省略,如:img[y:, :x] 表示高度方向從 y 至圖像底部(像素ymax),寬度方向從圖像左側(像素 0)至 x。
  • 基本例程:

    # 1.16 圖像的裁剪img1 = cv2.imread("../images/imgLena.tif", flags=1) # flags=1 讀取彩色圖像(BGR)xmin, ymin, w, h = 180, 190, 200, 200 # 矩形裁剪區(qū)域 (ymin:ymin+h, xmin:xmin+w) 的位置參數(shù)imgCrop = img1[ymin:ymin+h, xmin:xmin+w].copy() # 切片獲得裁剪后保留的圖像區(qū)域cv2.imshow("DemoCrop", imgCrop) # 在窗口顯示 彩色隨機圖像key = cv2.waitKey(0) # 等待按鍵命令

    擴展例程:
    函數(shù) cv2.selectROI() 可以通過鼠標選擇感興趣的矩形區(qū)域(ROI)。

    cv2.selectROI(windowName, img, showCrosshair=None, fromCenter=None):

    使用 cv2.selectROI(),可以實現(xiàn)對 ROI 的裁剪,詳見例程 1.17。

    # 1.17 圖像的裁剪 (ROI)img1 = cv2.imread("../images/imgLena.tif", flags=1) # flags=1 讀取彩色圖像(BGR)roi = cv2.selectROI(img1, showCrosshair=True, fromCenter=False)xmin, ymin, w, h = roi # 矩形裁剪區(qū)域 (ymin:ymin+h, xmin:xmin+w) 的位置參數(shù)imgROI = img1[ymin:ymin+h, xmin:xmin+w].copy() # 切片獲得裁剪后保留的圖像區(qū)域cv2.imshow("DemoRIO", imgROI)cv2.waitKey(0)



    6. 圖像的拼接

    用 Numpy 的數(shù)組堆疊方法可以進行圖像的拼接,操作簡單方便。

    方法說明:

    retval = numpy.hstack((img1, img2, …)) # 水平拼接
    retval = numpy.vstack((img1, img2, …)) # 垂直拼接

    • np.hstack() 按水平方向(列順序)拼接 2個或多個圖像,圖像的高度(數(shù)組的行)必須相同。
    • np.vstack() 按垂直方向(行順序)拼接 2個或多個圖像,圖像的寬度(數(shù)組的列)必須相同。
    • 綜合使用 np.hstack() 和 np.vstack() 函數(shù),可以實現(xiàn)圖像的矩陣拼接。
    • np.hstack() 和 np.vstack() 只是簡單地將幾張圖像直接堆疊而連成一張圖像,并未對圖像進行特征提取和邊緣處理,因而并不能實現(xiàn)圖像的全景拼接。

    參數(shù)說明:

    • img1, img2, …:拼接前的圖像,ndarray 多維數(shù)組
    • 返回值 retval:拼接后的圖像,ndarray 多維數(shù)組

    基本例程:

    # 1.18 圖像拼接img1 = cv2.imread("../images/imgLena.tif") # 讀取彩色圖像(BGR)img2 = cv2.imread("../images/logoCV.png") # 讀取彩色圖像(BGR)img1 = cv2.resize(img1, (400, 400))img2 = cv2.resize(img2, (300, 400))img3 = cv2.resize(img2, (400, 300))imgStackH = np.hstack((img1, img2)) # 高度相同圖像可以橫向水平拼接imgStackV = np.vstack((img1, img3)) # 寬度相同圖像可以縱向垂直拼接print("Horizontal stack:\nShape of img1, img2 and imgStackH: ", img1.shape, img2.shape, imgStackH.shape)print("Vertical stack:\nShape of img1, img3 and imgStackV: ", img1.shape, img3.shape, imgStackV.shape)cv2.imshow("DemoStackH", imgStackH) # 在窗口顯示圖像 imgStackHcv2.imshow("DemoStackV", imgStackV) # 在窗口顯示圖像 imgStackVkey = cv2.waitKey(0) # 等待按鍵命令

    本例程的運行結果如下:

    Horizontal stack: Shape of img1, img2 and imgStackH: (400, 400, 3) (400, 300, 3) (400, 700, 3) Vertical stack: Shape of img1, img3 and imgStackV: (400, 400, 3) (300, 400, 3) (700, 400, 3)



    7. 圖像通道的拆分

    函數(shù) cv2.split() 將 3 通道 BGR 彩色圖像分離為 B、G、R 單通道圖像。

    函數(shù)說明:

    cv2.split(img[, mv]) -> retval # 圖像拆分為 BGR 通道

    • 函數(shù) cv2.split() 傳入一個圖像數(shù)組,并將圖像拆分為 B/G/R 三個通道。

    參數(shù)說明:

    • img:圖像數(shù)據(jù),ndarray 多維數(shù)組
    • mv:指定的分拆通道(可選)

    注意事項:

  • 對于 openCV 使用的 BGR 格式圖像,返回的分拆通道的次序為 B、G、R 通道。
  • BGR 彩色圖像的數(shù)據(jù)形狀為 (width, height, channels=3),返回的 B/G/R 通道的數(shù)據(jù)形狀為 (width, height),不能按照 BGR 彩色圖像直接顯示。
  • 如果直接用 imshow 顯示返回的單通道對象,將被視為 (width, height) 形狀的灰度圖像顯示。
  • 如果要正確顯示某一顏色分量,需要增加另外兩個通道值(置 0)轉換為 BGR 三通道格式,再用 imshow 才能顯示為拆分通道的顏色。
  • cv2.split() 操作復雜耗時,可以直接使用 NumPy 切片得到分離通道。
  • 基本例程:

    # 1.19 圖像拆分通道img1 = cv2.imread("../images/imgB1.jpg", flags=1) # flags=1 讀取彩色圖像(BGR)cv2.imshow("BGR", img1) # BGR 圖像# BGR 通道拆分bImg, gImg, rImg = cv2.split(img1) # 拆分為 BGR 獨立通道cv2.imshow("rImg", rImg) # 直接顯示紅色分量 rImg 顯示為灰度圖像# 將單通道擴展為三通道imgZeros = np.zeros_like(img1) # 創(chuàng)建與 img1 相同形狀的黑色圖像imgZeros[:,:,2] = rImg # 在黑色圖像模板添加紅色分量 rImgcv2.imshow("channel R", imgZeros) # 擴展為 BGR 通道print(img1.shape, rImg.shape, imgZeros.shape)cv2.waitKey(0)cv2.destroyAllWindows() # 釋放所有窗口

    本例程的運行結果如下:

    (512, 512, 3) (512, 512) (512, 512, 3)

    運行結果表明:

  • 彩色圖像 img1 的形狀為 (512, 512, 3),拆分的 R 通道 rImg 的形狀為 (512, 512)。
  • 用 imshow 顯示 rImg,將被視為 (512, 512) 形狀的灰度圖像顯示,不能顯示為紅色通道。
  • 對 rImg 增加 B、G 兩個通道值(置 0)轉換為 BGR格式,再用 imshow 才能顯示紅色通道的顏色。
  • 擴展例程:
    使用 NumPy 切片得到分離通道更為簡便,而且運行速度比 cv2.split 更快。

    # 1.20 圖像拆分通道 (Numpy切片)img1 = cv2.imread("../images/imgB1.jpg", flags=1) # flags=1 讀取彩色圖像(BGR)# 獲取 B 通道bImg = img1.copy() # 獲取 BGRbImg[:, :, 1] = 0 # G=0bImg[:, :, 2] = 0 # R=0# 獲取 G 通道gImg = img1.copy() # 獲取 BGRgImg[:, :, 0] = 0 # B=0gImg[:, :, 2] = 0 # R=0# 獲取 R 通道rImg = img1.copy() # 獲取 BGRrImg[:, :, 0] = 0 # B=0rImg[:, :, 1] = 0 # G=0# 消除 B 通道grImg = img1.copy() # 獲取 BGRgrImg[:, :, 0] = 0 # B=0plt.subplot(221), plt.title("1. B channel"), plt.axis('off')bImg = cv2.cvtColor(bImg, cv2.COLOR_BGR2RGB) # 圖片格式轉換:BGR(OpenCV) -> RGB(PyQt5)plt.imshow(bImg) # matplotlib 顯示 channel Bplt.subplot(222), plt.title("2. G channel"), plt.axis('off')gImg = cv2.cvtColor(gImg, cv2.COLOR_BGR2RGB)plt.imshow(gImg) # matplotlib 顯示 channel Gplt.subplot(223), plt.title("3. R channel"), plt.axis('off')rImg = cv2.cvtColor(rImg, cv2.COLOR_BGR2RGB)plt.imshow(rImg) # matplotlib 顯示 channel Rplt.subplot(224), plt.title("4. GR channel"), plt.axis('off')grImg = cv2.cvtColor(grImg, cv2.COLOR_BGR2RGB)plt.imshow(grImg) # matplotlib 顯示 channel GRplt.show()

    本例程的運行結果如下,GR channel 是消除 B通道(保留 G/R 通道的圖像):



    8. 圖像通道的合并

    函數(shù) cv2.merge() 將 B、G、R 單通道合并為 3 通道 BGR 彩色圖像。

    函數(shù)說明:

    cv2.merge(mv[, dst]) -> retval # BGR 通道合并

    參數(shù)說明:

    • mv:要合并的單通道
    • dst:通道合并的圖像,ndarray 多維數(shù)組

    注意事項:

  • 進行合并的 B、G、R 單通道圖像分量,數(shù)據(jù)形狀必須為 (width, height),而不是形狀為 (width, height, channels=3) 的藍色/綠色/紅色圖像。
  • 單通道圖像分量的圖像大小 (width, height) 必須相同才能進行合并。
  • 顏色通道要按照 B、G、R 通道次序合并,才能得到 BGR 格式的合并結果。
  • cv2.merge() 操作復雜耗時,推薦使用 NumPy 數(shù)組合并函數(shù) np.stack() 生成合成圖像。
  • 基本例程:

    # 1.21 圖像通道的合并img1 = cv2.imread("../images/imgB1.jpg", flags=1) # flags=1 讀取彩色圖像(BGR)bImg, gImg, rImg = cv2.split(img1) # 拆分為 BGR 獨立通道# cv2.merge 實現(xiàn)圖像通道的合并imgMerge = cv2.merge([bImg, gImg, rImg])cv2.imshow("cv2Merge", imgMerge)# Numpy 拼接實現(xiàn)圖像通道的合并imgStack = np.stack((bImg, gImg, rImg), axis=2)cv2.imshow("npStack", imgStack)print(imgMerge.shape, imgStack.shape)print("imgMerge is imgStack?", np.array_equal(imgMerge, imgStack))cv2.waitKey(0)cv2.destroyAllWindows() # 釋放所有窗口

    本例程的運行結果如下。imgMerge 與 imgStack 不僅形狀相同,而且每個位置的元素相等,表明 cv2.merge() 與 np.stack() 方法合并圖像通道的結果是相同的。

    (512, 512, 3) (512, 512, 3) imgMerge is imgStack? True

    【本節(jié)完】


    版權聲明:

    youcans 的 OpenCV 學習課 @ youcans 原創(chuàng)作品
    轉載必須標注原文鏈接:https://blog.csdn.net/youcans/article/details/121068795
    Copyright 2021 youcans, XUPT
    Crated:2021-11-01

    歡迎關注 『youcans 的 OpenCV 學習課』 系列,持續(xù)更新
    youcans 的 OpenCV 學習課—1.安裝與環(huán)境配置
    youcans 的 OpenCV 學習課—2.圖像讀取與顯示
    youcans 的 OpenCV 學習課—3.圖像的創(chuàng)建與修改
    youcans 的 OpenCV 學習課—4.圖像的疊加與混合
    youcans 的 OpenCV 學習課—5.圖像的幾何變換
    youcans 的 OpenCV 學習課—6.灰度變換與直方圖處理
    youcans 的 OpenCV 學習課—7.空間域圖像濾波
    youcans 的 OpenCV 學習課—8.頻率域圖像濾波(上)
    youcans 的 OpenCV 學習課—9.頻率域圖像濾波(下)

    總結

    以上是生活随笔為你收集整理的youcans 的 OpenCV 学习课—3.图像的创建与修改的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 国产污片在线观看 | 亚洲伦理在线视频 | 黄色av网站免费 | av影视天堂| 亚洲成人午夜影院 | 午夜视频国产 | 九色视频网 | 欧美大喷水吹潮合集在线观看 | 夜av| 涩涩视频在线免费看 | mm视频在线观看 | 99视频网址| 夜夜免费视频 | 中文字幕h | www..99热 | 欧美一区二区三区粗大 | 亚洲色图狠狠干 | 美女又爽又黄 | 日日操天天射 | 欧美亚洲网站 | 色www亚洲国产张柏芝 | 日韩一区二区在线视频 | 男生插女生网站 | 成人av男人的天堂 | 九九久久综合 | 欧美激情在线观看 | 国模叶桐尿喷337p人体 | 一本大道久久 | 午夜激情在线观看 | a视频 | 久草视频免费在线 | 粉豆av| 中文字幕在线视频日韩 | 青青久操 | 麻豆综合网 | 女生扒开尿口让男生桶 | 日日碰 | 欧美性做爰毛片 | 奇米狠狠去啦 | 国产真人做爰毛片视频直播 | 久久国产精品网站 | 一区二区三区网站 | 1区2区3区视频 | 欧美a级在线观看 | www.av.cn| 男女啪啪免费看 | 亚洲成人自拍视频 | 欧美黑丝少妇 | 日韩一区二区不卡视频 | 激情涩涩 | 欧美一级性生活视频 | 欧美丰满少妇人妻精品 | 日韩精品视频一区二区在线观看 | 79日本xxxxxxxxx18| 日本最黄网站 | 欧美老肥婆性猛交视频 | 国产精品日韩电影 | 高清视频在线播放 | 91精品视频免费观看 | 亚洲一级在线播放 | 美女草逼视频 | 在线观看成人小视频 | 欧美天堂在线 | 日本免费一区二区三区视频 | 国内精品嫩模av私拍在线观看 | 怡红院亚洲 | 国产伦精品一区二区三区视频黑人 | www.av在线 | 女人扒开双腿让男人捅 | 日韩午夜视频在线 | 91最新国产 | 西方裸体在线观看 | 九九热在线视频免费观看 | 伊人一二三| 欧美日韩aaa | 中文一区二区在线播放 | 日日摸天天添天天添破 | 欧美日韩国产精品一区二区三区 | 一区二区三区四区在线播放 | 91中文在线 | 亚洲av第一成肉网 | mm131亚洲精品 | aa在线视频| 久久久久久国产精品视频 | 麻豆国产在线播放 | 麻豆成人在线观看 | 天堂综合 | www,超碰| 一区二区三区欧美 | 久久久午夜影院 | 99av国产精品欲麻豆 | 永久免费看mv网站入口78 | a在线| 日韩一级黄色录像 | 国内自拍真实伦在线观看 | 色中文字幕在线观看 | 2019中文字幕在线观看 | 久久婷婷综合色丁香五月 | 调教丰满的已婚少妇在线观看 |