1. 程式人生 > >常用函式_影象處理_OpenCV(2)

常用函式_影象處理_OpenCV(2)

cvThreshold

        作用:函式 cvThreshold 對單通道陣列應用固定閾值操作。該函式的典型應用是對灰度影象進行閾值操作得到二值影象。(cvCmpS 也可以達到此目的) 或者是去掉噪聲,例如過濾很小或很大象素值的影象點。本函式支援的對影象取閾值的方法由 threshold_type 確定。
形式:

void cvThreshold( const CvArr* src, CvArr* dst, doublethreshold, double max_value,
                  int threshold_type );
       引數說明:
          src:原始陣列 (單通道 , 8-bit of 32-bit 浮點數)。dst:輸出陣列,必須與 src 的型別一致,或者為 8-bit。
          threshold:閾值
          max_value:使用 CV_THRESH_BINARY 和CV_THRESH_BINARY_INV 的最大值。
          threshold_type:閾值型別 threshold_type=CV_THRESH_BINARY:
           如果 src(x,y)>threshold ,dst(x,y) = max_value; 否則,dst(x,y)=0;
          threshold_type=CV_THRESH_BINARY_INV:
           如果 src(x,y)>threshold,dst(x,y) = 0; 否則,dst(x,y) = max_value.
          threshold_type=CV_THRESH_TRUNC:
           如果 src(x,y)>threshold,dst(x,y) =threshold; 否則dst(x,y) = src(x,y).
          threshold_type=CV_THRESH_TOZERO:
           如果src(x,y)>threshold,dst(x,y) =src(x,y) ; 否則 dst(x,y) = 0。
          threshold_type=CV_THRESH_TOZERO_INV:
           如果 src(x,y)>threshold,dst(x,y) = 0 ; 否則dst(x,y) = src(x,y)。

二、cvAdaptiveThreshold

void cvAdaptiveThreshold(const CvArr* src,CvArr* dst,double max_value,
int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C,int threshold_type =CV_THRESH_BINARY,
int block_size=3,double param1=5 );
         自適應閾值在每個畫素點的值都不同。通過計算畫素點周圍的bxb區域的加權平均,然後減去一個常數來得到自適應閾值,b由block_size指定,常數由param1指定。關鍵是裡面的block_size引數,該引數是決定區域性閾值的block的大小,當block很小時,如block_size=3 or 5 or 7時,“自適應”的程度很高,即容易出現block裡面的畫素值都差不多,這樣便無法二值化,而只能在邊緣等梯度大的地方實現二值化,結果顯得它是邊緣提取函式。當把block_size設為比較大的值時,如block_size=21 or 31 or 41時,                        cvAdaptiveThreshold便是二值化函式啦~
         CV_ADAPTIVE_THRESH_MEAN_C:對區域的所有畫素的平均加權;
         CV_ADAPTIVE_THRESH_GAUSSIAN_C:根據高斯函式按照他們離中心點的距離進行加權平均。

三、cvCvtColor

         是Opencv裡的顏色空間轉換函式,可以實現RGB顏色向HSV,HSI等顏色空間的轉換,也可以轉換為灰度影象。引數CV_BGR2GRAY是RGB到gray,引數 CV_GRAY2BGR是gray到RGB.處理結果是彩色的,則轉灰色就是了:

void cvCvtColor( const CvArr* src, CvArr* dst, int code );
         src:輸入的 8-bit,16-bit或 32-bit單倍精度浮點數影像。
         dst:輸出的8-bit, 16-bit或 32-bit單倍精度浮點數影像。
         code:色彩空間轉換的模式,該code來實現不同型別的顏色空間轉換。比如CV_BGR2GRAY表示轉換為灰度圖,CV_BGR2HSV將圖片從RGB空間轉換為HSV空間。其中當code選用CV_BGR2GRAY時,dst需要是單通道圖片。當code選用CV_BGR2HSV時,對於8點陣圖,需要將RGB值歸一化到0-1之間。這樣得到HSV圖中的H範圍才是0-360,S和V的範圍是0-1。
         函式使用範例,這裡給出將RGB影象轉換為灰度和HSV的例子:
