Python?OpenCV的基本使用及相關(guān)函數(shù)
Python-OpenCV環(huán)境的配置看上一篇OpenCV環(huán)境的配置
本篇主要介紹一下OpenCV的基本使用和相關(guān)函數(shù)的介紹。
以下所有操作都基于這三個(gè)庫(kù):
import cv2
import numpy as np
import matplotlib.pylab as plt
原圖
1、圖像的讀取
import cv2 img = cv2.imread('文件路徑'[,cv2.IMREAD_UNCHANGED]) # 其他參數(shù) # 以原圖讀取 -cv2.IMREAD_UNCHANGED-默認(rèn) # 以灰度圖讀取 -cv2.IMREAD_GRAYSCALE # 以彩色圖讀取 -cv2.IMREAD_COLOR
2、圖像保存
import cv2 cv2.imwrite('image/gray_test.jpg',img)
3、圖像展示
(1)使用OpenCV自帶的顯示函數(shù)
import cv2 # 可以決定窗口是否可以調(diào)整大小。 # cv2.namedWindow('image', cv2.WINDOW_NORMAL) # 特殊情況 cv2.imshow('顯示窗口的名字',img) cv2.waitKey(0) cv2.destroyAllWindows() # 關(guān)閉所有窗口 ''' cv2.waitKey(num)函數(shù)的參數(shù)介紹 num<0 按鍵輸入消失 num==0 或不填系數(shù) ,一直不消失 num>0 停滯num秒 '''
(2)使用matplotlib庫(kù)實(shí)現(xiàn)
不能直接用matplotlib去顯示opencv讀取的圖像,因?yàn)閛pencv讀取的圖像的通道順序是[B,G,R],而matplotlib顯示圖像時(shí)圖像的通道順序是[R,G,B]。
解決辦法
import cv2 img = cv2.imread('文件路徑') # 第一種方法 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 第二種方法 # b, g, r = cv2.split(img) # img = cv2.merge([r, g, b])
顯示圖像
import cv2 matplotlib.pyplot as plt img = cv2.imread('文件路徑') img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.rcParams['font.sans-serif'] = ['FangSong'] # 支持中文標(biāo)簽 # (2,2,1)表示一共可顯示2行2列4個(gè)圖像,1表示第一個(gè)圖像 plt.subplot(2,2,1), plt.title("圖1") # plt.axis('off') 關(guān)閉坐標(biāo)軸 plt.imshow(img) # 還可以添加一個(gè)參數(shù)cmap='gray' plt.subplot(2,2,2), plt.title("圖2") plt.imshow(img) plt.subplot(2,2,3), plt.title("圖3"), plt.imshow(img) plt.subplot(2,2,4), plt.title("圖4"), plt.imshow(img) plt.show()
(3)拼接圖像并顯示
import cv2 import numpy as np # 拼接多個(gè)圖片并顯示 img1 = cv2.imread("1.jpg",cv2.IMREAD_UNCHANGED) img2 = cv2.imread("2.jpg",cv2.IMREAD_UNCHANGED) # 需要將兩圖片的大小改為一致 # heigh = img1.shape[0] # 高 # width = img1.shape[1] # 寬 img2 = cv2.resize(img2,(img1.shape[1],img1.shape[0])) res = np.hstack((img1,img2,img2)) # 水平連接 # np.vstack((img1,img2,img2)) # 豎直連接 cv2.imshow('res',res) cv2.waitKey(0) cv2.destroyAllWindows()
4、獲取圖像屬性
# 獲取BGR圖的高、寬 heigh = img.shape[0] # 高 width = img.shape[1] # 寬 # 獲取BGR圖的高、寬、深度 h,w,d = img.shape # 獲得圖片大小 h*w 或 h*w*d img_size = img.size # 獲得圖片數(shù)據(jù)類型 img.dtype
5、圖像縮放(寬,高)
# 圖片縮放->(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)
6、在原圖像中獲取某一區(qū)域
# 獲取區(qū)域在原圖中的四個(gè)點(diǎn)的位置(x1,y1)(x2,y1)(x1,y2)(x2,y2) # 圖像高度不變,切割寬度,原圖上開始橫坐標(biāo)-->原圖上結(jié)束橫坐標(biāo) # img_x_y = img[高:高,寬:寬] img_x_y_1 = img[ : , x1(開始橫坐標(biāo)):x2(結(jié)束橫坐標(biāo))] # 圖像寬度不變,切割高度,原圖上開始縱坐標(biāo)-->原圖上結(jié)束縱坐標(biāo) img_x_y_2 = img[y1(開始縱坐標(biāo)):y2(結(jié)束縱坐標(biāo)), : ] # 獲取具體位置 img_x_y = img[y1(開始縱坐標(biāo)):y2(結(jié)束縱坐標(biāo)),x1(開始橫坐標(biāo)):x2(結(jié)束橫坐標(biāo))]
例如:
import cv2 path = 'C:\\Users\\lenovo\\Desktop\\demo.jpg' img = cv2.imread(path) img_1 = img[100:600,200:500] cv2.imshow('1',img_1) cv2.waitKey(0) cv2.destroyAllWindows()
7、彩色圖像通道分解
# 通道分解方案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])
8、圖像加法
# 超過(guò)255則為0 result1 = img1 + img2 # 超過(guò)255則為255 result2 = cv2.add(img1, img2) # 圖像帶權(quán)重融合,第5個(gè)參數(shù)為偏移量 result = cv2.addWeighted(img1,0.5,img2,0.5, 0)
9、圖像反轉(zhuǎn)
img2 = cv2.flip(img1, 0) #上下翻轉(zhuǎn) img2 = cv2.flip(img1, 1) #左右翻轉(zhuǎn) img2 = cv2.flip(img1, -1) #上下、左右翻轉(zhuǎn)
10、圖像金字塔
# 圖片向下采樣,高斯濾波 1/2 刪掉偶數(shù)列 img1 = cv2.pyrDown(img) # 圖片向上采樣 ,面積*2 高斯濾波*4 ,下采樣為不可逆運(yùn)算 img3 = cv2.pyrUp(img2) # 計(jì)算拉普拉斯金字塔 img1 = cv2.pyrDown(img) #下采樣 img2 = cv2.pyrUp(img1) #上采樣 img3 = img-img2
11、直方圖
##matplotlib 繪制直方圖 plt.hist(img.ravel(),256) ##用opencv計(jì)算直方圖列表 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 交、并、補(bǔ)、異或操作 masked_img = cv2.bitwise_and(img,mask) ##直方圖均衡化原理 # 圖像直方圖->直方圖歸一化->累計(jì)直方圖->*255 # x坐標(biāo)映射->對(duì)原來(lái)的像素值進(jìn)行新像素值編碼 # 直方圖均衡化調(diào)用 img1 = cv2.equalizeHist(img) # matplotlib繪制圖片前通道轉(zhuǎn)換 img_rgb = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #通道不一致性 ##matplotlib多圖繪制在一個(gè)面板上 plt.subplot('2,2,1'),plt.imshow(img,cmap=plt.cm.gray),plt.axis('off'),plt.title('original') plt.subplot('2,2,2'), plt.imshow(img1, cmap = plt.cm.gray), plt.axis('off') plt.subplot('2,2,3'), plt.hist(img.ravel(),256) plt.subplot('2,2,4'), plt.hist(img1.ravel(), 256)
12、圖像類型轉(zhuǎn)換
# 彩色圖轉(zhuǎn)灰度圖 img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) # BGR圖轉(zhuǎn)RGB圖(重點(diǎn):opencv的通道是 藍(lán)、綠、紅跟計(jì)算機(jī)常用的紅、綠、藍(lán)通道相反) img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB) # 灰度圖轉(zhuǎn)BGR圖,每個(gè)通道都是之前的灰度值 img2 = cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)
13、圖像閾值轉(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) #截?cái)?>高于threshold則為threshold
14、圖像平滑處理
# 均值濾波 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) # 高斯濾波,第三個(gè)參數(shù)是方差,默認(rèn)0計(jì)算公式: sigmaX=sigmaxY=0.3((ksize-1)*0.5-1)+0.8 (注:卷積核只能是奇數(shù)) img1 = cv2.GaussianBlur(img, (3, 3), 0) #距離像素中心點(diǎn)近的權(quán)重較大,以高斯方式往四周分布 # 中值濾波,效果非常好 img1 = cv2.medianBlur(img,3) #獲得中心點(diǎn)附近像素排序后的中值
15、圖像形態(tài)學(xué)操作
(1)圖像腐蝕,k為全為1的卷積核
k = np.ones((5,5),np.uint8) img1 = cv2.dilate(img, k, iterations=2)
(2)圖像膨脹
k = np.ones((5,5),np.uint8) img1 = cv2.dilate(img, k, iterations=2)
(3)圖像開運(yùn)算 (先腐蝕后膨脹),去掉圖形外側(cè)噪點(diǎn)
k = np.ones((5,5),np.uint8) img1 = cv2.morphologyEx(img, cv2.MORPH_OPEN, k, iterations=2)
(4)圖像閉運(yùn)算(先膨脹后腐蝕) ,去掉圖形內(nèi)側(cè)噪點(diǎn)
k = np.ones((5,5),np.uint8) img1 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, k, iterations=2)
# 高帽運(yùn)算 (原圖-開運(yùn)算),獲得圖形外噪點(diǎn) k=np.ones((5,5),np.uint8) img1 = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, k) # 黑帽運(yùn)算(閉運(yùn)算-原圖),獲得圖像內(nèi)噪點(diǎn) k = np.ones((10,10),np.uint8) img1 = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, k)
16、圖像梯度,邊緣檢測(cè)
import cv2 import matplotlib.pyplot as plt import numpy as np # 各種算子 img = cv2.imread('C:\\Users\\lenovo\\Desktop\\demo.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.GaussianBlur(img, (5, 5), 1) # 高斯平滑 img_median = cv2.medianBlur(img, 3) # 中值濾波 img_gray = cv2.cvtColor(img_median, cv2.COLOR_BGR2GRAY) # Roberts 算子 kernelx = np.array([[-1, 0], [0, 1]], dtype=int) kernely = np.array([[0, -1], [1, 0]], dtype=int) x = cv2.filter2D(img_gray, cv2.CV_16S, kernelx) y = cv2.filter2D(img_gray, cv2.CV_16S, kernely) absX = cv2.convertScaleAbs(x) absY = cv2.convertScaleAbs(y) Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0) plt.rcParams['font.sans-serif'] = ['FangSong'] # 支持中文標(biāo)簽 plt.subplot(2,2,1), plt.title("Roberts算子"), plt.axis('off') plt.imshow(Roberts,cmap='gray') # matplotlib 顯示彩色圖像(RGB格式) # Prewitt 算子 kernelx = np.array([[1,1,1],[0,0,0],[-1,-1,-1]],dtype=int) kernely = np.array([[-1,0,1],[-1,0,1],[-1,0,1]],dtype=int) x = cv2.filter2D(img_gray, cv2.CV_16S, kernelx) y = cv2.filter2D(img_gray, cv2.CV_16S, kernely) # 轉(zhuǎn) uint8 ,圖像融合 absX = cv2.convertScaleAbs(x) absY = cv2.convertScaleAbs(y) Prewitt = cv2.addWeighted(absX, 0.5, absY, 0.5, 0) plt.subplot(2,2,2), plt.title("Prewitt算子"), plt.axis('off') plt.imshow(Prewitt,cmap='gray') # matplotlib 顯示彩色圖像(RGB格式) #Sobel算子 # 梯度方向: x sobelx = cv2.Sobel(img_gray, cv2.CV_8U, 1, 0, ksize=3) sobely = cv2.Sobel(img_gray, cv2.CV_8U, 0, 1, ksize=3) sobel = cv2.addWeighted(sobelx,1,sobely,1,0) plt.subplot(2,2,3), plt.title("sobel算子"), plt.axis('off') plt.imshow(sobel,cmap='gray') # matplotlib 顯示彩色圖像(RGB格式) #canny算子 binary = cv2.Canny(img_gray, 100, 200) plt.subplot(2,2,4), plt.title("Canny算子"), plt.axis('off') plt.imshow(binary,cmap='gray') # matplotlib 顯示彩色圖像(RGB格式) # matplotlib 顯示彩色圖像(RGB格式) # img = cv2.imread("D:/test/26.png", 0) # Laplacian算子 # gray_lap = cv2.Laplacian(img, cv2.CV_16S, ksize=3) # dst = cv2.convertScaleAbs(gray_lap) # 轉(zhuǎn)回uint8 plt.show()
17、圖像輪廓標(biāo)注
gray_img = cv2.cvtColor(img_1,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_1.copy() #原始圖像copy,否則會(huì)在原圖上繪制 ret = cv2.drawContours(to_write,image_contours,-1,(0,0,255),2) #紅筆繪制圖像輪廓 plt.subplot(2,1,1),plt.imshow(ret,'gray') plt.show()
18、讀取視頻文件
# 數(shù)據(jù)讀取-視頻 # cv2.VideoCapture #可以捕獲攝像頭,用數(shù)字來(lái)控制不同的設(shè)備,例如0,1。 # 如果是視頻文件,直接指定好路徑即可 vc = cv2.VideoCapture("test. mp4") # 檢查是否打開正確 if vc.isOpened(): oepn, frame = vc.reado() else: open = False while open: ret, frame = vc.read () if frame is None: break if ret == True: gray = cv2. cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow("result", gray) if cv2.waitKey(10) & OxFF == 27: break vc.release() cv2.destroyAllWindows()
到此這篇關(guān)于Python-OpenCV的基本使用的文章就介紹到這了,更多相關(guān)Python OpenCV使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyQt5使用QTimer實(shí)現(xiàn)電子時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了PyQt5使用QTimer實(shí)現(xiàn)電子時(shí)鐘,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07python機(jī)器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)(二)
這篇文章主要為大家詳細(xì)介紹了python機(jī)器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)第二篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12python的簡(jiǎn)單四則運(yùn)算語(yǔ)法樹可視化
這篇文章主要介紹了python的簡(jiǎn)單四則運(yùn)算語(yǔ)法樹可視化,這篇文章的內(nèi)容也很簡(jiǎn)單,就是給定一個(gè)四則運(yùn)算的表達(dá)式,畫出它的語(yǔ)法樹,需要的朋友可以參考下2023-04-04詳解Appium+Python之生成html測(cè)試報(bào)告
這篇文章主要介紹了詳解Appium+Python之生成html測(cè)試報(bào)告,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01python公司內(nèi)項(xiàng)目對(duì)接釘釘審批流程的實(shí)現(xiàn)
最近把組內(nèi)的一個(gè)項(xiàng)目對(duì)接釘釘審批接口,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08python實(shí)現(xiàn)word文檔批量轉(zhuǎn)成自定義格式的excel文檔的思路及實(shí)例代碼
這篇文章主要介紹了python實(shí)現(xiàn)word文檔批量轉(zhuǎn)成自定義格式的excel文檔的解決思路及實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02