opencv与计算机视觉
opencv與計算機視覺
計算機視覺:是一門研究如何使機器“看”的科學,更進一步的說,就是是指用攝影機和電腦代替人眼對目標進行識別、跟蹤和測量等機器視覺,并進一步做圖形處理,使電腦處理成為更適合人眼觀察或傳送給儀器檢測的圖像。(百度百科)
opencv:簡單的說就是為你提供一個處理圖片和視頻的框架,可以使用opencv或者自己的算法,不用擔心分配和釋放圖片的內存,所以opencv最強大的地方在于它強大的內存管理和自身的架構。
用計算機對圖像進行處理的技術–圖像處理
常用方法
(1)圖像變換:由于圖像陣列很大,直接在空間域中進行處理,涉及計算量很大。因此,往往采用各種圖像變換的方法,如傅立葉變換 離散余弦變換(高斯模糊)。
(2 )圖像編碼壓縮:圖像編碼壓縮技術可減少描述圖像的數據量(即比特數),以便節省圖像傳輸、處理時間和減少所占用的存儲器容量。
(3)圖像增強和復原:圖像增強和復原的目的是為了提高圖像的質量,如去除噪聲,提高圖像的清晰度等。圖像增強不考慮圖像降質的原因,突出圖像中所感興趣的部分。如強化圖像高頻分量,可使圖像中物體輪廓清晰,細節明顯;如強化低頻分量可減少圖像中噪聲影響。圖像復原要求對圖像降質的原因有一定的了解,一般講應根據降質過程建立“降質模型”,再采用某種濾波方法,恢復或重建原來的圖像。
常用方法:灰度增強(直方圖均衡化),線性濾波器。
(4)圖像分割:圖像分割是數字圖像處理中的關鍵技術之一。圖像分割是將圖像中有意義的特征部分提取出來,其有意義的特征有圖像中的邊緣、區域等。
圖像邊緣處理方法:邊緣檢測
(5)圖像描述
(6)圖像分類(識別):圖像分類(識別)屬于模式識別的范疇,其主要內容是圖像經過某些預處理(增強、復原、壓縮)后,進行圖像分割和特征提取,從而進行判決分類。圖像分類常采用經典的模式識別方法,有統計模式分類和句法(結構)模式分類。
矩陣變換 傅里葉變換與高斯模糊
1.傅里葉變換
1.1 能將滿足一定條件的某個函數表示成三角函數(正弦和/或余弦函數)或者它們的積分的線性組合。在不同的研究領域,傅立葉變換具有多種不同的變體形式,如連續傅立葉變換和離散傅立葉變換。傅立葉變換是一種分析信號的方法,它可分析信號的成分可用這些成分合成信號
1.2 性質:線性性質 尺度變換性質 對偶性 平移性質 微分關系 時域卷積定理 頻域卷積定理
1.3應用:
2.高斯模糊
2.1所謂高斯模糊,就是指一個圖像與二維高斯分布的概率密度函數做卷積。它的效果如下:
高斯模糊常常用來模擬人眼中的物體變遠、變快的效果。在照片處理中,我們常常將背景施以高斯模糊,使得背景仿佛變遠了,從而突出前景的人物或物體。高斯模糊對于圖像來說就是一個低通濾波器。
2.2機理:高斯模糊是一種圖像模糊濾波器,它用正態分布計算圖像中每個像素的變換。N維空間正態分布方程為
在二維空間定義為
其中r是模糊半徑,σ是正態分布的標準偏差。在二維空間中,這個公式生成的曲面的等高線是從中心開始呈正態分布的同心圓。分布不為零的像素組成的卷積矩陣與原始圖像做變換。每個像素的值都是周圍相鄰像素值的加權平均。原始像素的值有最大的高斯分布值,所以有最大的權重,相鄰像素隨著距離原始像素越來越遠,其權重也越來越小。這樣進行模糊處理比其它的均衡模糊濾波器更高地保留了邊緣效果。
2.3應用:圖像卷積濾波
它是圖像處理最基本的方法,可以產生不同的效果。比如
可以看到原圖像經過二維的圖像濾波矩陣(卷積核)處理后可以變換成為另一個圖像,對于原圖像的每一個像素點來說,計算它的領域之內的像素和濾波矩陣對應元素的乘積,相加得到的值作為當前中心像素位置的值,這樣就完成了濾波的功能。
對于濾波器的要求
① 濾波器的大小應該是奇數,這樣它才有一個中心,例如3x3,5x5或者7x7。有中心了,也有了半徑的稱呼,例如5x5大小的核的半徑就是2。
② 濾波器矩陣所有的元素之和應該要等于1,這是為了保證濾波前后圖像的亮度保持不變。當然了,這不是硬性要求了。
③ 如果濾波器矩陣所有元素之和大于1,那么濾波后的圖像就會比原圖像更亮,反之,如果小于1,那么得到的圖像就會變暗。如果和為0,圖像不會變黑,但也會非常暗。
④ 對于濾波后的結構,可能會出現負數或者大于255的數值。對這種情況,我們將他們直接截斷到0和255之間即可。對于負數,也可以取絕對值。
2.4卷積核的一些用法
2.4.1 空卷積核
濾波后得到的圖和原圖是一樣的。因為只有中心點的值是1。鄰域點的權值都是0,對濾波后的取值沒有任何影響。
2.4.2圖像銳化濾波器
圖像的銳化和邊緣檢測很像,首先找到邊緣,然后把邊緣加到原來的圖像上面,這樣就強化了圖像的邊緣,使圖像看起來更加銳利了。這兩者操作統一起來就是銳化濾波器了,也就是在邊緣檢測濾波器的基礎上,再在中心的位置加1,這樣濾波后的圖像就會和原始的圖像具有同樣的亮度了,但是會更加銳利。
我們把核加大,就可以得到更加精細的銳化效果
另外,下面的濾波器會更強調邊緣
2.4.3浮雕
浮雕濾波器可以給圖像一種3D陰影的效果。只要將中心一邊的像素減去另一邊的像素就可以了。這時候,像素值有可能是負數,我們將負數當成陰影,將正數當成光,然后我們對結果圖像加上128的偏移。這時候,圖像大部分就變成灰色了。
下面是45度的浮雕濾波器
只要加大濾波器,就可以得到更加夸張的效果了
2.4.4均值模糊
我們可以將當前像素和它的四鄰域的像素一起取平均,然后再除以5,或者直接在濾波器的5個地方取0.2的值即可
可以看到,這個模糊還是比較溫柔的,我們可以把濾波器變大,這樣就會變得粗暴了:注意要將和再除以13.
可以看到均值模糊也可以做到讓圖片模糊,但是它的模糊不是很平滑,不平滑主要在于距離中心點很遠的點與距離中心點很近的所帶的權重值相同,產生的模糊效果一樣,而想要做到平滑,讓權重值跟隨中心點位置距離不同而不同,則可以利用正態分布(中間大,兩端小)這個特點來實現。
高斯模糊
有了前面的知識,我們知道如果要想實現高斯模糊的特點,則需要通過構建對應的權重矩陣來進行濾波。
3.1正態分布
正態分布中,越接近中心點,取值越大,越遠離中心,取值越小。
計算平均值的時候,我們只需要將"中心點"作為原點,其他點按照其在正態曲線上的位置,分配權重,就可以得到一個加權平均值。正態分布顯然是一種可取的權重分配模式。
3.2 高斯函數–用來描述正態分布
上面的正態分布是一維的,而對于圖像是二維的,所以我們需要二維的正態分布。
正態分布的密度函數叫做"高斯函數"(Gaussian function)。它的一維形式是:
其中,μ是x的均值,σ是x的方差。因為計算平均值的時候,中心點就是原點,所以μ等于0。
根據一維高斯函數,可以推導二維高斯函數:
通過此函數,可以計算每個點的權重。
3.3獲取權重矩陣
假設中心點坐標為(0,0)
為了計算權重矩陣,需要設定σ的值。假定σ=1.5,則模糊半徑為1的權重矩陣如下:
這9個點的權重總和等于0.4787147,如果只計算這9個點的加權平均,還必須讓它們的權重之和等于1,因此上面9個值還要分別除以0.4787147,得到最終的權重矩陣。
除以總值這個過程也叫做”歸一問題“
目的是讓濾鏡的權重總值等于1。否則的話,使用總值大于1的濾鏡會讓圖像偏亮,小于1的濾鏡會讓圖像偏暗。
接下來計算高斯模糊的值就好啦。
代碼
導入頭文件
調用攝像頭
VideoCapture video(0); while (true) {Mat frame;//視頻的每一幀video >> frame; //將視頻寫入每一幀cvtColor(frame,frame,COLOR_RGB2GRAY);cvNamedWindow("frame", WINDOW_AUTOSIZE);imshow("frame",frame);waitKey(30); }高斯模糊實現
Mat srcImage = imread("D:\\Desktop\\lena.jpg", 1); //讀取圖片 cvtColor(srcImage, srcImage,COLOR_BGR2GRAY); //轉為灰度圖像namedWindow("srcImage", WINDOW_AUTOSIZE); //新建窗口 imshow("srcImage", srcImage); //顯示圖像 //waitKey(0); //圖像顯示為一幀//由于中型差分的原因,輸出圖像比原始圖象少了兩列 Mat dImage = Mat(srcImage.rows,srcImage.cols - 2,CV_8UC1);//循環遍歷整個圖像 for (int i = 0; i < srcImage.rows; i++) {for (int j = 1; j < srcImage.cols - 1; j++){//對整型數據類型進行運算,進行中型差分dImage.at<uchar>(i, j - 1) = srcImage.at<uchar>(i, j + 1) - srcImage.at<uchar>(i, j - 1);} } namedWindow("dImage", WINDOW_AUTOSIZE); //處理后圖像窗口 imshow("dImage", dImage); //顯示處理后的圖像waitKey(0); //圖像顯示為一幀Mat srcImage = imread("D:\\Desktop\\lena.jpg", 1); //讀取圖片 cvtColor(srcImage, srcImage, COLOR_BGR2GRAY); //轉為灰度圖像 namedWindow("srcImage", WINDOW_AUTOSIZE); //新建窗口 imshow("srcImage", srcImage); //顯示圖像/*高斯模糊*///5×5卷積模板 Mat model = Mat(5, 5, CV_64FC1); double sigma = 80; //超參數,根據經驗所得 for (int i = - 2; i <= 2 ; i++) //進行遍歷 {for (int j = -2; j <= 2; j++){//正態分布model.at<double>(i + 2, j + 2) =exp(-(i * i + j * j) / (2 * sigma * sigma)) /(2 * PI * sigma * sigma);} }//歸一化 double gaussSum = 0; gaussSum = sum(model).val[0]; //卷積核 求和 for (int i = 0; i < model.rows; i++) {for (int j = 0; j < model.cols; j++){model.at<double>(i, j) = model.at<double>(i, j)/ gaussSum;} }Mat dst = Mat(srcImage.rows - 4,srcImage.cols - 4,CV_8UC1);//對整個圖片進行遍歷卷積 for (int i = 2; i < srcImage.rows - 2; i++) {for (int j = 2; j < srcImage.cols - 2; j++){double sum = 0; //求和目標值for (int m = 0; m < model.rows; m++){for (int n = 0; n < model.cols; n++){sum += (double)srcImage.at<uchar>(i + m - 2, j + n - 2) * model.at<double>(m,n); //對整個卷積核進行卷積}}dst.at<uchar>(i - 2, j - 2) = (uchar)sum; //結果賦值到dst圖像當中} } namedWindow("gaussBlur", WINDOW_AUTOSIZE); imshow("gaussBlur", dst); waitKey(0); //圖像顯示為一幀調用高斯模糊庫函數
Mat dst = srcImage.clone(); //一行代碼高斯模糊 GaussianBlur(srcImage, dst, Size(17, 17), 180); namedWindow("gaussBlur", WINDOW_AUTOSIZE); imshow("gaussBlur", dst); waitKey(0); //圖像顯示為一幀運行結果
參考
[高斯模糊(https://www.cnblogs.com/invisible2/p/9177018.html)
[(https://imlogm.github.io/圖像處理/image-fft/)
[(http://www.cvvision.cn/8907.html)
[https://www.jianshu.com/p/191d1e21f7ed?tdsourcetag=s_pcqq_aiomsg)
百度百科
培訓感受
感覺學長們很厲害,可以把很多東西深入淺出的講解,讓我們這些小白對圖像處理方面有一些全新的認識和了解,給我們提供了又一個新的方向,但是我知道,師傅領進門修行在個人,希望自己做好手邊的每一件事情,謝謝各位前輩的指點(●ˇ?ˇ●)
要努力( ?? ω ?? )
總結
以上是生活随笔為你收集整理的opencv与计算机视觉的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: libRTMP 整体说明
- 下一篇: 软考信息系统项目管理师论文范文:论项目的