IplImage *src = cvLoadImage("4085_1.jpg",1);//原圖
IplImage *dst_gray = cvCreateImage(cvGetSize(src),src->depth,1);//灰度圖
IplImage *dst_image = cvCreateImage(cvGetSize(src),32,src->nChannels);
IplImage *src_image_32 = cvCreateImage(cvGetSize(src),32,src->nChannels);
//這兩個圖需要是32浮點位的,因為對原圖進行歸一化後得到的是浮點數
cvCvtColor(src,dst_gray,CV_BGR2GRAY);//得到灰度圖
cvConvertScale(src,src_image_32,1.0/255.0,0);//將原圖RGB歸一化到0-1之間
cvCvtColor(src_image_32,dst_image,CV_BGR2HSV);//得到HSV圖

四、cvCanny

        開放計算機視覺(OpenCV)庫庫函式之一,用於對影象的邊緣檢測(採用canny演算法)。

void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 );
引數說明:
       image 輸入影象(可以是彩色影象)
       edges 輸出的邊緣影象 ,也是單通道的,但是是黑白的
       threshold1 第一個閾值
threshold2 第二個閾值
aperture_size Sobel 運算元核心大小
函式 cvCanny 採用 Canny 演算法發現輸入影象的邊緣而且在輸出影象中標識這些邊緣。threshold1和threshold2 當中的小閾值用來控制邊緣連線,大的閾值用來控制強邊緣的初始分割。需要注意的是canny需要輸入的是灰度影象,所以我們在使用canny之前要使用cvCvtColor將之轉換為灰度影象。canny運算元得實質:如果一個畫素的梯度大與上限值,則被認為是邊緣畫素,如果小於下限閾值,則被拋棄,那麼如果該店的梯度位於兩者之間呢?則當其與高於上限值的畫素點連線時我們才保留,否則刪除。

五、cvHoughLines2

       說明:此函式是opencv影象變換函式中的一個,主要用來訪問霍夫變換的兩個演算法———標準霍夫變換(SHT)和累計概率霍夫變換(PPHT)。
       函式原型:

CvSeq* cvHoughLines2(CvArr* image,void* line_storage,int mehtod,double rho,double theta
                     ,int threshold,double param1 =0,double param2 =0);

    引數說明

       image:輸入 8-位元、單通道 (二值) 影象,當用CV_HOUGH_PROBABILISTIC方法檢測的時候其內容會被函式改變。
       line_storage:檢測到的線段儲存倉. 可以是記憶體儲存倉 (此種情況下,一個線段序列在儲存倉中被建立,並且由函式返回),或者是包含線段引數的特殊型別(見下面)的具有單行/單列的矩陣(CvMat*)。矩陣頭為函式所修改,使得它的 cols/rows 將包含一組檢測到的線段。如果 line_storage 是矩陣,而實際線段的數目超過矩陣尺寸,那麼最大可能數目的線段被返回(線段沒有按照長度、可信度或其它指標排序).
       method:Hough 變換變數,是下面變數的其中之一:
               (1)CV_HOUGH_STANDARD - 傳統或標準 Hough 變換. 每一個線段由兩個浮點數 (ρ, θ) 表示,其中 ρ 是直線與原點 (0,0) 之間的距離,θ 線段與 x-軸之間的夾角。因此,矩陣型別必須是 CV_32FC2 type.
               (2)CV_HOUGH_PROBABILISTIC - 概率 Hough 變換(如果影象包含一些長的線性分割,則效率更高). 它返回線段分割而不是整個線段。每個分割用起點和終點來表示,所以矩陣(或建立的序列)型別是 CV_32SC4.
               (3)CV_HOUGH_MULTI_SCALE - 傳統 Hough 變換的多尺度變種。線段的編碼方式與 CV_HOUGH_STANDARD 的一致。
