摘要
在這篇文章中將給大家講解如何分別用numpy
的方法,與numpy與cv2結合
的方法創建空白畫布,創建白色畫布,與創建彩色畫布。在講解過程中還會介紹cv2
進行通道分割cv2.split
與通道合並cv2.merge
的兩個函數的具體使用以及深究numpy的ndarray數據結構的索引與賦值。
numpy的ndarray數據結構的索引與賦值
在使用畫圖工具的時候, 第一件事情就是創建一個新的空白畫布,我們可以指定畫布的大小和顏色。
那我們如何使用opencv來創建一個空白的畫布(值相同的圖片) ?
其實image的數據結構上的圖片,本質上就是numpy
里面的ndarray的對象
,創建一個畫布本質上就是創建一個同等規格的ndarray
。
創建一個新的特定尺寸的ndarray
我們可以使用np.zeors
函數,我們將圖像的高度(height),圖像的寬度(width),以及圖像的通道數channel
以tuple 類型
傳入np.zeros
。再次聲明是tuple類型。
另外由於不是所有的numpy
類型的數值,都可以放到opencv中進行圖像處理.
數值取值范圍在0-255
, 我們需要指定數據類型為uint8
unsigned integer 8-bit
np.zeros((height, width, channels), dtype="uint8")
1
復制代碼
舉個例子:想創建一個800 x 600 x 3 的圖片,一個BGR格式的圖像,我們就得這么寫:
# 初始化一個空畫布 300×300 三通道 背景色為黑色
canvas_black = np.zeros((600, 800, 3), dtype="uint8")
12
復制代碼
得到的效果如下:
注意: height寫在前面
為什么Height寫在前面?
就得知道opencv圖像的數據結構是numpy,Image的屬性,其實就是numpy的ndarray數據格式的屬性。
我們可以直接獲取img對象的諸多屬性,例如我們打印lena圖的屬性,具體如下:
# -*- coding: utf-8 -*-
import numpy as np
import cv2
# 導入一張圖像 模式為彩色圖片
img = cv2.imread('lena.jpg', cv2.IMREAD_COLOR)
print("================打印圖像的屬性================")
print("圖像對象的類型 {}".format(type(img)))
print(img.shape)
print("圖像寬度: {} pixels".format(img.shape[1]))
print("圖像高度: {} pixels".format(img.shape[0]))
print("通道: {}".format(img.shape[2]))
print("圖像分辨率: {}".format(img.size))
print("數據類型: {}".format(img.dtype))
123456789101112131415
復制代碼
輸出結果:
================打印圖像的屬性================
圖像對象的類型 <class 'numpy.ndarray'>
(256, 256, 3)
圖像寬度: 256 pixels
圖像高度: 256 pixels
通道: 3
圖像分辨率: 196608
數據類型: uint8
12345678
復制代碼
有時候我們也可以偷懶,如果我們想創建與另外一個圖像尺寸相同的畫布的時候,我們可以使用np.zeros_like
canvas_black = np.zeros_like(img)
1
復制代碼
創建空白畫布
創建空白畫布的函數如下:
def InitCanvas(width, height, color=(255, 255, 255)):
canvas = np.ones((height, width, 3), dtype="uint8")
canvas[:] = color
return canvas
1234
復制代碼
調用的時候傳入圖像的寬度、高度和畫布的顏色。例如創建一個800*600 顏色為純黑色的畫布:
canvas = InitCanvas(800, 600, color=(255,255,255))
1
復制代碼
創建空白畫布的完整代碼如下:
'''
初始化畫布
'''
import cv2
import numpy as np
def init_canvas(width, height, color=(255, 255, 255)):
canvas = np.ones((height, width, 3), dtype="uint8")
canvas[:] = color
return canvas
canvas = init_canvas(200, 200, color=(125, 40, 255))
cv2.imshow('canvas', canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()
1234567891011121314151617
復制代碼
效果展示: