使用OpenCV3处理图像
1,不同色彩空間的轉換
OpenCV中有數百種關于在不同色彩空間之間轉換的方法。當前,在計算機視覺中有三種常用的色彩空間:灰度、BGR以及HSV(Hue,Saturation,Value)。
| 灰度 | 通過去除彩色信息來將其轉換成灰階,灰度色彩空間對中間處理特別有效,比如人臉檢測。 |
| BGR | 即藍-綠-紅色彩空間,每一個像素點都由一個三元數組來表示,分別代表藍、綠、紅三種顏色。網頁開發者可能熟悉另一個與之相似的顏色空間: RGB,它們只是在顏色的順序上不同。 |
| HSV | H ( Hue)是色調,S ( Saturation) 是飽和度,V ( Value)表示黑暗的程度(或光譜另一端的明亮程度 )。 |
2,傅里葉變換
Joseph Fourier(約瑟夫·傅里葉)是一位18世紀的法國數學家,他認為一切都可以用波形來描述。簡而言之:他觀察到所有的波形都可以由一系列簡單且頻率不同的正弦曲線疊加得到。也就是說,人們所看到的波形都是由其他波形疊加而得到的。
圖像的幅度譜是另–種圖像,幅度譜圖像呈現了原始圖像在變化方面的一種表示:把一幅圖像中最明亮的像素放到圖像中央,然后逐漸變暗,在邊緣上的像素最暗。這樣可以發現圖像中有多少亮的像素和暗的像素,以及它們分布的百分比。
2.1 高通濾波器
高通濾波器(HPF)是檢測圖像的某個區域,然后根據像素與周圍像素的亮度差值來提升(boost)該像素的亮度的濾波器。
在計算完中央像素與周圍鄰近像素的亮度差值之和以后,如果亮度變化很大,中央像素的亮度會增加(反之則不會)。
換句話說,如果一個像素比它周圍的像素更突出,就會提升它的亮度。
高通和低通濾波器都有一一個稱為半徑( radius)的屬性,它決定了多大面積的鄰近像素參與濾波運算。
核是指一組權重的集合,它會應用在源圖像的一個區域,并由此生成目標圖像的一個像素。
比如,大小為7的核意味著每49 (7x7)個源圖像的像素會產生目標圖像的一個像素。
可把核看作一塊覆蓋在源圖像上可移動的毛玻璃片,玻璃片覆蓋區域的光線會按某種方式進行擴散混合后透過去。
原圖:
運行結果:
2.2 低通濾波器
高通濾波器是根據像素與鄰近像素的亮度差值來提升該像素的亮度。
低通濾波器(LowPass Filter, LPF)則是在像素與周圍像素的亮度差值小于一個特定值時,平滑該像素的亮度。
它主要用于去噪和模糊化,比如說,高斯模糊是最常用的模糊濾波器(平滑濾波器)之一,它是一個削弱高頻信號強度的低通濾波器。
2.7 Canny邊緣檢測
Canny邊緣檢測算法非常復雜,但也很有趣:它有5個步驟,
即使用高斯濾波器對圖像進行去噪、計算梯度、在邊緣上使用非最大抑制(NMS)、在檢測到的邊緣上使用雙( double)閾值去除假陽性( false positive),最后還會分析所有的邊緣及其之間的連接,以保留真正的邊緣并消除不明顯的邊緣。
原圖:
運行結果:
2.8 輪廓檢測
這段代碼首先創建了一個200 x 200大小的黑色空白圖像,接著在圖像的中央放置一個白色方塊,這里用到了np數組在切片上賦值的功能。接下來對圖像進行二值化操作,然后調用了findContours()函數。該函數有三個參數:輸人圖像、層次類型和輪廓逼近方法。它有幾個方面特別有趣:
這個函數會修改輸人圖像,因此建議使用原始圖像的-份拷貝 (比如說,通過img.copy()來作為輸人圖像)。
由函數返回的層次樹相當重要:cv2.RETR_TREE參數會得到圖像中輪廓的整體層次結構,以此來建立輪廓之間的“關系”。
如果只想得到最外面的輪廓,可使用cv2.RETR_ EXTERNAL。這對消除包含在其他輪廓中的輪廓很有用(比如,在大多數情形下,不需要檢測一個目標包含在另一個與之相同的目標里面)。
findContours()函數有三個返回值:修改后的圖像、圖像的輪廓以及它們的層次。
用輪廓來畫出圖像的彩色版本(即把輪廓畫成綠色),并顯示出來。所得的結果是一個邊緣為綠色的白色方塊。
運行結果:
2.9 邊界框、最小矩形區域和最小閉圓的輪廓
import cv2 import numpy as npimg = cv2.pyrDown(cv2.imread('sq.jpg',cv2.IMREAD_UNCHANGED))ret,thresh = cv2.threshold(cv2.cvtColor(img.copy(),cv2.COLOR_BGR2GRAY),127,255,cv2.THRESH_BINARY) image,contours,hier = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for c in contours:#find bounding box coordinatesx,y,w,h = cv2.boundingRect(c)cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)#find minimum arearect = cv2.minAreaRect(c)#calculate coordinates of the minimum area rectanglebox = cv2.boxPoints(rect)#normalize coordinates to integersbox = np.int0(box)#draw contourscv2.drawContours(img,[box],0,(0,0,255),3)#calculate center and radius of minimum enclosing circle(x,y),radius = cv2.minEnclosingCircle(c)#cast to integerscenter = (int(x),int(y))radius = int(radius)#draw the circleimg = cv2.circle(img,center,radius,(0,255,0),2)cv2.drawContours(img,contours,-1,(255,0,0),1) cv2.imshow("contours",img) cv2.waitKey() cv2.destroyAllWindows()原圖:
運行結果:
2.10 凸輪廓與Douglas-Peucker算法
cv2.approxPloyDP(cnt,epsion,True)
參數一:輪廓
參數二:ε值,表示源輪廓與近似多邊形的最大差值(這個值越小,近似多邊形與源輪廓周長之間的最大差值,這個差值越小,近似多邊形與源輪廓就越相似)
參數三:布爾標記,表示這個多邊形是否閉合
cv2.convexHull(cnt)獲取處理過的輪廓信息
2.11 直線和圓檢測
2.11.1 直線檢測
2.11.2 圓檢測
import cv2 import numpy as npplanets = cv2.imread('result.jpg') gray_img = cv2.cvtColor(planets,cv2.COLOR_BGR2GRAY) img = cv2.medianBlur(gray_img,5) cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,120,param1=100,param2=30,minRadius=0,maxRadius=0) circles = np.uint16(np.around(circles))for i in circles[0,:]:#draw the outer circlecv2.circle(planets,(i[0],i[1]),i[2],(0,255,0),2)#draw the center of the circlecv2.circle(planets,(i[0],i[1]),2,(0,0,255),3)cv2.imwrite("planets.jpg",planets) cv2.imshow("HoughCircles",planets) cv2.waitKey() cv2.destroyAllWindows()原圖:
運行結果:
總結
以上是生活随笔為你收集整理的使用OpenCV3处理图像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ccc认证多少钱啊?
- 下一篇: 《秋日示休上人诗》第三句是什么