python版OpenCV常用api調(diào)用

記錄下: https://blog.csdn.net/JsonD/article/details/84983702

以下所有操作都基于這三個庫:

import cv2 
import numpy as np 
import matplotlib.pylab as plt

1、圖片讀取

img=cv2.imread('image/lenacolor.png',cv2.IMREAD_UNCHANGED)

原圖展示
cv2.IMREAD_UNCHANGED

灰度圖展示
cv2.IMREAD_GRAYSCALE

彩色圖展示
cv2.IMREAD_COLOR

2、圖片保存

cv2.imwrite('image/gray_test.jpg',img)

3拖云、圖片展示

cv2.imshow('original',img)

4湾碎、圖片暫停展示

##num<0 按鍵輸入消失
##num==0 或不填系數(shù) 剩辟,一直不消失
##num>0 停滯num秒 
cv2.waitKey(num)

5沫浆、 關(guān)閉所有窗口

cv2.destroyAllWindows()

6、圖像賦值

1)基本操作

img[100,100]=255 #灰度圖賦值 
img[100,100,0]=255 #彩色圖單通道賦值 
img[100,100]=[255,255,255] #彩色圖多通道賦值

2)numpy操作

img.item(100, 100, 2) #獲得(100,100)點崇败,2通道的值 
img.itemset((100, 100, 2), 255) #設(shè)置(100,100)點2通道的值

7、獲取圖像屬性

##獲取BGR圖 高肩祥、寬僚匆、深度 
h,w搭幻,d=img.shape
##獲得圖片大小 h*w 或 h*w*d 
img_size=img.size
##獲得圖片數(shù)據(jù)類型 
img.dtype

8、感興趣區(qū)域ROI (region of interest)

##獲得面部圖像 
face= img[220:400, 250:350]
##粘貼臉部圖像逞盆,可以跨圖粘貼 
img[0:180, 0:100]=face

9檀蹋、通道分解合并

##通道分解方案1 
b=img[:,:,0] 
g=img[:,:,1] 
r=img[:,:,2]
##通道分解方案2 
b,g,r=cv2.split(img)
##通道合并 
rgb=cv2.merge([r,g,b])
##只顯示藍(lán)色通道 
b=cv2.split(a)[0] 
g = np.zeros((rows,cols),dtype=a.dtype) 
r = np.zeros((rows,cols),dtype=a.dtype) 
m=cv2.merge([b,g,r])

10、圖像加法

##超過255則為0 
result1= img1 + img2
##超過255則為255 
result2=cv2.add(img1, img2)
##圖像帶權(quán)重融合云芦,第5個參數(shù)為偏移量 
result=cv2.addWeighted(img1,0.5,img2,0.5, 0)

11俯逾、圖像類型轉(zhuǎn)換

##彩色圖轉(zhuǎn)灰度圖 
img2=cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
##BGR圖轉(zhuǎn)RGB圖(重點:opencv的通道是 藍(lán)、綠舅逸、紅跟計算機(jī)常用的紅桌肴、綠、藍(lán)通道相反) 
img2=cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
##灰度圖轉(zhuǎn)BGR圖,每個通道都是之前的灰度值 
img2=cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)

12琉历、圖像縮放 (寬坠七、高)

##圖片縮放->(200,100) 
img2=cv2.resize(img1, (200, 100))
##按比例縮放->(0.5,1.2) 
img2=cv2.resize(img1, (round(cols * 0.5), round(rows * 1.2)))
##按比例縮放,參數(shù)版 
img2=cv2.resize(img1, None, fx=1.2, fy=0.5)

13旗笔、圖像翻轉(zhuǎn)

img2=cv2.flip(img1, 0) #上下翻轉(zhuǎn) 
img2=cv2.flip(img1, 1) #左右翻轉(zhuǎn) 
img2=cv2.flip(img1, -1) #上下彪置、左右翻轉(zhuǎn)

14、圖像移動蝇恶、旋轉(zhuǎn)拳魁、縮放

##圖像移動=>(100,200) 
M = np.float32([[1, 0, 100], [0, 1, 200]]) 
b=cv2.warpAffine(img1, M, (height, width))
##圖像中心、旋轉(zhuǎn)45度撮弧、縮放0.6 M=cv2.getRotationMatrix2D((height/2,width/2),45,0.6) 
img2=cv2.warpAffine(img1, M, (height, width))
##圖像菱形轉(zhuǎn)換 
p1=np.float32([[0,0],[cols-1,0],[0,rows-1]]) #左上角潘懊、右上角、左下角 
p2=np.float32([[0,rows*0.33],[cols*0.85,rows*0.25],[cols*0.15,rows*0.7]]) 
M=cv2.getAffineTransform(p1,p2) dst=cv2.warpAffine(img,M,(cols,rows))

15贿衍、圖像閾值轉(zhuǎn)換 授舟、二值化

