1 Opencv簡(jiǎn)介
Opencv是計(jì)算機(jī)視覺中經(jīng)典的專用庫(kù),其支持多語言,跨平臺(tái),功能強(qiáng)大。Opencv-Python為Opencv提供了Python接口,使得使用者在Python中能夠調(diào)用C/C++,在保證易讀性和運(yùn)行效率的前提下,實(shí)現(xiàn)所需的功能。
Opencv是由Gray Bradsky于1999年在英特爾創(chuàng)立,第一版于2000年問世。Vadim Pisarevsky加入Gary Bradsky,一起管理因特爾的俄羅斯軟件Opencv團(tuán)隊(duì)。
2005年,Opencv用于Stanley,該車贏得了2005年DARPA挑戰(zhàn)賽的冠軍。后來,在Willow Garage的支持下,它的積極發(fā)展得以繼續(xù),由Gary Bradsky和Vadim Pisarevsky領(lǐng)導(dǎo)了該項(xiàng)目。Opencv現(xiàn)在支持與計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)有關(guān)的多種算法,并且正在日益擴(kuò)展。
Opencv支持多種編程語言,例如C++, Python, Java等,并且可以再Windows , Linux , OS X , Android和IOS等不同平臺(tái)上使用。基于CUDA和OpenCL的高速GPU操作的接口也在積極開發(fā)中。
Opencv-Python是用于Opencv的Python API,結(jié)合了Opencv C++ API和Python語言的最佳特性。
1.1 Opencv-Python
Opencv-Python是旨在解決計(jì)算機(jī)視覺問題的專用庫(kù)
Python是由Guidovan Rossum發(fā)起的通用編程語言,很快就非常流行,主要是因?yàn)樗暮?jiǎn)單性和代碼可讀性。它使得程序員可以用較少的代碼行表達(dá)想法,而不會(huì)降低可讀性。
與C/C++之類的語言,Python速度較慢。也就是說,可以使用C/C++輕松擴(kuò)展Python,這使得我們能夠用C/C++編寫計(jì)算機(jī)密集型代碼并創(chuàng)建可用作Python模塊的Python包裝器。它給我們帶來了兩個(gè)好處: 首先,代碼與原始C/C++代碼一樣快(因?yàn)樗窃诤笈_(tái)運(yùn)行的實(shí)際C++代碼), 其次,在Python中比C/C++編寫代碼更容易。Opencv-Python是原始Opencv C++實(shí)現(xiàn)的Python包裝器。
Opencv-Python利用了Numpy,這是一個(gè)高度優(yōu)化的庫(kù),用于使用MATLAB樣式的語言進(jìn)行數(shù)值運(yùn)算。所有Opencv數(shù)組結(jié)構(gòu)都與Numpy數(shù)組相互轉(zhuǎn)換。這也使與使用Numpy的其他庫(kù)(例如Scipy和Matplotlib)的集成變得更加容易。
1.2 應(yīng)用領(lǐng)域
- 人機(jī)互動(dòng)
- 物體識(shí)別
- 圖像分割
- 人臉識(shí)別
- 動(dòng)作識(shí)別
- 運(yùn)動(dòng)跟蹤
- 機(jī)器人
- 運(yùn)動(dòng)分析
- 機(jī)器視覺
- 結(jié)構(gòu)分析
- 汽車安全駕駛
如上所述,opencv的功能十分強(qiáng)大,在各個(gè)領(lǐng)域大放異彩,由淺入深,本次我們先介紹圖像編輯,簡(jiǎn)單的字母數(shù)字識(shí)別的相關(guān)部分,日后會(huì)繼續(xù)開始人臉識(shí)別,圖像分割,圖像定位等等功能;
2 opencv-python安裝與使用
首先我們需要安裝一下環(huán)境
- python3:安裝python3:python教程有詳細(xì)的說明,網(wǎng)址安裝python
- numpy:安裝numpy:pip install numpy
- opencv-python:安裝opencv-python: pip install opencv-python
安裝完opencv-python后命令行打開python交互式環(huán)境:import cv2 成功,便說明成功安裝了opencv-python
2.1 imread()
imread函數(shù)讀取數(shù)字圖像,先看一下官網(wǎng)對(duì)于該函數(shù)的定義
cv2.imread(path_of_image, intflag)
函數(shù)參數(shù)一: 需要讀入圖像的完整的路徑
函數(shù)參數(shù)二: 標(biāo)志以什么形式讀入圖像,可以選擇一下方式:
- cv2.IMREAD_COLOR: 加載彩色圖像。任何圖像的透明度都將被忽略。它是默認(rèn)標(biāo)志
- cv2.IMREAD_GRAYSCALE:以灰度模式加載圖像
- cv2.IMREAD_UNCHANGED:保留讀取圖片原有的顏色通道
- 1 :等同于cv2.IMREAD_COLOR
- 0 :等同于cv2.IMREAD_GRAYSCALE
- -1 :等同于cv2.IMREAD_UNCHANGED
color_img = cv2.imread("image_file/1.jpeg")
print(color_img.shape)
gray_img=cv2.imread("image_file/1.jpeg", cv2.IMREAD_GRAYSCALE)
print(gray_img.shape)
#把單通道圖像保存后,再讀取,仍然是3通道,相當(dāng)于將單通道復(fù)制到3個(gè)通道保存
cv2.imwrite("image_file/gray_1.jpeg",gray_img)
2.2 threshold()
這個(gè)函數(shù)作用是將圖片二值化,圖像的二值化,就是將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255,也就是將整個(gè)圖像呈現(xiàn)出明顯的只有黑和白的視覺效果。二值化是圖像分割的一種最簡(jiǎn)單的方法。二值化可以把灰度圖像轉(zhuǎn)換成二值圖像。把大于某個(gè)臨界灰度值的像素灰度設(shè)為灰度極大值,把小于這個(gè)值的像素灰度設(shè)為灰度極小值,從而實(shí)現(xiàn)二值化。
畫圖舉例來說
cv.threshold()用來實(shí)現(xiàn)閾值分割,函數(shù)有4個(gè)參數(shù):
- 參數(shù)1:要處理的原圖,一般是灰度圖,這也是上一步中處理的
- 參數(shù)2:設(shè)定的閾值
- 參數(shù)3:最大閾值,一般為255
- 參數(shù)4:閾值的方式,主要有5種,分別為:THRESH_BINARY,THRESH_BINARY_INV,THRESH_TRUNC,THRESH_TOZERO 和 THRESH_TOZERO_INV
實(shí)例如下:
ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
ret, th2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)
ret, th3 = cv.threshold(img, 127, 255, cv.THRESH_TRUNC)
ret, th4 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO)
ret, th5 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO_INV)
titles = [‘Original’, ‘BINARY’, ‘BINARY_INV’, ‘TRUNC’, ‘TOZERO’, ‘TOZERO_INV’]
images = [img, th1, th2, th3, th4, th5]
使用Matplotlib顯示
for i in range(6):
plt.subplot(2, 3, i + 1)
plt.imshow(images[i], ‘gray’)
plt.title(titles[i], fontsize=8)
plt.xticks([]), plt.yticks([]) # 隱藏坐標(biāo)軸
plt.show()
實(shí)際輸出:
對(duì)應(yīng)的官方中說明
2.3 morphologyEx()
形態(tài)學(xué)操作是根據(jù)圖像形狀進(jìn)行的簡(jiǎn)單操作。一般情況下對(duì)二值化圖像進(jìn)行的操作。需要輸入兩個(gè)參數(shù),一個(gè)是原始圖像,第二個(gè)被稱為結(jié)構(gòu)化元素或核,它是用來決定操作的性質(zhì)的。
兩個(gè)基本的形態(tài)學(xué)操作是腐蝕和膨脹。他們的變體構(gòu)成了開運(yùn)算,閉運(yùn)算,具體概念如下:
1)腐蝕:
就像土壤侵蝕一樣,這個(gè)操作會(huì)把前景物體的邊界腐蝕掉(但是前景仍然是白色)。這是怎么做到的呢?卷積核沿著圖像滑動(dòng),如果與卷積核對(duì)應(yīng)的原圖像的所有像素值都是1,那么中心元素就保持原來的像素值,否則就變?yōu)榱恪?br> 這會(huì)產(chǎn)生什么影響呢?根據(jù)卷積核的大小靠近前景的所有像素都會(huì)被腐蝕掉(變?yōu)?),所以前景物體會(huì)變小,整幅圖像的白色區(qū)域會(huì)減少。這對(duì)于去除白噪聲很有用,也可以用來斷開兩個(gè)連在一塊的物體等。
2)膨脹:
與腐蝕相反,與卷積核對(duì)應(yīng)的原圖像的像素值中只要有一個(gè)是1,中心元素的像素值就是1。
所以這個(gè)操作會(huì)增加圖像中的白色區(qū)域(前景)。一般在去噪聲時(shí)先用腐蝕再用膨脹。因?yàn)楦g在去掉白噪聲的同時(shí),也會(huì)使前景對(duì)象變小。所以我們?cè)賹?duì)他進(jìn)行膨脹。這時(shí)噪聲已經(jīng)被去除了,不會(huì)再回來了,但是前景還在并會(huì)增加。膨脹也可以用來連接兩個(gè)分開的物體。
3)開運(yùn)算:
先腐蝕,后膨脹。去除圖像中小的亮點(diǎn)(CV_MOP_OPEN);
4)閉運(yùn)算
先膨脹,后腐蝕。去除圖像中小的暗點(diǎn)(CV_MOP_CLOSE);
kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 8))
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv.imshow("MORPH_OPEN_1", opening)
cv2.waitKey(0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 8))
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv.imshow("MORPH_OPEN_1", closing)
cv2.waitKey(0)
3 應(yīng)用案例
以上是opencv的簡(jiǎn)單使用,現(xiàn)在舉一個(gè)實(shí)際應(yīng)用的案例:識(shí)別驗(yàn)證碼,其實(shí)按照上面3個(gè)步驟就可以將圖片一步步處理,置灰,二值化,開運(yùn)算,最后就可以識(shí)別了。那么首先原圖如下:
1)首次處理效果,將圖片灰度化,二值化,為提取輪廓做準(zhǔn)備,二值化后,圖片非黑即白兩種,更有利于開閉運(yùn)算處理
src = cv2.imread('image_file/before.png')
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
cv.imshow("Binarization", binary)
cv2.waitKey(0)
2)基礎(chǔ)上面二值化圖片,對(duì)結(jié)果圖進(jìn)行開運(yùn)算處理,去除噪音部分
kernel = cv.getStructuringElement(cv.MORPH_RECT, (8, 1))
open_out = cv.morphologyEx(binl, cv.MORPH_OPEN, kernel)
cv.imshow("MORPH_OPEN_2", open_out)
cv2.waitKey(0)
3)最后一次處理,將背景置為白色,并且識(shí)別圖片識(shí)別碼
cv.bitwise_not(open_out, open_out)
cv.imshow("Transform", open_out)
textImage = Image.fromarray(open_out)
text = pytesseract.image_to_string(textImage)
cv2.waitKey(0)
4)最后打印出驗(yàn)證碼
4 總結(jié)
相信認(rèn)真一起看完上述知識(shí)點(diǎn),opencv-python已經(jīng)對(duì)于圖像的基本操作可以熟練掌握了,接下來會(huì)對(duì)數(shù)字圖像的一些其他概念進(jìn)行介紹,敬請(qǐng)期待~
作者:京東物流 張偉男文章來源:http://www.zghlxwxcb.cn/news/detail-711512.html
來源:京東云開發(fā)者社區(qū)?自猿其說Tech 轉(zhuǎn)載請(qǐng)注明來源文章來源地址http://www.zghlxwxcb.cn/news/detail-711512.html
到了這里,關(guān)于Opencv系列之一:簡(jiǎn)介與基本使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!