zoukankan      html  css  js  c++  java
  • OPENCV用户手册之图像处理部分(之四):滤波器与色彩转换(中文翻译)

    2004年09月06日 10:17:00

    滤波器与色彩转换

    HUNNISH 注:

    本翻译是直接根据 OpenCV Beta 4.0 版本的用户手册翻译的,原文件是:<opencv_directory>/doc/ref/opencvref_cv.htm, 可以从 SOURCEFORG 上面的 OpenCV 项目下载,也可以直接从 阿须数码 中下载:http://www.assuredigit.com/incoming/sourcecode/opencv/chinese_docs/ref/opencvref_cv.htm

    翻译中肯定有不少错误,另外也有些术语和原文语义理解不透导致翻译不准确或者错误,也请有心人赐教。翻译这些英文参考手册的目的是想与国内 OPENCV 的爱好者一起提高 OPENCV 在计算机视觉、模式识别和图像处理方面的实际应用水平


    Smooth

    各种方法的图像平滑

    void cvSmooth( const CvArr* src, CvArr* dst,               int smoothtype=CV_GAUSSIAN,               int param1=3, int param2=0, double param3=0 );
    
    src
    输入图像.
    dst
    输出图像.
    smoothtype
    平滑方法:
    • CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素领域 param1×param2 求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。
    • CV_BLUR (simple blur) - 对每个象素邻域 param1×param2 求和并做尺度变换 1/(param1"param2).
    • CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积
    • CV_MEDIAN (median blur) - 发现邻域 param1×param1 的中值 (i.e. 邻域是方的).
    • CV_BILATERAL (双滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 关于双向滤波,可参考 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html
    param1
    平滑操作的第一个参数.
    param2
    平滑操作的第二个参数. param2 为零对应简单的尺度变换和高斯模糊。
    param3
    对应高斯参数的 Gaussian sigma (标准差). 如果为零,这由下面的核尺寸计算:
                  sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核,                                                n=param2 对应垂直核.              
    
    对小的卷积核 (3×3 to 7×7) 使用标准 sigma 速度会快。如果 param3 不为零,而 param1param2 为零,则核大小有 sigma 计算 (以保证足够精确的操作).

    函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。

    没有缩放的图像平滑仅支持单通道图像,并且支持8位、16位、32位和32位浮点格式。

    简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮点图像。这两种方法可以(in-place)方式处理图像。

    中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像.


    Filter2D

    对图像做卷积

    void cvFilter2D( const CvArr* src, CvArr* dst,                 const CvMat* kernel,                 CvPoint anchor=cvPoint(-1,-1));#define cvConvolve2D cvFilter2D
    
    src
    输入图像.
    dst
    输出图像.
    kernel
    卷积核, 单通道浮点矩阵. 如果想要应用不同的核于不同的通道,先用 cvSplit 函数分解图像到单个色彩通道上,然后单独处理。
    anchor
    核的锚点表示一个被滤波的点在核内的位置。 锚点应该处于核内部。缺省值 (-1,-1) 表示锚点在核中心。

    函数 cvFilter2D 对图像进行线性滤波,支持 In-place 操作。当开孔部分位于图像外面时,函数从最近邻的图像内部象素差值得到边界外面的象素值。


    Integral

    计算积分图像

    void cvIntegral( const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tilted_sum=NULL );
    
    image
    输入图像, W×H, 单通道,8位或浮点 (32f 或 64f).
    sum
    积分图像, W+1×H+1, 单通道,32位整数或 double 精度的浮点数(64f).
    sqsum
    对象素值平方的积分图像,W+1×H+1, 单通道,32位整数或 double 精度的浮点数 (64f).
    tilted_sum
    旋转45度的积分图像,单通道,32位整数或 double 精度的浮点数 (64f).

    函数 cvIntegral 计算一次或高次积分图像:

    sum(X,Y)=sumx<X,y<Yimage(x,y)sqsum(X,Y)=sumx<X,y<Yimage(x,y)2tilted_sum(X,Y)=sumy<Y,abs(x-X)<yimage(x,y)
    

    利用积分图像,可以方便得到某个区域象素点的和、均值、标准方差或在 0(1) 的选择角度。例如:


    sumx1<=x<x2,y1<=y<y2image(x,y)=sum(x2,y2)-sum(x1,y2)-sum(x2,y1)+sum(x1,x1)

    因此可以在变化的窗口内做快速平滑或窗口相关。


    CvtColor

    色彩空间转换

    void cvCvtColor( const CvArr* src, CvArr* dst, int code );
    
    src
    输入的 8-比特 或浮点图像.
    dst
    输出的 8-比特 或浮点图像.
    code
    色彩空间转换,通过定义 CV_<src_color_space>2<dst_color_space> 常数 (见下面).

    函数 cvCvtColor 将输入图像从一个色彩空间转换为另外一个色彩空间。函数忽略 IplImage 头中定义的 colorModelchannelSeq 域,所以输入图像的色彩空间应该正确指定 (包括通道的顺序,对RGB空间而言,BGR 意味着 24-位格式,其排列为 B0 G0 R0 B1 G1 R1 ... 层叠,而 RGB 意味着 24-位格式,其排列为 R0 G0 B0 R1 G1 B1 ... 层叠). 函数做如下变换:

    • RGB 空间内部的变换,如增加/删除 alpha 通道,反相通道顺序,16位  RGB彩色变换(Rx5:Gx6:Rx5),以及灰度图像的变换,使用:
      RGB[A]->Gray: Y=0.212671*R + 0.715160*G + 0.072169*B + 0*AGray->RGB[A]: R=Y G=Y B=Y A=0
      

      所有可能的图像色彩空间的相互变换公式列举如下:

    • RGB<=>XYZ (CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB):
      |X|   |0.412411  0.357585  0.180454| |R||Y| = |0.212649  0.715169  0.072182|*|G||Z|   |0.019332  0.119195  0.950390| |B||R|   | 3.240479  -1.53715  -0.498535| |X||G| = |-0.969256   1.875991  0.041556|*|Y||B|   | 0.055648  -0.204043  1.057311| |Z|
      
    • RGB<=>YCrCb (CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB)
      Y=0.299*R + 0.587*G + 0.114*BCr=(R-Y)*0.713 + 128Cb=(B-Y)*0.564 + 128R=Y + 1.403*(Cr - 128)G=Y - 0.344*(Cr - 128) - 0.714*(Cb - 128)B=Y + 1.773*(Cb - 128)
      
    • RGB=>HSV (CV_BGR2HSV,CV_RGB2HSV)
      V=max(R,G,B)S=(V-min(R,G,B))*255/V   if V!=0, 0 otherwise       (G - B)*60/S,  if V=RH= 180+(B - R)*60/S,  if V=G   240+(R - G)*60/S,  if V=Bif H<0 then H=H+360
      

      使用上面从 0° 到 360° 变化的公式计算色调(hue)值,确保它们被 2 除后能试用于8位。

    • RGB=>Lab (CV_BGR2Lab, CV_RGB2Lab)
      |X|   |0.433910  0.376220  0.189860| |R/255||Y| = |0.212649  0.715169  0.072182|*|G/255||Z|   |0.017756  0.109478  0.872915| |B/255|L = 116*Y1/3      for Y>0.008856L = 903.3*Y      for Y<=0.008856a = 500*(f(X)-f(Y))b = 200*(f(Y)-f(Z))where f(t)=t1/3              for t>0.008856      f(t)=7.787*t+16/116   for t<=0.008856
      
      上面的公式可以参考 http://www.cica.indiana.edu/cica/faq/color_spaces/color.spaces.html
    • Bayer=>RGB (CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR,
      CV_BayerBG2RGB, CV_BayerRG2BGR, CV_BayerGB2RGB, CV_BayerGR2BGR,
      CV_BayerRG2RGB, CV_BayerBG2BGR, CV_BayerGR2RGB, CV_BayerGB2BGR)

      Bayer 模式被广泛应用于 CCD 和 CMOS 摄像头. 它允许从一个单独平面中得到彩色图像,该平面中的 R/G/B 象素点被安排如下:

      R

      G

      R

      G

      R

      G

      B

      G

      B

      G

      R

      G

      R

      G

      R

      G

      B

      G

      B

      G

      R

      G

      R

      G

      R

      G

      B

      G

      B

      G

      The output RGB components of a pixel are interpolated from 1, 2 or 4 neighbors of the pixel having the same color. There are several modifications of the above pattern that can be achieved by shifting the pattern one pixel left and/or one pixel up. The two letters C1 and C2 in the conversion constants CV_BayerC1C22{BGR|RGB} indicate the particular pattern type - these are components from the second row, second and third columns, respectively. For example, the above pattern has very popular "BG" type.


    Threshold

    对数组元素进行固定阈值操作

    void cvThreshold( const CvArr* src, CvArr* dst, double threshold,                  double max_value, int threshold_type );
    
    src
    原始数组 (单通道, 8-比特 of 32-比特 浮点数).
    dst
    输出数组,必须与 src 的类型一致,或者为 8-比特.
    threshold
    阈值
    max_value
    使用 CV_THRESH_BINARYCV_THRESH_BINARY_INV 的最大值.
    threshold_type
    阈值类型 (见讨论)

    函数 cvThreshold 对单通道数组应用固定阈值操作。典型的是对灰度图像进行阈值操作得到二值图像。(cvCmpS 也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点。有好几种对图像取阈值的方法,本函数支持的方法由 threshold_type 确定:

    threshold_type=CV_THRESH_BINARY:dst(x,y) = max_value, if src(x,y)>threshold           0, otherwisethreshold_type=CV_THRESH_BINARY_INV:dst(x,y) = 0, if src(x,y)>threshold           max_value, otherwisethreshold_type=CV_THRESH_TRUNC:dst(x,y) = threshold, if src(x,y)>threshold           src(x,y), otherwisethreshold_type=CV_THRESH_TOZERO:dst(x,y) = src(x,y), if (x,y)>threshold           0, otherwisethreshold_type=CV_THRESH_TOZERO_INV:dst(x,y) = 0, if src(x,y)>threshold           src(x,y), otherwise
    

    下面是图形化的阈值描述:


    AdaptiveThreshold

    自适应阈值方法

    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 );
    
    src
    输入图像.
    dst
    输出图像.
    max_value
    使用 CV_THRESH_BINARYCV_THRESH_BINARY_INV 的最大值.
    adaptive_method
    自适应阈值算法使用:CV_ADAPTIVE_THRESH_MEAN_CCV_ADAPTIVE_THRESH_GAUSSIAN_C (见讨论).
    threshold_type
    取阈值类型:必须是下者之一
    • CV_THRESH_BINARY,
    • CV_THRESH_BINARY_INV
    block_size
    用来计算阈值的象素邻域大小: 3, 5, 7, ...
    param1
    与方法有关的参数。对方法 CV_ADAPTIVE_THRESH_MEAN_CCV_ADAPTIVE_THRESH_GAUSSIAN_C, 它是一个从均值或加权均值提取的常数(见讨论), 尽管它可以是负数。

    函数 cvAdaptiveThreshold 将灰度图像变换到二值图像,采用下面公式:

    threshold_type=CV_THRESH_BINARY:dst(x,y) = max_value, if src(x,y)>T(x,y)           0, otherwisethreshold_type=CV_THRESH_BINARY_INV:dst(x,y) = 0, if src(x,y)>T(x,y)           max_value, otherwise
    

    其中 TI 是为每一个象素点单独计算的阈值

    对方法 CV_ADAPTIVE_THRESH_MEAN_C,它是 block_size × block_size 块中的象素点,被参数 param1 所减,得到的均值,

    对方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C 它是 block_size × block_size 块中的象素点,被参数 param1 所减,得到的加权和(gaussian)。



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=95534


  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/feisky/p/1586561.html
Copyright © 2011-2022 走看看