OpenCV影像處理學習筆記-Day1

coderchen01發表於2020-09-28

OpenCV影像處理學習筆記-Day1

第1課:影像讀入、顯示和儲存

1. 讀入影像

retval = cv2.imread(檔名[,顯示控制引數])
檔名:完整檔名
引數:
	cv2.IMREAD_UNCHANGED
    cv2.IMREAD_GRAYSCALE
    cv2.IMREAD_COLOR

2. 顯示影像

None = cv2.imshow(視窗名, 影像名)
範例:
	cv2.imshow('demo', image)
    
retval = cv2.waitKey(	[,delay])
delay:
    delay > 0	等待delay毫秒
    delay < 0	等待鍵盤單擊
    delay = 0	無線等待
    
cv2.destroyAllWindows()  # 銷燬所有視窗

3. 儲存影像

retval = cv2.imwrite(檔案地址, 檔名)
範例:
    cv2.imwrite('./image/A.jpg')

第2課:影像處理入門基礎

1. 基本概念

影像是由畫素構成的

影像分類:

  1. 二值影像
  2. 灰度影像
  3. RGB影像
OpenCV影像處理學習筆記-Day1

二值影像的畫素點只能是0,1

灰度影像的畫素點是0-255,0為純黑,255為純白,區間內都是灰色

RGB影像(3通道,在OpenCV為BGR)

OpenCV影像處理學習筆記-Day1

RGB影像的構成可以理解為三個灰度影像拼成一個RGB影像。

2. RGB轉灰度

在實際專案中,通常需要將原始影像處理為灰度影像。為什麼這麼做呢?原始的彩色影像其一個畫素點有三個值處理資料較為麻煩。而灰度影像每個畫素點就只有一個值處理起來較為簡單。轉為灰度影像是否會丟失影像資訊?不會!在轉換過程中採取的演算法採用加權操作,確保RGB三個顏色都儲存在灰度影像中。

第3課:畫素處理

1. 讀取畫素

返回值 = 影像(位置引數)

# 灰度影像,返回灰度值
範例:
    p = img[88, 142]
    print(p)
    
# BGR影像,返回B,G,R的值
範例:
    blue = img[78, 125, 0]
    print(blue)
    
    green = img[78, 125, 1]
    print(green)
    
    red = img[78, 125, 2]
    print(red)
    
    p = img[78, 125]
    print(p)   # B, G, R

2. 修改畫素

# 灰度影像(numpy陣列操作)
範例:
    print(img[88, 99])
    img[88, 99] = 255
    print(img[88, 99])

第4課:使用numpy進行畫素操作

1. 讀取畫素

返回值 = 影像.item(位置引數)
灰度影像,返回灰度值。
BGR影像,返回值為BGR的值
範例:
    p = img.item(78, 125)
    print(p)
    
  	blue = img.item(78, 125, 0)
    green = img.item(78, 125, 1)
    red = img.item(78, 125, 2)

2. 修改畫素

灰度影像
範例:
    img.itemset((88, 99), 255)
    print(img.item(88, 99))
    img.itemset((88, 99), 255)
    print(img.item(88, 99))
    
BGR影像
範例:
    img.itemset((88, 99, 0), 255)
    img.itemset((88, 99, 1), 255)
    img.itemset((88, 99, 2), 255)
    

第5課:獲取影像屬性

1. 形狀:行、列、通道數

shape可以獲取影像的形狀,返回包含行數,列數,通道數的元組
灰度:返回行數、列數
彩色:返回行數、列數、通道數
範例:
    import cv2
    img1 = cv2.imread('灰度影像')
    print(img1.shape)  # (512, 512)
    
    import cv2
    img2 = cv2.imread('彩色影像')
    print(img2.shape)  # (512,512,3)
    

2. 畫素數目

size可以獲取影像的畫素數目。
灰度: 返回行數*列數
彩色: 返回行數*列數*通道數
範例:
    import cv2
    img = cv2.imread('影像名')
    print(img.size)  # 352353

3. 獲取影像型別

dtype返回的是影像的資料型別
範例:
    import cv2
    img = cv2.imread('影像名稱')
    print(img.dtype)  # uint8

第6課:影像ROI

1. ROI(region of interest),感興趣區域

