⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opencv用户手册之图像处理部分(之一):梯度、边缘与角点(中文翻译) - hunnish的opencv专栏.htm

📁 Opencv的中文参考指南
💻 HTM
📖 第 1 页 / 共 3 页
字号:

<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( &amp;corners );
cvReleaseImage( &amp;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 + -