rho:與畫素相關單位的距離精度
theta:弧度測量的角度精度
threshold:閾值引數。如果相應的累計值大於 threshold, 則函式返回這條線段.
param1:第一個方法相關的引數:對傳統 Hough 變換,不使用(0).對概率 Hough 變換,它是最小線段長度.對多尺度 Hough 變換,它是距離精度 rho 的分母 (大致的距離精度是 rho 而精確的應該是 rho / param1 ).
param2:第二個方法相關引數:對傳統 Hough 變換,不使用 (0).對概率 Hough 變換,這個引數表示在同一條直線上進行碎線段連線的最大間隔值(gap), 即當同一條直線上的兩條碎線段之間的間隔小於param2時,將其合二為一。對多尺度 Hough 變換,它是角度精度 theta 的分母 (大致的角度精度是 theta 而精確的角度應該是 theta / param2)

六、cvLine

OPENCV繪圖函式,功能:繪製連線兩個點的線段
函式原型:

void cvLine( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
img 影象。
pt1 線段的第一個端點。
pt2 線段的第二個端點。
color 線段的顏色。
thickness 線段的粗細程度。
line_type 線段的型別。
8 (or 0) - 8-connected line(8鄰接)連線線。
4 - 4-connected line(4鄰接)連線線。
CV_AA - antialiased 線條。
shift 座標點的小數點位數。
函式cvLine 在影象中的點1和點2之間畫一條線段。線段被影象或感興趣的矩形(ROI rectangle)所裁剪。對於具有整數座標的non-antialiasing 線條,使用8-連線或者4-連線Bresenham 演算法。畫粗線條時結尾是圓形的。畫 antialiased 線條使用高斯濾波。要指定線段顏色,使用者可以使用使用巨集CV_RGB( r, g, b )。
而且指定線條顏色的時候用到的巨集CV_RGB(r,g,b)定義為#define CV_RGB( r, g, b ) cvScalar( (b), (g), (r), 0 ),由此可見,實際上起作用的顏色是看cvScalar中的b,g,r順序,線段顏色就不言而喻了

七、cvCircle

定義

void cvCircle( CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
引數
•img 影象
•center 圓心座標
•radius 圓形的半徑
•color 線條的顏色
•thickness 如果是正數,表示組成圓的線條的粗細程度。否則,表示圓是否被填充
•line_type 線條的型別。見 cvLine 的描述
•shift 圓心座標點和半徑值的小數點位數
解釋
函式cvCircle繪製或填充一個給定圓心和半徑的圓。圓被感興趣矩形所裁剪。 若指定圓的顏色,可以使用巨集 CV_RGB ( r, g, b )。

八、cvHoughCircles

CvSeq *cvHoughCircles(CvArr *image,void *circle_storage,int method,double dp,double min_dist,double param1,double param2,int min_radius,int max_radius)
引數
        image:輸入8bit(灰度)影象,其內容可被函式所改變
        circle_storage:檢測到的圓儲存倉,可以是記憶體儲存倉 (此種情況下,一個線段序列在儲存倉中被建立,並且由函式返回)或者是包含圓引數的特殊型別的具有單行/單列的             CV_32FC3型矩陣(CvMat*). 矩陣頭為函式所修改,使得它的 cols/rows 將包含一組檢測到的圓。如果 circle_storage 是矩陣,而實際圓的數目超過矩陣尺寸,那麼最大可能數目的圓被返回,每個圓由三個浮點數表示:圓心座標(x,y)和半徑.).
         method:Hough 變換方式,目前只支援CV_HOUGH_GRADIENT
         dp:尋找圓弧圓心的累計解析度,這個引數允許建立一個比輸入影象解析度低的累加器。(這樣做是因為有理由認為影象中存在的圓會自然降低到與影象寬高相同數量的範疇)。如果dp設定為1,則解析度是相同的;如果設定為更大的值(比如2),累加器的解析度受此影響會變小(此情況下為一半)。dp的值不能比1小。
         min_dist:該引數是讓演算法能明顯區分的兩個不同圓之間的最小距離。
         param1:用於Canny的邊緣閥值上限,下限被置為上限的一半。
         param2:累加器的閥值。
         min_radius:最小圓半徑。
         max_radius:最大圓半徑。