OpenCV庫學習筆記2
- 1. shape函式的回傳值
- 2. 像素值取反方法
- 3. getTickCount函式和getTickFrequency函式計算函式運行時間
- 4. NumPy模塊中zeros函式和ones函式詳解
- 5. NumPy模塊中常用方法
- 6. 色彩空間
- 6.1 色彩空間的概念
- 6.2 常見的色彩空間
- 6.3 不同的色彩空間之間的相互轉換
- 6.3.1 HSV與RGB相互轉換
- 6.3.2 YUV與RGB相互轉換
1. shape函式的回傳值
import cv2 as cv
def get_image_info(image):
print(image.shape)
height = image.shape[0]
width = image.shape[1]
channels = image.shape[2]
print("寬度:%d,高度:%d,通道:%d" % (width, height, channels))
img = cv.imread("01.jpg")
get_image_info(img)
(640, 640, 3)
寬度:640,高度:640,通道:3
2. 像素值取反方法
(1)每一個像素取反
該方法是一個一個像素值進行修改,會很慢!
import cv2 as cv
def access_pexels(image):
height = image.shape[0]
width = image.shape[1]
channels = image.shape[2]
for row in range(width):
for col in range(height):
for c in range(channels):
pv = image[row, col, c]
image[row, col, c] = 255 - pv;
cv.imshow("image", image)
img = cv.imread("01.jpg")
cv.imshow("image_", img)
access_pexels(img)
cv.waitKey(0)
cv.destroyAllWindows();

(2)bitwise_not介面
這個函式會比上一個方法運行的更快!
import cv2 as cv
def func(image):
cv.imshow("image", image)
image_ = cv.bitwise_not(image)
cv.imshow("image_", image_)
image = cv.imread("01.jpg")
func(image)
cv.waitKey(0)
cv.destroyAllWindows()

3. getTickCount函式和getTickFrequency函式計算函式運行時間
cv.getTickCount()
cv.getTickFrequency()
-
getTickCount獲取從作業系統啟動到呼叫該函式的地方所經歷的計時周期數,可以理解為次數
-
getTickFrequency獲取CPU的頻率,單位:次/秒
-
所以:(次數2 - 次數1)/ 頻率 = 秒
樣例
import cv2 as cv
def access_pexels(image):
height = image.shape[0]
width = image.shape[1]
channels = image.shape[2]
for row in range(width):
for col in range(height):
for c in range(channels):
pv = image[row, col, c]
image[row, col, c] = 255 - pv;
img = cv.imread("01.jpg")
t1 = cv.getTickCount();
access_pexels(img)
t2 = cv.getTickCount();
running_time = 1000 * (t2 - t1) / cv.getTickFrequency()
print('running time: %s (ms)' % running_time)
running time: 2526.2581 (ms)
4. NumPy模塊中zeros函式和ones函式詳解
import numpy
def zeros(shape, dtype=None, order='C') # 將值全部初始化為 0
def ones(shape, dtype=None, order='C') # 將值全部初始化為 1,還可進行乘積運算,修改成不同的值
-
shape表示陣列的型別,可以是一維、二維、三維的
-
dtype表示其中資料的型別,默認為float64(64位的float型別),也可以指定為np.uint8(無符號8位整型,資料范圍在0~255,正好適合表示圖片的像素值)
-
order表示在記憶體中存盤多維陣列的風格,默認為’C’(以行為主順序),也可以填 ‘F’ (以列為主順序)
import numpy as np
import cv2 as cv
def create_image():
img = np.zeros([300,300,3], np.uint8) # 創建一個400*400的3通道的圖片,dtype為np.uint8
cv.imshow("img", img)
img[:, :, 0] = np.ones([300, 300]) * 255 # 將0號通道的值變成255
cv.imshow("img_", img)
create_image()
cv.waitKey(0)
cv.destroyAllWindows();

代碼中使用zero函式創建了一個三維陣列,使用這個陣串列示圖片,其中圖片大小為300 * 300,有3個通道,由于陣列中的默認值為0,所以創建出來的圖片是黑色
通過ones函式修改某通道的值,以達到修改像素值,使圖片顏色改變
代碼中將0號通道值全部變為255,所以每一個像素點的值都是(0,0,255),所以顯示出來是藍色
圖解zero函式和ones函式在上述代碼中的作用

單通道樣例
import numpy as np
import cv2 as cv
def create_image():
img = np.zeros([300,300,1], np.uint8)
cv.imshow("img", img)
img[:, :, 0] = np.ones([300, 300]) * 127
cv.imshow("img_", img)
create_image()
cv.waitKey(0)
cv.destroyAllWindows();
由于只有一個通道,這個通道的值的取值為[0,255],若是0則代表黑色,若是255則代表白色,中間的是灰色

5. NumPy模塊中常用方法
(1)reshape方法和fill方法
import numpy
array1 = numpy.zeros([3, 3], numpy.uint8) # 創建一個3 * 3的二維陣列,其中資料型別為8位的無符號整型,
print(array1)
array2 = array1.reshape([1, 9]) # 該函式可以將原有的資料個數(9個),變成其他維度的,資料的個數不能改變哦!
print(array2)
array2.fill(256) # 將陣列中填入某個值,如果這個值 大于該型別的最大值,會出現高位截斷
print(array2)
[[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0 0 0 0 0 0 0]]
[[0 0 0 0 0 0 0 0 0]]

