【图像处理opencv】_图像基础
目錄
0 程序環境與所學函數
1 自定義圖像
2 三種常見圖像相互轉換
3 通道分離與合并
4 兩圖像的加減乘除
5 圖像線性變換和非線性變換
?6 圖像融合
0 程序環境與所學函數
本章程序運行需要導入下面三個庫,并定義了一個顯示圖像的函數
import cv2 as cv import numpy as np import matplotlib.pyplot as pltdef show(img):if img.ndim == 2:plt.imshow(img, cmap='gray')else:plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))plt.show()所學函數
## 1. 圖像讀取
img = cv.imread()
## 2. 彩色圖轉灰度圖
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
## 3. 二值化圖像(灰度圖轉二值圖)
_, img_bin = cv.threshold(img_gray, th1, th2, cv.THRESH_BINARY)
## 4. 保存圖像
cv.imwrite('pic/bear_gray.jpg', img_gray)
## 5. 通道分離
b, g, r = cv.split(img)
## 6. 通道合并
img_new = cv.merge([b, g, r])
## 7. 兩圖像相加、相減、相乘、相除
img = cv.add(img1, img2)
img = cv.subtract(img1, img2)
img = cv.multiply(img1, img2)
img = cv.divide(img1, img2)
1 自定義圖像
二值圖:只有兩種取值。
對于計算機來說,圖像是一個個數組,數組里面一個數字代表一個像素,0表示黑色,1表示白色
灰度圖:對應于一個二維數組,8位灰度圖,每個像素有256種取值
真彩色:對應于一個三維數組,(x,y,3)---3表示rgb三通道,r,g,b通道各有8位
假彩色:8位表示256種顏色
程序參考:
b = np.array([[0, 127, 255],[255, 0, 255],[10, 50, 100] ], dtype=np.uint8)g = b.T r = b - g# show(b) show(cv.merge([b, g, r]))# cv.imwrite()2 三種常見圖像相互轉換
# 讀取彩色圖 img = cv.imread('pic/bear500x333.jpg') # print(img) show(img)# 讀取灰度圖 # img_gray = cv.imread('pic/cat200x192.jpg', 0) img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) show(img_gray)# 二值化圖像thresh= 125 #自定義一個閾值 gray4[gray4 > thresh] = 255 # 表示gray4中大于閾值的點都賦值為255 gray4[gray4 <= thresh] = 0 # 表示gray4中小于閾值的點都賦值為0 show(gray4)_, img_bin = cv.threshold(img_gray, 150, 255, cv.THRESH_BINARY) #函數表示將灰度圖轉化為二值圖,將圖像數組中小于150的值變成0,將值高于150的值變成255,前面有返回值,可以設為ignore show(img_bin)# 保存圖像 cv.imwrite('pic/bear_gray.jpg', img_gray) cv.imwrite('pic/bear_bin.jpg', img_bin)3 通道分離與合并
# 分離BGR通道 # r = img[:,:,0] b, g, r = cv.split(img) # b.shape show(r)# 合并BGR通道 img_new = cv.merge([b, g, r]) show(img_new)# rgb轉灰度圖 img_gray2 = 0.114*b + 0.587*g + 0.299*r # img_gray2 = (0.299*r + 0.587*g + 0.114*b).astype(np.uint8) show(img_gray2)4 兩圖像的加減乘除
讀入兩幅圖像
bg = cv.imread('pic/line500x500.jpg', 0) ob = cv.imread('pic/hedgehog500x500.jpg', 0)show(np.hstack([bg, ob]))顯示如下:
?圖像相加:混合圖像,添加噪聲
# 圖像相加 # img_add = cv.add(bg*0.5, ob*0.5) img_add = bg * 0.5 + ob * 0.5 show(img_add)#img = cv.addWeighted(img1, alpha, img2, beta, gamma) img_add2= cv.addWeighted(obj,0.5,bg,0.5,0) #會轉換圖像數據類型為uint8型而cv.add()不會 show(img_add2)如果不添加權重,兩幅圖相加,數值可能會大于255,進入循環成其他數值,造成與預期不符,添加權重后則不會出現這種情況。
?顯示結果
?圖像相減:消除背景、差影法(比較差異、運動跟蹤)
#圖像減法 img_sub = (img_add - bg*0.5)*2 # *2之后恢復成原來的前景圖 #img_sub = np.uint8((img_add-bg*0.5)*2) 強制轉換為無符號8整型 img_sub2 = cv.subtract(img_add,bg*0.5)show(np.hstack([img_sub,img_sub2]))顯示結果
圖像相乘:掩膜
# 圖像乘法 mask = mask/255 #這一行只能運行一次,如果多此運行則會不斷迭代相除,造成與預期不符發生 img_nul = obj * mask img_mul2 = cv.multiply(obj*1.0,mask) #這個函數只能對同類型數組進行操作,轉化為浮點數 show(np.hstack([mask,obj,img_mul,img_mul2]))顯示結果
圖像相除:校正設備、比較差異
#除法 #img_div = obj / noise img_div = obj / (np.float64(noise)+1) #避免了除0的情況 #img_div2 = cv.divide(obj,noise) img_div2 = cv.divide(obj,noise+1) show(np.hstack([obj,noise,img_div,img_div2]))顯示結果
5 圖像線性變換和非線性變換
原理:
?先讀入一幅灰度圖像并顯示其類型
img = cv.imread('pic/cat500x480.jpg',0) # 0表示讀取灰度圖 show(img) img.dtype顯示結果:圖像數組內值為8位無符號整型
?先按照下面線性函數定義顯示以下
b = 20 k = 2 img2 = b + k * imgshow(img2)顯示結果:
我們運行不會得到自己想要的結果,因為是無符號八位的,經過線性變換后,可能超過255,會循環成一些我們不希望出現的值。做如下改進:
#改進: b = 20 k = 2 img2 = b + k * img.astype(np.int32) # astype 按照類型 np.int32型 img2 = np.clip(img2,0,255) #截斷函數,小于等于0的變成0,大于等于255的變成255 show(img2)?opencv里面函數實現 :img= cv.convertScaleAbs(img,alpha=1,beta=0),這個函數將數組內小于等于0的值變為0,大于等于255的值變為255,s=b+kr,alpha相當于k,beta相當于b,程序如下
img3 = cv.convertScaleAbs(img,alpha=2,beta=3) show(img3)結果顯示:
非線性變換---對數變換
img4 = 10 + np.log(img.astype(np.float32)+1)/0.1 #防止出現除0的情況出現show(img4)結果顯示
?非線性變換---指數變換(伽馬變換)
img01 = img / 255 #每運行一次就會更改一次,這一行運行一次就好,不然會與預期不符img05 = np.power(img01,0.5)*255 img15 = np.power(img01,1.5)*255show(np.hstack([img05,img,img15]))結果顯示:指數小于1的圖像變亮,指數大于1的圖像變暗,與原理圖示相符合。
6 圖像融合
讀取圖像并顯示:
A = cv.imread('pic/petal500x500.jpg') B = cv.imread('pic/hedgehog500x500.jpg') M = cv.imread('pic/mask500x500.jpg')show(np.hstack([A,B,M]))顯示
相關操作
M = M/255 #注意,這行程序只能運行一遍,多次運行造成與預期不符 As = A * (1 - M) Bs =B * Mshow(np.uint8(np.hstack([As,Bs])))結果顯示:
?進行融合
nice = cv.add(As,Bs*0.8) show(nice.astype(np.uint8))最終融合結果
?
總結
以上是生活随笔為你收集整理的【图像处理opencv】_图像基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【图像处理opencv】_简单绘图
- 下一篇: 【图像处理opencv】_图像几何变换