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. 基本概念
影像是由畫素構成的
影像分類:
- 二值影像
- 灰度影像
- RGB影像
二值影像的畫素點只能是0,1
灰度影像的畫素點是0-255,0為純黑,255為純白,區間內都是灰色
RGB影像(3通道,在OpenCV為BGR)
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]
import cv2
img = cv2.imread('影像名稱')
face = img[200:400, 200:400]
img[200:400, 600:800] = face
第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()
第8課:影像加法
1. numpy加法
2. OpenCV加法
注意的問題
參與運算的影像大小、型別必須一致
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. 介紹
影像加法
結果影像 = 影像1 + 影像2
img = img1 + img2
影像融合
結果影像 = 影像1 * 係數1 + 影像2 * 係數2 + 亮度調節量
img = img1 * 0.3 + img2 * 0.7 + 18
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)