import cv2
img = cv2.imread('影像名稱')
face = img[200:400, 200:400]
OpenCV影像處理學習筆記-Day1
import cv2
img = cv2.imread('影像名稱')
face = img[200:400, 200:400]
img[200:400, 600:800] = face

image-20200928133639473

image-20200928134307279

image-20200928134342014

image-20200928134411357

第7課:通道的拆分與合併

1. 拆分通道

import cv2
img = cv2.imread('image_dir')
b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]
import cv2
img = cv2.imread('image_dir')
b, g, r = img.split(img)  # 拆分通道
cv2.imshow('B', b)
cv2.imshow('G', g)
cv2.imshow('R', r)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 合併通道

import cv2
img = cv2.imread('image_dir')
b, g, r = cv2.split(a)
m = cv2.merge([b, g, r])  # 合併通道
cv2.imshow('merge', m)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意:拆分的順序與合併的順序一定要相同,否則圖片將要不正確

import cv2
img = cv2.imread('image_dir')
b, g, r = cv2.split(img)
bgr = cv2.merge([b, g, r])
rgb = cv2.merge([r, g, b])  # 產生錯誤圖片
cv2.imshow('bgr', bgr)
cv2.imshow('rgb', rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()
image-20200928135559068

image-20200928140055414

image-20200928140120563

image-20200928140205187

第8課:影像加法

1. numpy加法

image-20200928153928937

image-20200928153942923

2. OpenCV加法

image-20200928154020615

image-20200928154034443

注意的問題

參與運算的影像大小、型別必須一致

3. 程式碼例項

import cv2


img = cv2.imread('image_dir')
img_ = img
result1 = img + img_
result2 = cv2.add(img, img_)

cv2.imshow('original', img)
cv2.imshow('result1', result1)
cv2.imshow('result2', result2)

cv2.waitKey(0)
cv2.destroyAllWindows()

第9課:影像融合

  • 將2張或2張以上的影像資訊的融合到1張影像上
  • 融合的影像含有更多的資訊、能夠更方便人來觀察或者計算機處理

1. 介紹

image-20200928155156463

影像加法

結果影像 = 影像1 + 影像2

img = img1 + img2

影像融合

結果影像 = 影像1 * 係數1 + 影像2 * 係數2 + 亮度調節量

img = img1 * 0.3 + img2 * 0.7 + 18

image-20200928155459698

image-20200928155523562

2. 程式碼實現

import cv2


img1 = cv2.imread('image_dir')
img2 = cv2.imread('image_dir')

result = cv2.addWeighted(img1, 1, img2, 1, 0)
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('result', result)

cv2.waitKey(0)
cv2.destroyAllWindows()

第10課:型別轉換

OpenCV提供了200多種不同的型別轉換。

cv2.COLOR_BGR2GRAY

cv2.COLOR_BGR2RGB

cv2.COLOR_GRAY2BGR

import cv2


img = cv2.imread('image_dir')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # BGR轉灰度圖
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # BGR影像轉RGB影像


cv2.imshow('lenaColor', img)
cv2.imshow('lenaGray', img_gray)

cv2.waitKey(0)
cv2.destroyAllWindows()

第11課:影像縮放

1. 影像縮放-resize函式

語法格式

dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

src:原始影像

dsize:縮放大小

b = cv2.resize(a, (122, 122))

fx, fy:縮放大小

b = cv2.resize(a, None, fx=0.5, fy=0.7)

注意dsize; fx, fy設定一個即可

import cv2


img = cv2.imread('image_dir')
rows, cols = img.shape[:2]
img_resized = cv2.resize(img, (200, 100))  # (col, row), (寬, 高)
# cv2.resize(img, (round(cols*0.5), round(rows*1.2)))

# cv2.resize(img, None, fx=1.2, fy=0.5)  # (row, col), (高, 寬)

cv2.imshow('original', img)
cv2.imshow('resized', img_resized)

cv2.waitKey(0)
cv2.destroyAllWindows()

第11課:影像翻轉

1. 影像翻轉-flip函式

語法

dst = cv2.flip(src, flipCode)

範例:

dst = cv2.flip(src, 1)

cv2.flip(a, 0)

image-20200928223945950

image-20200928224023654

image-20200928224059610

相關文章