?? opencv用戶手冊之圖像處理部分(之一):梯度、邊緣與角點(中文翻譯) - hunnish的opencv專欄.htm
字號:
<H2>梯度、邊緣和角點</H2>
<P>翻譯:HUNNISH, <A href="http://www.assuredigit.com/"><FONT
color=#000080>阿須數碼</FONT></A></P>
<P>
<HR>
<P></P>
<H3><A name=decl_cvSobel>Sobel</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">使用擴展</SPAN><SPAN
lang=EN-US> Sobel </SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">算子計算一階、二階、三階或混合圖像差分</SPAN></P><PRE>void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );
</PRE>
<P>
<DL>
<DT>src
<DD>輸入圖像.
<DT>dst
<DD>輸出圖像.
<DT>xorder
<DD>x? 方向上的差分階數
<DT>yorder
<DD><SPAN lang=EN-US>y? 方向上的差分階數</SPAN>
<DT>aperture_size
<DD>擴展<SPAN lang=EN-US> Sobel 核的大小,必須是 1, 3, 5 或 7。 除了尺寸為 1, 其它情況下,
aperture_size ×aperture_size 可分離內核將用來計算差分。對 aperture_size=1的情況, 使用 3x1 或 1x3
內核 (不進行高斯平滑操作)。有一個特殊變量? CV_SCHARR (=-1),對應 3x3 Scharr 濾波器,可以給出比 3x3 Sobel
濾波更精確的結果。Scharr 濾波器系數是:</SPAN> <PRE>| -3 0 3|
|-10 0 10|
| -3 0 3|
</PRE>對<SPAN lang=EN-US> x-方向 以及轉置矩陣對 y-方向。</SPAN> </DD></DL>
<P>函數 <SPAN lang=EN-US><A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvSobel">cvSobel</A>
通過對圖像用相應的內核進行卷積操作來計算圖像差分:</SPAN></P><PRE>dst(x,y) = d<SUP>xorder+yoder</SUP>src/dx<SUP>xorder</SUP>?dy<SUP>yorder</SUP> |<SUB>(x,y)</SUB>
</PRE>
<P><SPAN lang=EN-US>Sobel 算子結合 Gaussian 平滑和微分,以提高計算結果對噪聲的抵抗能力。通常情況,函數調用采用如下參數
(xorder=1, yorder=0, aperture_size=3) 或 (xorder=0, yorder=1, aperture_size=3)
來計算一階 x- 或 y- 方向的圖像差分。第一種情況對應:</SPAN> </P><PRE> |-1 0 1|
|-2 0 2|
|-1 0 1|
</PRE>
<P>核。第二種對應</P><PRE> |-1 -2 -1|
| 0 0 0|
| 1 2 1|
or
| 1 2 1|
| 0 0 0|
|-1 -2 -1|
</PRE>
<P>核,它依賴于圖像原點的定義<SPAN lang=EN-US> (</SPAN><CODE><SPAN
lang=EN-US>origin</SPAN></CODE><SPAN lang=EN-US> 來自 </SPAN><CODE><SPAN
lang=EN-US>IplImage</SPAN></CODE><SPAN lang=EN-US>
結構的定義)。不進行圖像尺度變換。所以輸出圖像通常比輸入圖像大。為防止溢出,當輸入圖像是 8 位的,要求輸出圖像是 16 位的。產生的圖像可以用函數 <A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvConvertScale">cvConvertScale</A>
或 <A
href="file:///D:/紼嬪簭/OpenCV/docs/ref/opencvref_cxcore.htm#decl_cvConvertScaleAbs">cvConvertScaleAbs</A>
轉換為 8 位的。除了 8-比特 圖像,函數也接受 32-位 浮點數圖像。所有輸入和輸出圖像都必須是單通道,且圖像大小或ROI尺寸一致。</SPAN> </P>
<HR>
<H3><A name=decl_cvLaplace>Laplace</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">計算圖像的</SPAN><SPAN
lang=EN-US> Laplacian?</SPAN></P><PRE>void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size=3 );
</PRE>
<P>
<DL>
<DT>src
<DD>輸入圖像.
<DT>dst
<DD>輸出圖像.
<DT>aperture_size
<DD>核大小<SPAN lang=EN-US> (與 <A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvSobel">cvSobel</A>
中定義一樣).</SPAN> </DD></DL>
<P>函數 <SPAN lang=EN-US><A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvLaplace">cvLaplace</A>
計算輸入圖像的 Laplacian,方法是對用 sobel 算子計算的二階 x- 和 y- 差分求和:</SPAN></P><PRE>dst(x,y) = d<SUP>2</SUP>src/dx<SUP>2</SUP> + d<SUP>2</SUP>src/dy<SUP>2</SUP>
</PRE>
<P>對 <CODE><SPAN lang=EN-US>aperture_size</SPAN></CODE><SPAN lang=EN-US>=1
則給出最快計算結果,相當于對圖像采用如下內核做卷積:</SPAN></P><PRE>|0 1 0|
|1 -4 1|
|0 1 0|
</PRE>
<P>類似于 <SPAN lang=EN-US><A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvSobel">cvSobel</A>
函數,也不作圖像的尺度變換,而且支持輸入、輸出圖像類型一致。</SPAN></P>
<HR>
<H3><A name=decl_cvCanny>Canny</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">采用</SPAN><SPAN
lang=EN-US> Canny </SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">算法做邊緣檢測</SPAN></P><PRE>void cvCanny( const CvArr* image, CvArr* edges, double threshold1,
double threshold2, int aperture_size=3 );
</PRE>
<P>
<DL>
<DT>image
<DD>輸入圖像.
<DT>edges
<DD>輸出的邊緣圖像
<DT>threshold1
<DD>第一個閾值
<DT>threshold2
<DD>第二個閾值
<DT>aperture_size
<DD><SPAN lang=EN-US>Sobel 算子內核大小 (見 <A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvSobel">cvSobel</A>).</SPAN>
</DD></DL>
<P>函數 <SPAN lang=EN-US><A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvCanny">cvCanny</A>
采用 CANNY 算法發現輸入圖像的邊緣而且在輸出圖像中標識這些邊緣。小的閾值 </SPAN><CODE><SPAN
lang=EN-US>threshold1</SPAN></CODE><SPAN lang=EN-US>
用來控制邊緣連接,大的閾值用來控制強邊緣的初始分割。</SPAN></P>
<HR>
<H3><A name=decl_cvPreCornerDetect>PreCornerDetect</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">計算特征圖,用于角點檢測</SPAN></P><PRE>void cvPreCornerDetect( const CvArr* image, CvArr* corners, int aperture_size=3 );
</PRE>
<P>
<DL>
<DT>image
<DD>輸入圖像.
<DT>corners
<DD>保存角點坐標的數組
<DT>aperture_size
<DD><SPAN lang=EN-US>Sobel 算子的核大小(見<A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvSobel">cvSobel</A>).</SPAN>
</DD></DL>
<P>函數 <SPAN lang=EN-US><A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvPreCornerDetect">cvPreCornerDetect</A>
計算函數
D<SUB>x</SUB><SUP>2</SUP>D<SUB>yy</SUB>+D<SUB>y</SUB><SUP>2</SUP>D<SUB>xx</SUB>
- 2D<SUB>x</SUB>D<SUB>y</SUB>D<SUB>xy</SUB> 其中 D<SUB>?</SUB>
表示一階圖像差分,D<SUB>??</SUB> 表示二階圖像差分。 角點被認為是函數的局部最大值:</SPAN></P><PRE>// assuming that the image is 浮點數
IplImage* corners = cvCloneImage(image);
IplImage* dilated_corners = cvCloneImage(image);
IplImage* corner_mask = cvCreateImage( cvGetSize(image), 8, 1 );
cvPreCornerDetect( image, corners, 3 );
cvDilate( corners, dilated_corners, 0, 1 );
cvSubS( corners, dilated_corners, corners );
cvCmpS( corners, 0, corner_mask, CV_CMP_GE );
cvReleaseImage( &corners );
cvReleaseImage( &dilated_corners );
</PRE>
<HR>
<H3><A name=decl_cvCornerEigenValsAndVecs>CornerEigenValsAndVecs</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">計算圖像塊的特征值和特征向量,用于角點檢測</SPAN></P><PRE>void cvCornerEigenValsAndVecs( const CvArr* image, CvArr* eigenvv,
int block_size, int aperture_size=3 );
</PRE>
<P>
<DL>
<DT>image
<DD>輸入圖像.
<DT>eigenvv
<DD>保存結果的數組。必須比輸入圖像寬<SPAN lang=EN-US> 6 倍。</SPAN>
<DT>block_size
<DD>鄰域大小<SPAN lang=EN-US> (見討論).</SPAN>
<DT>aperture_size
<DD><SPAN lang=EN-US>Sobel 算子的核尺寸(見 <A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvSobel">cvSobel</A>).</SPAN>
</DD></DL>
<P>對每個象素,函數 <SPAN lang=EN-US><A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvCornerEigenValsAndVecs">cvCornerEigenValsAndVecs</A>
考慮 </SPAN><CODE><SPAN lang=EN-US>block_size</SPAN></CODE><SPAN lang=EN-US> ×
</SPAN><CODE><SPAN lang=EN-US>block_size</SPAN></CODE><SPAN lang=EN-US> 大小的鄰域
S(p),然后在鄰域上計算差分的相關矩陣:</SPAN></P><PRE> | sum<SUB>S(p)</SUB>(dI/dx)<SUP>2</SUP> sum<SUB>S(p)</SUB>(dI/dx?dI/dy)|
M = | |
| sum<SUB>S(p)</SUB>(dI/dx?dI/dy) sum<SUB>S(p)</SUB>(dI/dy)<SUP>2</SUP> |
</PRE>
<P>然后它計算矩陣的特征值和特征向量,并且按如下方式<SPAN lang=EN-US>(λ<SUB>1</SUB>, λ<SUB>2</SUB>,
x<SUB>1</SUB>, y<SUB>1</SUB>, x<SUB>2</SUB>,
y<SUB>2</SUB>)存儲這些值到輸出圖像中,其中<BR></SPAN><BR>λ<SUB>1</SUB>, λ<SUB>2</SUB> -
<CODE><SPAN lang=EN-US>M 的</SPAN></CODE>特征值,沒有排序<BR>(x<SUB>1</SUB>,
y<SUB>1</SUB>) - 特征向量,對 λ<SUB>1</SUB><BR>(x<SUB>2</SUB>, y<SUB>2</SUB>) - 特征向量,對
λ<SUB>2</SUB><BR></P>
<HR>
<H3><A name=decl_cvCornerMinEigenVal>CornerMinEigenVal</A></H3>
<P class=Blurb><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Helvetica; mso-hansi-font-family: Helvetica">計算梯度矩陣的最小特征值,用于角點檢測</SPAN></P><PRE>void cvCornerMinEigenVal( const CvArr* image, CvArr* eigenval, int block_size, int aperture_size=3 );
</PRE>
<P>
<DL>
<DT>image
<DD>輸入圖像.
<DT>eigenval
<DD>保存最小特征值的圖像<SPAN lang=EN-US>. 與輸入圖像大小一致</SPAN>
<DT>block_size
<DD>鄰域大小<SPAN lang=EN-US> (見討論</SPAN> <A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvCornerEigenValsAndVecs">cvCornerEigenValsAndVecs</A>).
<DT>aperture_size
<DD><SPAN lang=EN-US>Sobel 算子的核尺寸(見 <A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvSobel">cvSobel</A>).
當輸入圖像是浮點數格式時,該參數表示用來計算差分的浮點濾波器的個數</SPAN>. </DD></DL>
<P>函數 <SPAN lang=EN-US><A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvCornerMinEigenVal">cvCornerMinEigenVal</A>
與 <A
href="file:///C:/DOCUME~1/user/LOCALS~1/Temp/FrontPageTempDir/pvw1.htm#decl_cvCornerEigenValsAndVecs">cvCornerEigenValsAndVecs</A>
類似,但是它僅僅計算和存儲每個象素點差分相關矩陣的最小特征值,即前一個函數的 min(λ<SUB>1</SUB>,
λ<SUB>2</SUB>)</SPAN></P>
<HR>
<H3><A name=decl_cvFindCornerSubPix>FindCornerSubPix</A></H3>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -