原創文章,歡迎轉載,轉載請注明出處
用來記錄學習的過程,這個是簡單的相關函數的熟悉,內部機制和選擇何種選擇函數參數才能達到自己的要求還不太清楚,先學者吧。。后面會慢慢清楚的。
和前面相比,主要用了三個新的函數cvCreateImage,cvSmooth,cvCanny。
cvCreateImage用來創建分配圖像空間,創建兩個,分別保存平滑處理后的圖片,然后將平滑處理后的圖片(相當於濾波了)進行邊緣檢測。。代碼很簡單,opencv很強大,簡單的幾個函數就完成了如此牛逼的東西。。圖像是有了,不過很好奇邊緣檢測出來的圖片怎么提取信息,例如我想直到某個形狀的物體在某個地方之類的。。函數原型貼一些吧,wiki上其實寫的很清楚
1 Smooth 2 各種方法的圖像平滑 3 4 void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0, double param4=0 ); 5 src 6 輸入圖像. 7 dst 8 輸出圖像. 9 smoothtype 10 平滑方法: 11 CV_BLUR_NO_SCALE (簡單不帶尺度變換的模糊) - 對每個象素的 param1×param2 領域求和。如果鄰域大小是變化的,可以事先利用函數 cvIntegral 計算積分圖像。 12 CV_BLUR (simple blur) - 對每個象素param1×param2鄰域 求和並做尺度變換 1/(param1•param2). 13 CV_GAUSSIAN (gaussian blur) - 對圖像進行核大小為 param1×param2 的高斯卷積 14 CV_MEDIAN (median blur) - 對圖像進行核大小為param1×param1 的中值濾波 (i.e. 鄰域是方的). 15 CV_BILATERAL (雙向濾波) - 應用雙向 3x3 濾波,彩色 sigma=param1,空間 sigma=param2. 關於雙向濾波,可參考http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html 16 param1 17 平滑操作的第一個參數. 18 param2 19 平滑操作的第二個參數. 對於簡單/非尺度變換的高斯模糊的情況,如果param2的值 為零,則表示其被設定為param1。 20 param3 21 對應高斯參數的 Gaussian sigma (標准差). 如果為零,則標准差由下面的核尺寸計算: 22 sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 對應水平核, n=param2 對應垂直核. 23 對小的卷積核 (3×3 to 7×7) 使用如上公式所示的標准 sigma 速度會快。如果 param3 不為零,而 param1 和 param2 為零,則核大小有 sigma 計算 (以保證足夠精確的操作). 24 25 函數 cvSmooth 可使用上面任何一種方法平滑圖像。每一種方法都有自己的特點以及局限。 26 27 沒有縮放的圖像平滑僅支持單通道圖像,並且支持8位到16位的轉換(與cvSobel和cvaplace相似)和32位浮點數到32位浮點數的變換格式。 28 29 簡單模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮點圖像。這兩種方法可以(in-place)方式處理圖像。 30 31 中值和雙向濾波工作於 1- 或 3-通道, 8-位圖像,但是不能以 in-place 方式處理圖像. 32 33 34 35 中值濾波 36 中值濾波法是一種非線性平滑技術,它將每一象素點的灰度值設置為該點某鄰域窗口內的所有象素點灰度值的中值。實現方法: 37 通過從圖像中的某個采樣窗口取出奇數個數據進行排序 38 用排序后的中值取代要處理的數據即可 39 中值濾波法對消除椒鹽噪音非常有效,在光學測量條紋圖象的相位分析處理方法中有特殊作用,但在條紋中心分析方法中作用不大。中值濾波在圖像處理中,常用於用來保護邊緣信息,是經典的平滑噪聲的方法 40 41 中值濾波原理 42 中值濾波是基於排序統計理論的一種能有效抑制噪聲的非線性信號處理技術,中值濾波的基本原理是把數字圖像或數字序列中一點的值用該點的一個拎域中各點值的中值代替,讓周圍的像素值接近的值,從而消除孤立的噪聲點。方法是去某種結構的二維滑動模板,將板內像素按照像素值的大小進行排序,生成單調上升(或下降)的為二維數據序列。二維中值濾波輸出為g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分別為原始圖像和處理后圖像。W為二維模板,通常為2*2,3*3區域,也可以是不同的的形狀,如線狀,圓形,十字形,圓環形等。 43 44 高斯濾波 45 高斯濾波實質上是一種信號的濾波器,其用途是信號的平滑處理,我們知道數字圖像用於后期應用,其噪聲是最大的問題,由於誤差會累計傳遞等原因,很多圖像處理教材會在很早的時候介紹Gauss濾波器,用於得到信噪比SNR較高的圖像(反應真實信號)。於此相關的有Gauss-Lapplace變換,其實就是為了得到較好的圖像邊緣,先對圖像做Gauss平滑濾波,剔除噪聲,然后求二階導矢,用二階導的過零點確定邊緣,在計算時也是頻域乘積=>空域卷積。 46 47 濾波器就是建立的一個數學模型,通過這個模型來將圖像數據進行能量轉化,能量低的就排除掉,噪聲就是屬於低能量部分 48 49 其實編程運算的話就是一個模板運算,拿圖像的八連通區域來說,中間點的像素值就等於八連通區的像素值的均值,這樣達到平滑的效果 50 51 若使用理想濾波器,會在圖像中產生振鈴現象。采用高斯濾波器的話,系統函數是平滑的,避免了振鈴現象。
1 Canny 2 采用 Canny 算法做邊緣檢測 3 4 void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3 ); 5 image 6 單通道輸入圖像. 7 edges 8 單通道存儲邊緣的輸出圖像 9 threshold1 10 第一個閾值 11 threshold2 12 第二個閾值 13 aperture_size 14 Sobel 算子內核大小 (見 cvSobel). 15 函數 cvCanny 采用 CANNY 算法發現輸入圖像的邊緣而且在輸出圖像中標識這些邊緣。threshold1和threshold2 當中的小閾值用來控制邊緣連接,大的閾值用來控制強邊緣的初始分割。 16 17 注意事項:cvCanny只接受單通道圖像作為輸入。 18 外部鏈接:經典的canny自調整閾值算法的一個opencv的實現見在OpenCV中自適應確定canny算法的分割門限
最后這個連接好像打不開,這個閥值也不知道怎么用,就隨便弄了個先看看。。
上圖。。。順序是 原圖---->高斯濾波平滑過度---->平滑后邊緣檢測后的效果---->原圖邊緣檢測后的效果
上圖為原圖
上圖為平滑過渡后的圖
上圖為平滑過度有進行邊緣檢測的圖
上圖為原圖邊緣檢測的圖
彩色圖我們看平滑處理后區別不明顯,但是邊緣檢測后,細節部分區別就很明顯了。。