r,b=cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) #圖像二值化,閾值127,r為返回閾值舌厨,b為二值圖 
r,b=cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) #圖像反二值化 
r,b=cv2.threshold(img,127,255,cv2.THRESH_TOZERO) #低于threshold則為0 
r,b=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV) #高于threshold則為0 
r,b=cv2.threshold(img,127,255,cv2.THRESH_TRUNC) #截斷=>高于threshold則為threshold

16岂却、圖像平滑處理

##均值濾波 
img2=cv2.blur(img1, (5, 5))  #sum(square)/25
##normalize=1 均值濾波,normalize=0 區(qū)域內(nèi)像素求和 
img1=cv2.boxFilter(img, -1, (2, 2), normalize=1)
##高斯濾波,第三個參數(shù)是方差,默認(rèn)0計算公式: sigmaX=sigmaxY=0.3((ksize-1)*0.5-1)+0.8 (注:卷積核只能是奇數(shù)) 
img1=cv2.GaussianBlur(img, (3, 3), 0)  #距離像素中心點近的權(quán)重較大,以高斯方式往四周分布
##中值濾波,效果非常好?
img1=cv2.medianBlur(img,3)  #獲得中心點附近像素排序后的中值

17、形態(tài)學(xué)操作

##圖像腐蝕躏哩,k為全1卷積核 
k=np.ones((5,5),np.uint8) 
img1=cv2.erode(img, k, iterations=2)
##圖像膨脹 
k=np.ones((5,5),np.uint8) 
img1=cv2.dilate(img, k, iterations=2)
##圖像開運算 (先腐蝕后膨脹)署浩,去掉圖形外側(cè)噪點 
k=np.ones((5,5),np.uint8) 
img1=cv2.morphologyEx(img, cv2.MORPH_OPEN, k, iterations=2)
##圖像閉運算(先膨脹后腐蝕) ,去掉圖形內(nèi)側(cè)噪點 
k=np.ones((5,5),np.uint8) 
img1=cv2.morphologyEx(img, cv2.MORPH_CLOSE, k, iterations=2)
##圖像梯度運算(膨脹-腐蝕) 
k=np.ones((5,5),np.uint8) 
img1=cv2.morphologyEx(img, cv2.MORPH_GRADIENT, k)
##高帽運算 (原圖-開運算)扫尺,獲得圖形外噪點 
k=np.ones((5,5),np.uint8) 
img1=cv2.morphologyEx(img, cv2.MORPH_TOPHAT, k)
##黑帽運算(閉運算-原圖)筋栋,獲得圖像內(nèi)噪點 
k=np.ones((10,10),np.uint8) 
img1=cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, k)

18、圖像梯度正驻,邊緣提取

##sobel梯度邊緣提取弊攘,卷積核豎向[[-1,-2,-1][0,0,0][1,2,1]]  
sobelx = cv2.Sobel(o,cv2.CV_64F,1,0,ksize=3) #橫向邊緣提取 
sobely = cv2.Sobel(o,cv2.CV_64F,0,1,ksize=3) #豎向邊緣提取 
sobelx = cv2.convertScaleAbs(sobelx) # 負(fù)值取正,圖像展示只能有正值 
sobely = cv2.convertScaleAbs(sobely) 
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) #圖像融合
##scharr梯度邊緣提取姑曙,卷積核豎向[[-3,-10,-3][0,0,0][3,10,3]] 襟交,scharr比sobel卷積核過濾出更多細(xì)節(jié) 
scharrx = cv2.Scharr(o,cv2.CV_64F,1,0) 
scharry = cv2.Scharr(o,cv2.CV_64F,0,1) 
scharrx = cv2.convertScaleAbs(scharrx) # 負(fù)值取正 
scharry = cv2.convertScaleAbs(scharry) 
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0) #圖像融合
## 拉普拉斯梯度,邊緣提取版本1 , 拉普拉斯圖像梯度 [[0,1,0][1,-4,1][0,1,0] ] 
img1 = cv2.Laplacian(img, cv2.CV_64F) 
img1 = cv2.convertScaleAbs(img1)
##拉普拉斯梯度,邊緣提取版本2,結(jié)果略有不同 
f=np.array([[0,1,0],[1,-4,1],[0,1,0]]) 
img1=cv2.filter2D(img, -1, f)

19伤靠、canny邊緣檢測

canny邊緣檢測理論

                                               sobel梯度大械酚颉:0.5|x|+0.5|y|

         高斯濾波                             梯度方向:arctan\(y/x\)                       同方向上保留最大梯度              

去噪------------------------->梯度------------------------------------->非極大值抑制---------------------------->

         跟高閾值連通的線會保留

滯后閾值--------------------->out
##canny邊緣檢測代碼 
img1 = cv2.Canny(img,100,200) #參數(shù):圖片、低閾值宴合、高閾值

20焕梅、圖像金字塔

##圖片向下采樣,高斯濾波 1/2 刪掉偶數(shù)列 
img1 = cv2.pyrDown(img)
##圖片向上采樣 卦洽,面積*2 高斯濾波*4 贞言,下采樣為不可逆運算 
img3=cv2.pyrUp(img2)
##計算拉普拉斯金字塔 
img1 = cv2.pyrDown(img) #下采樣 
img2=cv2.pyrUp(img1) #上采樣 
img3=img-img2