(2)array方法
import numpy
one_dimension = numpy.array([1,2,3], numpy.int32) # 創建一維陣列
two_dimensions = numpy.array([[1,2,3],[4,5,6]], numpy.int32) # 創建二維陣列
three_dimensions = numpy.array([[1,2,3],[4,5,6],[7,8,9]], numpy.int32) # 創建三維陣列
print(one_dimension)
print(two_dimensions)
print(three_dimensions)
[1 2 3]
[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]
[7 8 9]]
6. 色彩空間
6.1 色彩空間的概念
- 顏色空間通常用
三個相對獨立的屬性來描述,三個獨立的變數綜合作用,自然構成一個空間坐標,這就是顏色空間(顏色模型), - 顏色可以由不同的角度,用三個不同屬性加以描述,就產生了不同的顏色空間,但被描述的顏色物件本身是客觀的,不同顏色空間只是從不同的角度去衡量同一個物件
6.2 常見的色彩空間
(1) RGB
電腦成像利用了影像的三原色的原理,RGB顏色模型即代表了紅綠藍三原色,每種顏色利用兩位十六進制數(八位二進制數)表示該顏色的強度,其中在顏色通道大小為0時色強最弱,大小為255時色強最強,由于在所有影像通道都為0時影像呈白色,所有影像通道值為255時影像呈黑色,所以RGB影像也被稱為灰度影像,
- RGB 色彩空間模型示意圖

- RGB 色彩空間 彩色圖

(2) HSV
HSV顏色模型,通過色調(H)飽和度(S)明度(V)來表現,色調H由角度表示,取值為0-360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°,它們的補色是:黃色為60°,青色為180°,品紅為300°,飽和度S表示顏色接近光譜色的程度,一種顏色,可以看成是某種光譜色與白色混合的結果,其中光譜色所占的比例愈大,顏色接近光譜色的程度就愈高,顏色的飽和度也就愈高,飽和度高,顏色則深而艷,光譜色的白光成分為0,飽和度達到最高,通常取值范圍為0%~100%,值越大,顏色越飽和,明度表示顏色明亮的程度,對于光源色,明度值與發光體的光亮度有關;對于物體色,此值和物體的透射比或反射比有關,通常取值范圍為0%(黑)到100%(白)
(3) HIS
HIS色彩空間模型示意圖

(4)YUV (YCrCb)
在YUV顏色模型中,“Y”表示明亮度(Luminance或Luma),也就是灰階值;而“U”和“V” 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用于指定像素的顏色,“亮度”是透過RGB輸入信號來建立的,方法是將RGB信號的特定部分疊加到一起,“色度”則定義了顏色的兩個方面─色調與飽和度,分別用Cr和Cb來表示,其中,Cr反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差異,而Cb反映的是RGB輸入信號藍色部分與RGB信號亮度值之間的差異,
YUV顏色模型解決了彩色影像和黑白影像的兼容問題,如果只有Y信號而沒有U何V信號,那么一幅彩色影像就可以背轉換為黑白影像,
YUV顏色模型可以和RGB顏色模型相互轉換,公式如下:
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
6.3 不同的色彩空間之間的相互轉換
def cvtColor(src, code, dst=None, dstCn=None)
- src代表需要轉換的影像
- code代表顏色映射碼
6.3.1 HSV與RGB相互轉換
| 顏色映射碼(HSV < - - > RGB) |
|---|
| COLOR_RGB2HSV |
| COLOR_HSV2RGB |
import cv2 as cv
def color_space_change(image):
RGB2HSV_img = cv.cvtColor(image, cv.COLOR_RGB2HSV)
cv.imshow("RGB2HSV_img", RGB2HSV_img)
HSV2RGB_img = cv.cvtColor(RGB2HSV_img, cv.COLOR_HSV2RGB)
cv.imshow("HSV2RGB_img", HSV2RGB_img)
img = cv.imread("01.jpg")
color_space_change(img)
cv.waitKey(0)
cv.destroyAllWindows()

6.3.2 YUV與RGB相互轉換
| 顏色映射碼(YUV < - - > RGB) |
|---|
| COLOR_RGB2YUV |
| COLOR_YUV2RGB |
import cv2 as cv
def color_space_change(image):
RGB2YUV_img = cv.cvtColor(image, cv.COLOR_RGB2YUV)
cv.imshow("RGB2YUV_img", RGB2YUV_img)
YUV2RGB_img = cv.cvtColor(RGB2YUV_img, cv.COLOR_YUV2RGB)
cv.imshow("YUV2RGB_img", YUV2RGB_img)
img = cv.imread("01.jpg")
color_space_change(img)
cv.waitKey(0)
cv.destroyAllWindows()

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/249485.html
標籤:python
上一篇:Python實作一個論文下載器
下一篇:PyQt5入門(七)常用控制元件

