图像局部显著性—线特征
生活随笔
收集整理的這篇文章主要介紹了
图像局部显著性—线特征
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
線檢測--快速幾何形狀檢測
????????? 參考: 【OpenCV入門指南】第七篇 線段檢測與圓檢測
(一)、邊緣檢測
?????? 一維顯著特征常見表示為邊緣。邊緣檢測的預處理常用?高斯模糊;主要數學運算為計算一階和二階導數,尋找梯度和零交叉點,其中梯度計算可用快速卷積碼實現;常見的算子有: 一階::Roberts Cross算子,Prewitt算子,Sobel算子, Kirsch算子,羅盤算子; 二階: Marr-Hildreth,在梯度方向的二階導數過零點,Canny算子,Laplacian算子。
???????圖像處理過程使用卷積實現邊緣檢測:常用的邊緣檢測模板有Laplacian算子、Roberts算子、Sobel算子、log(Laplacian-Gauss)算子、Kirsch算子和Prewitt算子等。
?????? 常見算子Sobel和Canny比較:Soble邊緣檢測算法比較簡,實際應用中效率比canny邊緣檢測效率要高,但是邊緣不如Canny檢測的準確,但是很多實際應用的場合,sobel邊緣卻是首選,尤其是對效率要求較高,而對細紋理不太關心的時候,也可以作為預檢測。
(二):快速幾何形狀檢測
1. 線段檢測和圓檢測:
?
函數實現: // 圖像中的線段檢測 #include <opencv2/opencv.hpp> using namespace std; #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") int main() { const char *pstrWindowsSrcTitle = "原圖(http://blog.csdn.net/MoreWindows)"; const char *pstrWindowsLineName = "線段檢測"; // 從文件中加載原圖 Mat SrcImage = imread("D:/Circle.jpg", CV_LOAD_IMAGE_UNCHANGED);? // 灰度圖 Mat GrayImage= Mat(Size(SrcImage.rows, SrcImage.cols), CV_8SC1);//CV_32FC1); //cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY); // 邊緣圖 Mat CannyImage= Mat(Size(SrcImage.rows, SrcImage.cols), CV_8SC1);//CV_32FC1);? cvCanny(pGrayImage, pCannyImage, 30, 90); //1、使用了Canny檢測的方法!!! //cvSmooth(pCannyImage, pCannyImage); //線段檢測(只能針對二值圖像) //以下代碼待修改!!!! CvMemStorage *pcvMStorage = cvCreateMemStorage(); double fRho = 1; double fTheta = CV_PI / 180; int nMaxLineNumber = 50; //最多檢測條直線 double fMinLineLen = 50; //最小線段長度 double fMinLineGap = 10; //最小線段間隔 CvSeq *pcvSeqLines = cvHoughLines2(pCannyImage, pcvMStorage, CV_HOUGH_PROBABILISTIC, fRho, fTheta, nMaxLineNumber, fMinLineLen, fMinLineGap); // 繪制線段 IplImage *pColorImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 3); cvCvtColor(pCannyImage, pColorImage, CV_GRAY2BGR); for(int i = 0; i < pcvSeqLines->total; i++) { CvPoint* line = (CvPoint*)cvGetSeqElem(pcvSeqLines, i); cvLine(pColorImage, line[0], line[1], CV_RGB(255,0,0), 2); } cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE); cvShowImage(pstrWindowsSrcTitle, pSrcImage); cvNamedWindow(pstrWindowsLineName, CV_WINDOW_AUTOSIZE); cvShowImage(pstrWindowsLineName, pColorImage); cvReleaseMemStorage(&pcvMStorage); cvDestroyWindow(pstrWindowsSrcTitle); cvDestroyWindow(pstrWindowsLineName); //cvReleaseImage(&pSrcImage); //cvReleaseImage(&pGrayImage); //cvReleaseImage(&pCannyImage); //cvReleaseImage(&pColorImage); cvWaitKey(0);? return 0; }
引用原結果:
快速檢測矩形的題目可以借鑒上述OpenCV原型里面的算法.....
待完成.....
han?and?zhu (2005)提出使用潛在的匹配矩形形狀和嵌套結構(矩形和消失點之間)的語法來推導?矩形框?最有可能的對應線段...
計算機視覺:算法與應用?p196-p197
????????? 參考: 【OpenCV入門指南】第七篇 線段檢測與圓檢測
(一)、邊緣檢測
?????? 一維顯著特征常見表示為邊緣。邊緣檢測的預處理常用?高斯模糊;主要數學運算為計算一階和二階導數,尋找梯度和零交叉點,其中梯度計算可用快速卷積碼實現;常見的算子有: 一階::Roberts Cross算子,Prewitt算子,Sobel算子, Kirsch算子,羅盤算子; 二階: Marr-Hildreth,在梯度方向的二階導數過零點,Canny算子,Laplacian算子。
???????圖像處理過程使用卷積實現邊緣檢測:常用的邊緣檢測模板有Laplacian算子、Roberts算子、Sobel算子、log(Laplacian-Gauss)算子、Kirsch算子和Prewitt算子等。
?????? 常見算子Sobel和Canny比較:Soble邊緣檢測算法比較簡,實際應用中效率比canny邊緣檢測效率要高,但是邊緣不如Canny檢測的準確,但是很多實際應用的場合,sobel邊緣卻是首選,尤其是對效率要求較高,而對細紋理不太關心的時候,也可以作為預檢測。
(二):快速幾何形狀檢測
1. 線段檢測和圓檢測:
???? 線段檢測與圓檢測主要運用Hough變換,Hough變換是一種利用圖像的全局特征將特定形狀的邊緣連接起來,形成連續平滑邊緣的一種方法。它通過將源圖像上的點影射到用于累加的參數空間,實現對已知解析式曲線進行識別。
????? 在OpenCV編程中,線段檢測和圓檢測已經封裝成函數了,直接使用cvHoughLines2和cvHoughCircles即可。?
Hough線檢測函數原型:
CvSeq* cvHoughLines2(CvArr* image, //第一個參數表示輸入圖像,必須為二值圖像(黑白圖)void* line_storage,//第二個參數表示存儲容器,和上一篇的輪廓檢測一樣,可以傳入CvMemStorage類型的指針int method,//第三個參數表示變換變量,可以取下面的值://CV_HOUGH_STANDARD - 標準 Hough 變換. 每一線段由兩浮點數(ρ,θ)表示,其中ρ是線段與原點(0,0)之間的距離,θ線段與 x-軸之間的夾角。//CV_HOUGH_PROBABILISTIC - 概率Hough變換(若圖像包含一些長的線性分割,效率更高)。返回線段分割而非整個線段。每個分割用起點和終點表示。//CV_HOUGH_MULTI_SCALE - 傳統 Hough 變換的多尺度變種。線段的編碼方式與 CV_HOUGH_STANDARD 的一致。double rho,//第四個參數表示與象素相關單位的距離精度。double theta,//第五個參數表示弧度測量的角度精度。int threshold,//第六個參數表示檢測線段的最大條數,如果已經檢測這么多條線段,函數返回。double param1=0, //第七個參數與第三個參數有關,其意義如下://對傳統 Hough 變換,不使用(0); 對概率 Hough 變換,它是最小線段長度.對多尺度 Hough 變換,它是距離精度 rho 的分母 (大致的距離精度是 rho 而精確的應該是 rho / param1 ). double param2=0//第八個參數與第三個參數有關,其意義如下://對傳統 Hough 變換,不使用 (0).//對概率 Hough 變換,此參數表示在同一線段上進行碎線段連接的最大間隔值(gap), 即當同一線段兩碎線段間的間隔小于param2時,將其合二為一。//對多尺度 Hough 變換,它是角度精度 theta 的分母 (大致的角度精度是 theta 而精確的角度應該是 theta / param2). );函數實現: // 圖像中的線段檢測 #include <opencv2/opencv.hpp> using namespace std; #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") int main() { const char *pstrWindowsSrcTitle = "原圖(http://blog.csdn.net/MoreWindows)"; const char *pstrWindowsLineName = "線段檢測"; // 從文件中加載原圖 Mat SrcImage = imread("D:/Circle.jpg", CV_LOAD_IMAGE_UNCHANGED);? // 灰度圖 Mat GrayImage= Mat(Size(SrcImage.rows, SrcImage.cols), CV_8SC1);//CV_32FC1); //cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY); // 邊緣圖 Mat CannyImage= Mat(Size(SrcImage.rows, SrcImage.cols), CV_8SC1);//CV_32FC1);? cvCanny(pGrayImage, pCannyImage, 30, 90); //1、使用了Canny檢測的方法!!! //cvSmooth(pCannyImage, pCannyImage); //線段檢測(只能針對二值圖像) //以下代碼待修改!!!! CvMemStorage *pcvMStorage = cvCreateMemStorage(); double fRho = 1; double fTheta = CV_PI / 180; int nMaxLineNumber = 50; //最多檢測條直線 double fMinLineLen = 50; //最小線段長度 double fMinLineGap = 10; //最小線段間隔 CvSeq *pcvSeqLines = cvHoughLines2(pCannyImage, pcvMStorage, CV_HOUGH_PROBABILISTIC, fRho, fTheta, nMaxLineNumber, fMinLineLen, fMinLineGap); // 繪制線段 IplImage *pColorImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 3); cvCvtColor(pCannyImage, pColorImage, CV_GRAY2BGR); for(int i = 0; i < pcvSeqLines->total; i++) { CvPoint* line = (CvPoint*)cvGetSeqElem(pcvSeqLines, i); cvLine(pColorImage, line[0], line[1], CV_RGB(255,0,0), 2); } cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE); cvShowImage(pstrWindowsSrcTitle, pSrcImage); cvNamedWindow(pstrWindowsLineName, CV_WINDOW_AUTOSIZE); cvShowImage(pstrWindowsLineName, pColorImage); cvReleaseMemStorage(&pcvMStorage); cvDestroyWindow(pstrWindowsSrcTitle); cvDestroyWindow(pstrWindowsLineName); //cvReleaseImage(&pSrcImage); //cvReleaseImage(&pGrayImage); //cvReleaseImage(&pCannyImage); //cvReleaseImage(&pColorImage); cvWaitKey(0);? return 0; }
引用原結果:
????????
Hough圓檢測的代碼:
#include <opencv2/opencv.hpp> using namespace std; #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") int main() { const char *pstrWindowsSrcTitle = "原圖(http://blog.csdn.net/MoreWindows)"; const char *pstrWindowsLineName = "圓檢測"; // 從文件中加載原圖 IplImage *pSrcImage = cvLoadImage("201.jpg", CV_LOAD_IMAGE_UNCHANGED); // 灰度圖 IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1); cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY); //cvSmooth(pGrayImage, pGrayImage); // 圓檢測(灰度圖) CvMemStorage *pcvMStorage = cvCreateMemStorage(); double fMinCircleGap = pGrayImage->height / 10; CvSeq *pcvSeqCircles = cvHoughCircles(pGrayImage, pcvMStorage, CV_HOUGH_GRADIENT, 1, fMinCircleGap); //每個圓由三個浮點數表示:圓心坐標(x,y)和半徑 // 繪制直線 IplImage *pColorImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 3); cvCvtColor(pGrayImage, pColorImage, CV_GRAY2BGR); int i; for (i = 0; i < pcvSeqCircles->total; i++) { float* p = (float*)cvGetSeqElem(pcvSeqCircles, i); cvCircle(pColorImage, cvPoint(cvRound(p[0]), cvRound(p[1])), cvRound(p[2]), CV_RGB(255, 0, 0), 2); } cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE); cvShowImage(pstrWindowsSrcTitle, pSrcImage); cvNamedWindow(pstrWindowsLineName, CV_WINDOW_AUTOSIZE); cvShowImage(pstrWindowsLineName, pColorImage); cvWaitKey(0); cvReleaseMemStorage(&pcvMStorage); cvDestroyWindow(pstrWindowsSrcTitle); cvDestroyWindow(pstrWindowsLineName); cvReleaseImage(&pSrcImage); cvReleaseImage(&pGrayImage); cvReleaseImage(&pColorImage); return 0; }快速檢測矩形的題目可以借鑒上述OpenCV原型里面的算法.....
待完成.....
han?and?zhu (2005)提出使用潛在的匹配矩形形狀和嵌套結構(矩形和消失點之間)的語法來推導?矩形框?最有可能的對應線段...
計算機視覺:算法與應用?p196-p197
總結
以上是生活随笔為你收集整理的图像局部显著性—线特征的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 仙茅的功效!(仙茅的功效与作用)
- 下一篇: 川剧《脸书》是什么意思