21、圖像輪廓標(biāo)注

gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度圖轉(zhuǎn)化 
dep,img_bin=cv2.threshold(gray_img,128,255,cv2.THRESH_BINARY) #二值圖轉(zhuǎn)化 
image_,contours,hierarchy=cv2.findContours(img_bin, mode=cv2.RETR_TREE,  method=cv2.CHAIN_APPROX_SIMPLE) #獲得圖像輪廓 
to_write=img.copy() #原始圖像copy阀蒂,否則會在原圖上繪制 
ret=cv2.drawContours(to_write,contours,-1,(0,0,255),2) #紅筆繪制圖像輪廓

22该窗、直方圖

##matplotlib 繪制直方圖 
plt.hist(img.ravel(),256)
##用opencv計算直方圖列表 
hist=cv2.calcHist(images= [img],channels=[0],mask=None,histSize=[256],ranges=[0,255])
##掩膜提取局部直方圖 
pad=np.zeros(img.shape,np.uint8) 
pad[200:400,200:400]=255 hist_MASK=cv2.calcHist(images= [img],channels=[0],mask=pad,histSize=[256],ranges=[0,255])
##opencv 交、并蚤霞、補挪捕、異或操作 
masked_img=cv2.bitwise_and(img,mask)

直方圖均衡化原理

圖像直方圖->直方圖歸一化->累計直方圖->*255 x坐標(biāo)映射->對原來的像素值進(jìn)行新像素值編碼

##直方圖均衡化調(diào)用 
img1=cv2.equalizeHist(img)
##matplotlib繪制圖片前通道轉(zhuǎn)換 
img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #通道不一致性
##matplotlib多圖繪制在一個面板上 
plt.subplot('221'),plt.imshow(img,cmap=plt.cm.gray),plt.axis('off'),plt.title('original') 
plt.subplot('222'), plt.imshow(img1, cmap=plt.cm.gray), plt.axis('off') 
plt.subplot('223'), plt.hist(img.ravel(),256) plt.subplot('224'), plt.hist(img1.ravel(), 256)

23、圖像傅里葉變換(空間域=>頻域)

##圖像傅里葉變換 (轉(zhuǎn)化為虛數(shù)争便,實部為幅度级零,虛部為頻率) 
fft=np.fft.fft2(img) 
fft_center=np.fft.fftshift(fft) 
fft_flect=20*np.log(np.abs(fft_center))
##圖像傅里葉逆變換 
fft_left=np.fft.ifftshift(fft_center) 
ifft=np.fft.ifft2(fft_left) 
img_f=np.abs(ifft)
##高通濾波 
h_c,w_c=round(h/2),round(w/2) 
fft_center[h_c-10:h_c+10,w_c-10:w_c+10]=0  #原圖操作,低頻信號歸0
##opencv 傅里葉變換 
dft=cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT) 
fft_center=np.fft.fftshift(dft)
##opencv 低通濾波 
mask=np.zeros((h,w,2),dtype=np.uint8)    #定義掩膜 
h_c,w_c=round(h/2),round(w/2) R=20 
mask[h_c-R:h_c+R,w_c-R:w_c+R]=1 
dshift=fft_center*mask       #點乘滞乙,保留低頻信號
##opencv 傅里葉反變換 
fft_left=np.fft.ifftshift(dshift) 
ifft=cv2.idft(fft_left) 
img_f=cv2.magnitude(ifft[:,:,0],ifft[:,:,1]) #Square(x*2+y*2)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奏纪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斩启,更是在濱河造成了極大的恐慌序调,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔簇,死亡現(xiàn)場離奇詭異发绢,居然都是意外死亡硬耍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門边酒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來经柴,“玉大人,你說我怎么就攤上這事墩朦∨魅希” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵氓涣,是天一觀的道長牛哺。 經(jīng)常有香客問我,道長劳吠,這世上最難降的妖魔是什么引润? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮痒玩,結(jié)果婚禮上椰拒,老公的妹妹穿的比我還像新娘。我一直安慰自己凰荚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布褒脯。 她就那樣靜靜地躺著便瑟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪番川。 梳的紋絲不亂的頭發(fā)上到涂,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音颁督,去河邊找鬼践啄。 笑死,一個胖子當(dāng)著我的面吹牛沉御,可吹牛的內(nèi)容都是我干的屿讽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吠裆,長吁一口氣:“原來是場噩夢啊……” “哼伐谈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起试疙,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤渺鹦,失蹤者是張志新(化名)和其女友劉穎帕膜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年览绿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡柄冲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出储耐,到底是詐尸還是另有隱情羊初,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布什湘,位于F島的核電站长赞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏闽撤。R本人自食惡果不足惜得哆,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哟旗。 院中可真熱鬧贩据,春花似錦、人聲如沸闸餐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舍沙。三九已至近上,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拂铡,已是汗流浹背壹无。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留感帅,地道東北人斗锭。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像失球,于是被迫代替她去往敵國和親岖是。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容