opencv 基本接口介紹


 

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

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、圖片暫停展示
cv2.waitKey(num)

##按鍵輸入消失

num<0

##0或不填系數 ,一直不消失

num==0

##停滯num秒

num>0

 

5、 關閉所有窗口
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) #設置(100,100)點2通道的值

 

7、獲取圖像屬性
##獲取BGR圖 高、寬、深度

h,w,d=img.shape

 

##獲得圖片大小 h*w 或 h*w*d

img_size=img.size

 

##獲得圖片數據類型

img.dtype

 

8、感興趣區域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])

 

##只顯示藍色通道

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)

 

##圖像帶權重融合,第5個參數為偏移量

result=cv2.addWeighted(img1,0.5,img2,0.5, 0)

 

11、圖像類型轉換
##彩色圖轉灰度圖

img2=cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)

 

##BGR圖轉RGB圖(重點:opencv的通道是 藍、綠、紅跟計算機常用的紅、綠、藍通道相反)

img2=cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)

 

##灰度圖轉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)))

 

##按比例縮放,參數版

img2=cv2.resize(img1, None, fx=1.2, fy=0.5)

 

13、圖像翻轉
img2=cv2.flip(img1, 0) #上下翻轉

img2=cv2.flip(img1, 1) #左右翻轉

img2=cv2.flip(img1, -1) #上下、左右翻轉

 

14、圖像移動、旋轉、縮放
##圖像移動=>(100,200)

M = np.float32([[1, 0, 100], [0, 1, 200]])

b=cv2.warpAffine(img1, M, (height, width))

 

##圖像中心、旋轉45度、縮放0.6

M=cv2.getRotationMatrix2D((height/2,width/2),45,0.6)

img2=cv2.warpAffine(img1, M, (height, width))

 

##圖像菱形轉換

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、圖像閾值轉換 、二值化
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(a,127,255,cv2.THRESH_BINARY) #低於threshold則為0

r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY_INV) #高於threshold則為0

r,b=cv2.threshold(a,127,255,cv2.THRESH_TRUNC) #截斷=>高於threshold則為threshold

 

16、圖像平滑處理
##均值濾波

img2=cv2.blur(img1, (5, 5))  #sum(square)/25

 

##normalize=1 均值濾波,normalize=0 區域內像素求和

img1=cv2.boxFilter(img, -1, (2, 2), normalize=1)

 

##高斯濾波,第三個參數是方差,默認0計算公式: sigmaX=sigmaxY=0.3((ksize-1)*0.5-1)+0.8 (注:卷積核只能是奇數)

img1=cv2.GaussianBlur(img, (3, 3), 0)  #距離像素中心點近的權重較大,以高斯方式往四周分布

 

##中值濾波,效果非常好?

img1=cv2.medianBlur(img,3)  #獲得中心點附近像素排序后的中值

 

17、形態學操作
##圖像腐蝕,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)

 

##圖像開運算 (先腐蝕后膨脹),去掉圖形外側噪點

k=np.ones((5,5),np.uint8)

img1=cv2.morphologyEx(img, cv2.MORPH_OPEN, k, iterations=2)

 

##圖像閉運算(先膨脹后腐蝕) ,去掉圖形內側噪點

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)

 

##黑帽運算(閉運算-原圖),獲得圖像內噪點

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) # 負值取正,圖像展示只能有正值

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卷積核過濾出更多細節

scharrx = cv2.Scharr(o,cv2.CV_64F,1,0)

scharry = cv2.Scharr(o,cv2.CV_64F,0,1)

scharrx = cv2.convertScaleAbs(scharrx) # 負值取正

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,結果略有不同

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) #參數:圖片、低閾值、高閾值

 

20、圖像金字塔
##圖片向下采樣,高斯濾波 1/2 刪掉偶數列

img1 = cv2.pyrDown(img)

 

##圖片向上采樣 ,面積*2 高斯濾波*4 ,下采樣為不可逆運算

img3=cv2.pyrUp(img2)

 

##計算拉普拉斯金字塔

img1 = cv2.pyrDown(img) #下采樣

img2=cv2.pyrUp(img1) #上采樣

img3=img-img2

 

21、圖像輪廓標注
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度圖轉化

dep,img_bin=cv2.threshold(gray_img,128,255,cv2.THRESH_BINARY) #二值圖轉化

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坐標映射->對原來的像素值進行新像素值編碼

 

##直方圖均衡化調用

img1=cv2.equalizeHist(img)

 

##matplotlib繪制圖片前通道轉換

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、圖像傅里葉變換(空間域=>頻域)
##圖像傅里葉變換 (轉化為虛數,實部為幅度,虛部為頻率)

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)
————————————————
版權聲明:本文為CSDN博主「黑暗騎士V」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/JsonD/article/details/84983702


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM