------韋訪 20181011
1、概述
想學(xué)習(xí)圖像處理,不管是機(jī)器學(xué)習(xí)也好,深度學(xué)習(xí)也好,不會點(diǎn)OpenCV好像有點(diǎn)說不過去吧?所以,現(xiàn)在開始OpenCV的學(xué)習(xí)。
2、讀寫圖片
先從圖片的讀寫開始,opencv讀取圖片的函數(shù)是imread,默認(rèn)情況下,imread函數(shù)返回BGR格式的圖像,可以用imwrite函數(shù)將數(shù)據(jù)寫到本地。下面的代碼會將JPG圖片轉(zhuǎn)成PNG。
image = cv2.imread('dog.jpeg') cv2.imwrite('dog.png', image)
運(yùn)行結(jié)果:

如果想將圖片通過OpenCV的窗口顯示,則調(diào)用imshow函數(shù),注意在代碼末尾加上waitkey函數(shù),否則窗口就直接關(guān)閉了,不知道的還以為imshow函數(shù)沒起作用。代碼如下,
image = cv2.imread('dog.jpeg') cv2.imwrite('dog.png', image)
運(yùn)行結(jié)果:

上面提到,imread默認(rèn)返回的是BGR圖片,我們也可以通過設(shè)置參數(shù),讓其返回一個灰度圖片,代碼如下,
image = cv2.imread('dog.jpeg', flags=cv2.IMREAD_GRAYSCALE)
運(yùn)行結(jié)果:

3、高通濾波器
高通濾波器(HPF)是檢測圖像的某個區(qū)域,根據(jù)該像素與周圍像素的亮度差值來提升該像素的亮度的濾波器。下面來舉個例子,代碼如下,
from scipy import ndimage
img = cv2.imread('sea.jpg', flags=cv2.IMREAD_GRAYSCALE) k3 = ndimage.convolve(img, kernel_3x3) k5 = ndimage.convolve(img, kernel_5x5)
GBlur = cv2.GaussianBlur(img, (11, 11), 0)
cv2.imshow('g_hpf', g_hpf)

4、低通濾波器
低通濾波器則在像素與周圍像素的亮度差值小于一個特定值時,平滑該像素的亮度,主要用于去噪和模糊化。
5、邊緣檢測
邊緣檢測不管是在人類視覺還是計(jì)算機(jī)視覺中都是非常重要的,我們能識別物體,就是靠邊緣。這個很容易理解,夜晚很黑什么都看不到,不就是因?yàn)闆]看到物體的邊緣嗎?
OpenCV提供了很多邊緣檢測的濾波函數(shù),比如,Laplacian, Sobel, Scharr, Canny等。這些函數(shù)會將非邊緣區(qū)域轉(zhuǎn)為黑色,將邊緣區(qū)域轉(zhuǎn)為白色或其他顏色。但是,這些函數(shù)容易將噪聲錯誤的失敗為邊緣,所以,在邊緣檢測之前,應(yīng)該對圖像進(jìn)行模糊處理。
OpenCV提供了很多模糊濾波器,比如blur, medianBlur, GausianBlur等,邊緣檢測濾波器和模糊濾波器總有一個ksize參數(shù),這個參數(shù)表示濾波核的寬高,是一個奇數(shù)。還是來個代碼吧,
img = cv2.imread('car.jpg', flags=cv2.IMREAD_GRAYSCALE) GBlur = cv2.GaussianBlur(img, (3, 3), 0) canny = cv2.Canny(GBlur, 50, 150) cv2.imshow('canny', canny)
運(yùn)行結(jié)果,

6、邊界框、最小矩形區(qū)域、最小閉圓的輪廓
實(shí)際應(yīng)用中經(jīng)常會對目標(biāo)的邊界框、最小矩形區(qū)域、最小閉圓特別感興趣。用cv2.findContours函數(shù)很容易實(shí)現(xiàn)上述功能。上代碼,
img = cv2.imread('Picture1.png', cv2.IMREAD_UNCHANGED)
ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY), 127, 255, cv2.THRESH_BINARY)
#輸入的三個參數(shù)分別為:輸入圖像、層次類型、輪廓逼近方法 #因?yàn)檫@個函數(shù)會修改輸入圖像,所以上面的步驟使用copy函數(shù)將原圖像做一份拷貝,再處理 #返回的三個返回值分別為:修改后的圖像、圖輪廓、層次 image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
x, y, w, h = cv2.boundingRect(c) cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
rect = cv2.minAreaRect(c) box = cv2.boxPoints(rect) cv2.drawContours(img, [box], 0, (0, 0, 255), 3)
(x, y), radius = cv2.minEnclosingCircle(c) center = (int(x), int(y)) img = cv2.circle(img, center, radius, (255, 0, 0), 2)
cv2.imshow('image', image) cv2.drawContours(img, contours, -1, (255, 0, 0), 1) cv2.imshow("contours", img)
運(yùn)行結(jié)果:

總結(jié):
基礎(chǔ)知識先學(xué)這么多,后續(xù)再通過實(shí)例慢慢學(xué),本來想加上攝像頭的操作,無奈電腦沒有攝像頭,已經(jīng)在淘寶了,后續(xù)實(shí)例中再補(bǔ)了。
如果您感覺本篇博客對您有幫助,請打開支付寶,領(lǐng)個紅包支持一下,祝您掃到99元,謝謝~~
|