精华内容
下载资源
问答
  • 图像平滑处理

    千次阅读 2021-01-22 14:53:32
    目录图像平滑处理图像平滑处理原理图像平滑处理方法:均值滤波基本原理函数语法:dst=cv2.blue(src,ksize,anchor,borderType)例子方框滤波函数语法:dst=cv2.boxFilter(scr,ddepth,ksize,anchor,normalize,...


    图像平滑处理

    尽量保留图像原有信息的情况下,过滤图像内部的噪声,这一过程叫做图像的平滑处理。通过图像平滑处理,我们可以有效过滤掉图像内的噪声信息。对应英文为Soomthing Images,图像平滑处理经常伴随图像牧户操作,因此图像平滑处理有时也被称为图像模糊处理(Blurring Images)

    图像平滑处理原理

    对图像中与周围像素点的像素差异值较大的像素点进行处理,将其值调整为周围像素点像素值的近似值

    图像平滑处理方法:

    • 均值滤波
    • 方框滤波
    • 高斯滤波
    • 中值滤波
    • 双边滤波
    • 2D滤波(自定义滤波)

    均值滤波

    均值滤波指当前像素点周围N*N个像素值的均值来代替当前像素值,使用该方法遍历处理图像内的每一个像素点,即可完成整个图像的均值滤波

    基本原理

    先考虑对周围多少个像素点取平均值,以当前像素点为中心,对行数和列数相等的一块区域所有像素点的像素值进行取平均值。对于边缘像素点(如第一行第一列)可以只取图像内存在的周围邻域点的像素值均值(M*N越大,失真越严重)

    函数语法:dst=cv2.blue(src,ksize,anchor,borderType)

    dst是返回值,得到均值滤波处理结果。src是原始图像,可以由任意数量的通道。Ksize是滤波核大小(均值处理过程中,邻域图像高度和宽度)。Anchor是锚点,默认(-1,-1)表示当前计算均值的点位于核的中心点位置,一般采用默认值。BorderType是边界样式,决定了以何种方式处理边界,一般采用默认值
    所以cv2.blur()的一半形式为:cv2.blur(scr,ksize,)

    例子

    #均值滤波
    img=cv2.imread("C:\photo\lenaNoise.png")
    r1=cv2.blur(img,(9,9))
    r2=cv2.blur(img,(5,5))
    cv2.imshow("original",img)
    cv2.imshow("result_big",r1)
    cv2.imshow("result_small",r2)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

    在这里插入图片描述

    卷积核越大,去噪音效果越好,花费的运算时间越多,同时图像越失真

    方框滤波

    可以自由选择是否对均值滤波结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值还是邻域像素值之和,如果不进行归一化,则效果和均值滤波一样

    函数语法:dst=cv2.boxFilter(scr,ddepth,ksize,anchor,normalize,borderType)

    ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度
    Normalize表示是否需要进行归一化(0/1),1表示需要,0表示不需要进行归一化
    常用形式:cv2.boxFilter(scr,ddepth,ksize)

    例程

    #方框滤波
    img=cv2.imread("C:\photo\lenaNoise.png")
    r1=cv2.boxFilter(img,-1,(5,5))#使用归一化处理
    r2=cv2.boxFilter(img,-1,(5,5),normalize=0)#不使用归一化处理
    cv2.imshow("original",img)
    cv2.imshow("result_nor",r1)
    cv2.imshow("result",r2)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

    在这里插入图片描述

    使用归一化处理的图片接近白色,因为5*5像素之和一般都会超过当前最大值255

    高斯滤波

    在进行均值滤波和方框滤波,邻域内像素的权重都是相等的,在高斯滤波中,会将中心点的权重值加大,远离中心点的权重值减小
    在这里插入图片描述

    在此基础上计算邻域内各个像素值不同权重的和,在高斯滤波中核的长度和宽度可以不相等,但必须是奇数。在实际计算中,卷积核是要归一化处理的,严格来讲,没有归一化处理的卷积核进行滤波,得到的结果往往是错误的。

    函数语法 dst=cv2.GaussianBlur(scr,ksize,sigmaX,sigmaY,borderType)

    sigmaX是卷积核在水平方向上(X轴方向)的标准差,其控制的是权重比例,是必选参数
    sigmaY是卷积核在垂直方向上(Y轴方向)的标准差,如果将该值设置为0,则只采用sigmaX的值,如果sigmaX和sigmaY的值都为0,就通过ksize.width.height计算得到。
    Sigmax=0.3*[(ksize.width-1)0.5-1]+0.8
    sigmaY=0.3
    [(ksize.height-1)*0.5-1]+0.8
    常见形式:dst=cv2.GaussianBlur(src,ksize,0,0)#官方文档建议指定ksize、signmaX、signmaY三个参数的值,以避免将来函数修改后可能造成的语法错误,所以将其默认为0

    例子

    #高斯滤波
    img=cv2.imread("C:\photo\lenaNoise.png")
    r1=cv2.GaussianBlur(img,(7,5),0,0)
    cv2.imshow("original",img)
    cv2.imshow("reuslt",r1)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

    在这里插入图片描述

    中值滤波

    与之前三种处理方式不同,不再采用加权求平均值的方式来计算滤波结果,用邻域所有像素值的中间值来代替当前像素点的像素值

    基本原理

    采用当前像素点及周围邻近像素点(个数为奇数)的像素值,将这些像素值排列,然后将位于中间的像素值作为当前像素点的像素值

    函数语法:dst=cv2.medianBlur(scr,k size)

    例子

    #中值滤波
    img=cv2.imread("C:\photo\lenaNoise.png")
    r1=cv2.medianBlur(img,3)
    cv2.imshow("original",img)
    cv2.imshow("reuslt",r1)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

    在这里插入图片描述

    因为没有进行均值处理,所以不存在均值滤波带来的细节模糊问题,在中值滤波操作中,噪音很难被选上,可以在几乎不影响换图情况下去除全部噪音,但是由于要进行排序等操作,中值滤波需要的运算量较大

    双边滤波

    综合图像空间和色彩信息的滤波方式,在滤波过程中能有效保护图像内的边缘信息
    ###基本原理
    前面滤波只考虑空间的权重信息,计算起来比较方便,但是边缘信息的处理上存在较大问题。滤波处理过程中对邻域像素取均值会造成边界模糊,双边滤波在计算某一个像素点的新值时,不仅考虑距离问题(距离越远,权重越小),也考虑色彩信息(色彩差别越大,权重越小)。综合考虑距离和色彩的权重结果,既能有效去除噪音,也能较好保护边沿信息。处于边缘时,与当前色彩相近的像素点会被给予较大的权重值;而在与当前色彩差别较大的像素点会被给予较小的权重值,这样就保护了边缘信息。

    函数语法:dst=cv2.bilateralFilter(scr,d,sigmaColor,sigmaSpace,borderType)

    d是滤波时选取的空间距离参数,表示以当前像素点为中心的直径。如果非正数,则会自动从参数sigmaSpace中计算得到。如果滤波空间较大,推荐d=5.对于噪声较大的离线滤波,可以选择d=9;
    sigmaColor是滤波时选取的颜色差别范围,决定了周围哪些像素点能够参与滤波中来,与当前像素点的像素值小于sigmaColor时,就能参与到滤波中来,该值为0表示滤波失去意义,该值为255表示直径内所有点都能参与运算
    sigmaSpace是坐标中的sigma值,值越大,表明有越多的点能参与到滤波计算中,当d>0时,无论sigmaSpace的值如何,d都指定邻域大小,否则d与sigmaSpace成比例
    为了简单起见,可以将sigmaSpace和sigmaColor的值设置相同,如果他们的值较小,滤波效果就不明显,如果值较大,滤波效果会比较明显,产生卡通效果。

    例子

    #双边滤波
    img=cv2.imread("C:\photo\pie.png")
    g=r=cv2.GaussianBlur(img,(55,55),0,0)
    b=cv2.bilateralFilter(img,55,100,100)
    cv2.imshow("original",img)
    cv2.imshow("bilateralFilter",b)
    cv2.imshow("GaussianBlur",g)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

    在这里插入图片描述

    2D卷积

    使用特定的卷积核实现卷积操作,前面的滤波函数都无法将卷积核确定为特定形式,所以需要使用自定义卷积函数
    ###语法格式
    dst=cv2.filter2D(scr,ddrpth,kernel,anchor,delta,borderType)
    kernel是卷积核,是一个单通道的数组,如果想在处理彩色图像时,让每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作
    delta是修正值,是可选项,如果该值存在,会在基础滤波值上加上该值作为最终的滤波处理结果

    例子

    #2D卷积滤波
    img=cv2.imread("C:\photo\lenaNoise.png")
    kernel=np.ones((9,9),np.float32)/81
    r=cv2.filter2D(img,-1,kernel)
    cv2.imshow("original",img)
    cv2.imshow("filter2D",r)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

    在这里插入图片描述

    展开全文
  • 几种平滑处理方法

    万次阅读 2017-12-07 15:40:53
    平滑,也可叫滤波,或者合在一起叫平滑滤波,平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。空间域的平滑滤波一般采用简单平均法...“平滑处理”也称“模糊处理”(blurring),

    平滑,也可叫滤波,或者合在一起叫平滑滤波,平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。

    “平滑处理”也称“模糊处理”(blurring),是一项简单且使用频率很高的图像处理方法。平滑处理的用途很多,但最常见的是用来减少图像上的噪声或者失真。降低图像分辨率时,平滑处理是很重要的。

     

    #1,均值滤波【Simple Blurring】

    均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

    对噪声图像特别是有大的孤立点的图像非常敏感,即使有极少数量点存在较大差异也会导致平均值的明显波动。

     

    #2,中值滤波【Median Blurring】

    中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值,也就是将中心像素的值用所有像素值的中间值(不是平均值)替换。

    中值滤波通过选择中间值避免图像孤立噪声点的影响,对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。此外,中值滤波的算法比较简单,也易于用硬件实现。所以,中值滤波方法一经提出后,便在数字信号处理领得到重要的应用。

     

    #3,高斯滤波【Gaussian Blurring】

    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

    进行高斯滤波的通常原因是真实图像在空间内的像素是缓慢变化的,因此临近点的像素变化不会很明显,但是随机的两个点就可能形成很大的像素差。正是基于这一点,高斯滤波在保留信号的条件下减少噪声。遗憾的是,这种方法在接近边缘处就无效了,因此高斯滤波会破平边缘。但是,高斯平滑滤波器对于抑制服从正态分布的噪声仍然是非常有效的。

     

    #4,双边滤波【Bilateral Blurring】

    双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。双边滤波能够提供一种不会将边缘平滑掉的方法,但作为代价,需要更多的处理时间。

    与高斯滤波类似,双边滤波会依据每个像素及其领域构造一个加权平均值,加权计算包括两个部分,其中第一部分加权方式与高斯平滑中相同,第二部分也属于高斯加权,但不是基于中心像素点与其他像素点的空间距离之上的加权,而是基于其他像素与中心像素的亮度差值的加权。可以将双边滤波视为高斯平滑,对相似的像素赋予较高的权重,不相似的像素赋予较小的权重,也可用于图像分割之中。

    双边滤波器的好处是可以做边缘保存(edge preserving),一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。

    展开全文
  • VTK平滑处理

    千次阅读 2016-11-16 12:57:30
    图像平滑常用于图像的预处理中,如计算梯度时先对图像进行平滑处理,可以减少噪声对梯度的影响。图像平滑一般是通过模板卷积运算实现。模板可以看做是一个大小为nxn的小图像,例如3x3,5x5等等,模板的每个像素都对应...

    5.13 图像平滑

    图像平滑常用于图像的预处理中,如计算梯度时先对图像进行平滑处理,可以减少噪声对梯度的影响。图像平滑一般是通过模板卷积运算实现。模板可以看做是一个大小为nxn的小图像,例如3x3,5x5等等,模板的每个像素都对应一个系数值。模板卷积运算的过程是首先将模板中心依次与图像每个像素重合,通过模板各个系数与图像对应像素相乘来计算模板对应像素的加权平均值,最后将运算结果赋给图像中模板中心对应的像素。

    5.13.1 均值滤波

    均值滤波是一种经常用到的平滑方法,其对应的模板各个像素的值为1。在VTK中没有直接实现均值滤波的类,但是我们可以通过图像卷积运算来实现。卷积运算通过vtkImageConvolve类实现。通过vtkImageConvolve类,只需要设置相应的卷积模板,便可以实现多种空域图像滤波。下面代码说明了怎样使用vtkImageConvolve类来实现图像的均值滤波。

     

    1:      vtkSmartPointer<vtkJPEGReader>reader =

      2:         vtkSmartPointer<vtkJPEGReader>::New();

      3:     reader->SetFileName("lena2.jpg");

      4:      reader->Update();

      5:  

      6:     vtkSmartPointer<vtkImageCast> originalCastFilter =

      7:         vtkSmartPointer<vtkImageCast>::New();

      8:     originalCastFilter->SetInputConnection(reader->GetOutputPort());

      9:     originalCastFilter->SetOutputScalarTypeToFloat();

     10:     originalCastFilter->Update();

     11:  

     12:     vtkSmartPointer<vtkImageConvolve> convolveFilter =

     13:          vtkSmartPointer<vtkImageConvolve>::New();

     14:     convolveFilter->SetInputConnection(originalCastFilter->GetOutputPort());

     15:      double kernel[25] ={0.04,0.04,0.04,0.04,0.04,

     16:                      0.04,0.04,0.04,0.04,0.04,

     17:                       0.04,0.04,0.04,0.04,0.04,

     18:                      0.04,0.04,0.04,0.04,0.04,

     19:                      0.04,0.04,0.04,0.04,0.04};

     20:     convolveFilter->SetKernel5x5(kernel);

     21:     convolveFilter->Update();

     22:  

     23:      vtkSmartPointer<vtkImageCast>convCastFilter =

     24:         vtkSmartPointer<vtkImageCast>::New();

     25:     convCastFilter->SetInput(convolveFilter->GetOutput());

     26:     convCastFilter->SetOutputScalarTypeToUnsignedChar();

     27:      convCastFilter->Update();

     

    首先vtkJPEGReader对象读取一幅图像。考虑到进行卷积运算时数据范围的变化和精度要求,需要先将图像像素数据类型由unsigned char转换到float类型,该变换通过vtkImageCast实现,对应的设置函数SetOutputScalarTypeToFloat()。接下来需要定义卷积算子和卷积模板。vtkImageConvolve类实现图像的卷积运算,它需要两个输入。一个是需要进行卷积的图像,这里为vtkJPEGReader读取的图像数据,第二个是卷积模板数组。SetKernel5x5()函数接收一个5x5的卷积模板数组,即本例上定义的kernel数组。执行Update()后即可完成卷积运算。需要注意的是,卷积模板对应的系数之和应该为1,否则需要对计算结果进行归一化处理。另外该类中还定义了3x3和7x7的卷积模板设置函数,使用过程是一样的。卷积完成以后,再次通过vtkImageCast将float数据类型转换为unsigned char进行图像显示。均值滤波的结果如下。

     

    图5.31 均值滤波

    5.13.2 高斯平滑

    高斯平滑的原理类似于均值滤波。均值滤波模板的系数都是一样的,而高斯平滑则是需要根据像素与模板中心的距离来定义权重。权重的计算方法是采用高斯分布,离中心越远,权重越小。

     

    1:      vtkSmartPointer<vtkJPEGReader>reader =

      2:         vtkSmartPointer<vtkJPEGReader>::New();

      3:     reader->SetFileName("lena2.jpg");

      4:      reader->Update();

      5:   

      6:     vtkSmartPointer<vtkImageGaussianSmooth> gaussianSmoothFilter =

      7:         vtkSmartPointer<vtkImageGaussianSmooth>::New();

      8:     gaussianSmoothFilter->SetInputConnection(reader->GetOutputPort());

      9:      gaussianSmoothFilter->SetDimensionality(2);

     10:     gaussianSmoothFilter->SetRadiusFactor(5);

     11:     gaussianSmoothFilter->SetStandardDeviation(3);

     12:     gaussianSmoothFilter->Update();

     

    上面代码中说明了怎样使用vtkImageGaussianSmooth对图像做高斯平滑。vtkImageGaussianSmooth类默认是执行三维高斯滤波,SetDimensionality()根据需要设置相应的维数。SetRadiusFactor()用于设置高斯模板的大小,当超出该模板的范围时,系数取0;SetStandardDeviation()用于设置高斯分布函数的标准差。高斯平滑效果如下所示。

     

    图5.32 高斯平滑

    5.13.3 中值滤波

    vtkImageHybridMedian2D实现了对二维图像的中值滤波。其实现原理是,采用一个5x5的模板,逐次将模板中心对应于图像的每个像素上,将模板图像覆盖的像素的中值作为当前像素的输出值。

     

    1:   vtkSmartPointer<vtkJPEGReader> reader=

      2:    vtkSmartPointer<vtkJPEGReader>::New();

      3:  reader->SetFileName("lena2.jpg");

      4:   reader->Update();

      5:   

      6:   vtkSmartPointer<vtkImageHybridMedian2D>hybridMedian =

      7:    vtkSmartPointer<vtkImageHybridMedian2D>::New();

      8:  hybridMedian->SetInput(reader->GetOutput());

      9:   hybridMedian->Update();

     

    该类使用也非常简单,不需要用户设置任何参数。该方法能够有效的保持图像边缘,并对于椒盐噪声有较好的抑制作用。如下为该程序执行结果。对于三维图像,则使用vtkImageHybridMedian3D类。执行结果如下。

     

    图5.33 中值滤波

    5.13.4 各向异性扩散滤波

    高斯平滑方法在平滑噪声的同时,模糊了图像的重要边缘图像。各向异性滤波是一种基于偏微分方程的滤波技术,建立于热量的各向异性扩散理论。各向异性滤波在图像的平坦区域选择大尺度平滑,而边缘区域则选择小尺度的平滑,在抑制噪声的同时保持了图像的边缘信息。vtkImageAnisotropicDiffusion2D(vtkImageAnisotropicDiffusion3D)实现图像的各向异性扩散滤波,使用代码如下。

     

    1:    vtkSmartPointer<vtkJPEGReader> reader=

      2:     vtkSmartPointer<vtkJPEGReader>::New();

      3:    reader->SetFileName ("lena2.jpg" );

      4:  

      5:   vtkSmartPointer<vtkImageAnisotropicDiffusion2D> diffusion =

      6:      vtkSmartPointer<vtkImageAnisotropicDiffusion2D>::New();

      7:   diffusion->SetInputConnection(reader->GetOutputPort());

      8:   diffusion->SetNumberOfIterations(10);

      9:   diffusion->SetDiffusionThreshold(20);

     10:    diffusion->Update();

     

    vtkImageAnisotropicDiffusion2D类通过迭代方法实现,其中SetNumberOfIterations()用于设置迭代的次数;各向异性扩散滤波原理是在梯度较小的像素处进行较大幅度扩散,而在大梯度处则只进行细微的扩散。因此需要设置一个扩算的阈值DiffusionThreshold,这个阈值与图像的梯度有关。SetDiffusionThreshold()即是用来设置扩散阈值。该类中还有一个梯度标志GradientMagnitudeThreshold,用来设置梯度算子。当该标志开时梯度通过中心差分方法计算;当标志为关时,需要单独处理每个相邻像素。当像素与相邻像素梯度小于DiffusionThreshold时进行扩散处理。下图是对lena图像进行各向异性扩散滤波处理的结果。

     

    图5.34 各向异性扩散滤波

    展开全文
  • Mesh平滑处理的几种算法比较

    千次阅读 2021-01-05 00:06:49
    平滑处理设置为有利于提高系统性能或改进图象质量。(功能可以查看3Dmax blender等等) 网格平滑属于数字几何处理领域的问题,计算机图形学和计算机辅助设计中,用多边形网格可以表示复杂的三维实体。随着三维...

    平滑(smooth)

    3D平滑处理是一种减少锯齿(阶梯状线条)的技术。 平滑处理可设置为有利于提高系统性能或改进图象质量。(功能可以查看3Dmax
    blender等等)
    网格平滑属于数字几何处理领域的问题,计算机图形学和计算机辅助设计中,用多边形网格可以表示复杂的三维实体。随着三维扫描和曲面重建技术的发展,得到这些实体表面的多边形网格表示已经不是难事,但所得到的表面往往包含含噪声。在形状设计领域,在散乱点拟合和光滑形伏、纹理映射等应用领域,都有对平滑曲面的极大需求。故产生了网格平滑这一个研究点。

    如下图:
    处理前

    处理后

    平滑的算法多数是基于伞状结构的操作,所谓伞状结构,是以三角网格中某一个顶点P为中心,取所有与其相邻的顶点P1…Pn-1和边组成的一阶邻域结构,当然 为了方便于在O(1)的时间内获取点P的相邻点与相邻面,故需要提供辅助结构来存储这些邻接点面的信息(自定义)。如下图所示:
    mesh拓扑结构

    常用的平滑算法:拉普拉斯平滑、 基于曲率的平滑 基于曲率的平滑与拉普拉斯平滑的区别在于,基于曲率的平滑是沿着顶点P的法向量所在直线去移动P的,一般的拉普拉斯平滑会讲点P移动到类似于重心的位置,而基于曲率的平滑的移动位置是与法向量方向相反的,这样做的目的是要更好的保持模型原来的大致形状。

    拉普拉斯平滑(Laplacian Smooth):

    最基础的平滑,其他的平滑都是在拉普拉斯的基础上改进的。 最为基础的拉普拉斯平滑算法的实现,简单的拉普拉斯平滑算法的原理是将每个顶点都移动到相邻顶点的平均位置,即采用所谓伞状算子。

    在这里插入图片描述在这里插入图片描述

    1. 初始化Mesh的邻接点结构集
    2. 新建临时点集,用来存储点平滑后的位置
    3. 对所有Mesh中的顶点P
        1. 初始化临时向量为零向量
        2. 获取P的邻域点集Adj(P)
        3. 对所有领域点T,将其位置加到临时向量里
        4. 临时向量/=领域点集数
        5. 将临时向量的位置存入临时点集
    4. 对所有Mesh中的顶点P
        1. 将P的位置修改为临时点集中对应点的位置
    

    stepSmoothNum 整个算法(法线平滑+顶点拟合)的迭代次数。
    Boundary 一维边界平滑 仅自身平滑边界边(例如,形成网格边界的多段线独立平滑)。这可以减少边界上的收缩,但会对非常小的边界产生奇怪的影响。
    cotangentWeight 使用余切加权方案求位置的平均值。否则使用更简单的伞形方案(如果存在边,则为1)。

    拉普拉斯平滑算法有很多进一步的变形,首先在求取平均位置时,可以采用不同的加权策略,例如对不同的邻接点采用不同的权值。一般来说,距离中心点P较远的邻接点,我们可以让他对P平滑后的位置影响小一点。这样就可以采用一种距离的倒数为权值的拉普拉斯平滑。
    在这里插入图片描述

    有时为了控制平滑的速率,也会引入参数lambda来控制平滑的速率,即从原来所执行的:
    在这里插入图片描述
    转变成 在这里插入图片描述
    同时,平滑算法往往可以反复对Mesh执行,使得Mesh越来越光顺,迭代次数T也是平滑算法中重要的参数。

    缺点:
    拉普拉斯平滑虽然能够让Mesh的表面光顺,但迭代次数一旦多了(使用使用的迭代次数一般不超过10),就会使得模型整体发生收缩现象。
    在这里插入图片描述

    基于曲率的平滑:

    基于曲率的平滑与拉普拉斯平滑的区别在于,基于曲率的平滑是沿着顶点P的法向量所在直线去移动P的,从下图可以看出,一般的拉普拉斯平滑会讲点P移动到类似于重心的位置,而基于曲率的平滑的移动位置是与法向量方向相反的,这样做的目的是要更好的保持模型原来的大致形状
    在这里插入图片描述

    通过适当的选择拉普拉斯平滑中的权值ω,我们可以让基于曲率的平滑与拉普拉斯平滑达到算法上的统一。经过推导可知ω选择如下值的时候,即等价于将P如上图2中进行移动。
    在这里插入图片描述

    其中α和β的是P与其第i个邻接点Pi所构成边所对的两个角,(这里假设网格为流形,即每条边都只有至多两个三角形共有),下图显示了这两个角的位置:
    在这里插入图片描述

    这样点P的位置仍然由如下公式来决定,只是修改了权值计算方式:
    在这里插入图片描述

    在这里插入图片描述

    单地说顶点法线就是把共享该顶点的几个面的法线想加,然后除以面的数量,得到的平均值法线,这就是顶点法线。
    顶点光照强度在整个面上是均匀过度的.而如果直接使用面法线计算光照,整个面都是用的同一个法线,所以整个面的光照强度是一样的;

    面法线: 垂直一个平面的直线叫面法线;顶点法线: 每一个顶点都有法向量,就能知道光线到达物体表面的入射角;
    顶点法线与面法线
    面法线与顶点法线区别

    优点:
    包括3Dmax等等都是那本用的这个 比较实用好用!

    Taubin平滑算法(Taubin Smooth):

            关于lambda mu值的几个注意事项lambda是λ ,mu是μ
            Taubin平滑的原理基于了一部分数字信号处理方面的知识,用简单的话来表述, 就是使用一个负收缩因子μ将拉普拉斯平滑照成的收缩再放大回去( 防止过分的出现变形失真),  其算法的主体采用了2个与拉普拉斯平滑算法相似的过程,一个过程采用正因子λ(0~1),  另一个过程采用负因子μ(-1~0),每一次迭代都必须重复这两个过程
            我们假设0<λ,并且μ是一个负比例因子,使得μ<-λ。
            保持μ+λ<0(例如绝对值mu更大)
            让kpb为通带频率,taubin说:
            kpb=1/λ+1/μ>0
            kpb值在0.010.1之间,与原文献相比,结果良好。
            kpb*μ-μ/λ=1
            μ=1/(kpb-1/λ)
            所以如果
            *λ==0.5,kpb==0.1->mu=1/0.1-2=-0.526
            *λ==0.5,kpb==0.01->mu=1/0.01-2=-0.502
    即有:
    

    在这里插入图片描述

    HC拉普拉斯平滑(HC Laplacian Smooth):

    HCLaplacian平滑是一种对拉普拉斯平滑的改进方法,其针对的问题也是拉普拉斯算法产生的模型整体收缩问题,与Taubin算法不同,其不再是从信号处理的角度去看待拉普拉斯算法所引入的系统误差,HCLaplacian算法试图将拉普拉斯算法对顶点的移动以某种程度再移动回去,移动的具体原则需要参考顶点原先的位置
    一种拉普拉斯平滑的改进;
    缺点:
    与拉普拉斯挺接近会破坏模型拓扑结构不实用!

    ScaleDependent Laplacian Smooth:

    两个差不多都是基于拉普拉斯不过都可以不要!
    缺点:
    在大模型下不太友好;

    两步平滑(TwoStep Smooth):

    分两步相对于平滑面的法线/基于曲率的平滑,先平滑法线,然后再移动顶点,当然这个过程不会增加或者删除face与vertex,将相似的法线平均在一起。顶点重定位,将顶点移动到适合新法线的位置。
    缺点:
    可能会破坏模型的拓扑结构,不实用!

    深度平滑(Depth Smooth):

    是一种拉普拉斯平滑,与两步平滑有点相似都是先改变法线然后是顶点的位置,它被约束为只在一个给定方向(通常是观察者方向)移动顶点,整个算法(法线平滑+顶点拟合)的迭代次数,
    优点:
    比两步平滑实用!

    平滑处理大牛布朗大学Gabriel Taubin教授简介:

    Taubin教授目前就职于布朗大学计算机工程系。他在阿根廷布宜诺斯艾利斯大学获得了数学学士学位,并在布朗大学获得了计算机工程博士学位。1990年他加入IBM研究院,担任主任研究员。2003年,他加入布朗大学成为教授。由于他在三维几何数据压缩技术和多媒体标准方面的贡献,被IEEE选为院士。他也曾经在加州理工大学、麻省理工学院等大学担任客座教授。
    从2010年到2013年,Taubin教授担任《IEEE计算机图形与应用杂志》的主编,同时担任《IEEE可视化与计算机图形学报》的副主编以及《几何模型》杂志的编委会成员。
    Taubin教授的研究方向包括:应用计算几何、计算机图形学、几何建模、三维影像学、计算机视觉等

    1995年tubin平滑算法

    展开全文
  • python+opencv图像处理之六:图像平滑处理 目录python+opencv图像处理之六:图像平滑处理一、图像平滑二、均值滤波三、中值滤波四、方框滤波五、高斯滤波 一、图像平滑 图像平滑是指受传感器和外界因素的影响,图像...
  • 图像的平滑处理一.平滑处理的基本方法 一.平滑处理的基本方法
  • 目录什么是图像平滑处理均值滤波方框滤波高斯滤波中值滤波双边滤波2D卷积 什么是图像平滑处理 在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程我们称之为图像的平滑处理,所得到的图像称为平滑图像...
  • 1、什么是平滑处理?  首先明白几个名词:  (1)噪声:图像噪声是指存在于图像数据中的不必要的或多余的干扰信息。 1.高斯噪声:高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯...
  • 对matlab中平滑处理做了详细的介绍 yy1=smooth(y,30); %利用移动平均法对y做平滑处理 >> figure; %新建一个图形窗口 >> plot(t,y,'k:'); %绘制加噪波形图 >> hold on; >> plot(t,yy1,'k','...
  • Opencv 图片的初步处理——平滑处理

    千次阅读 2013-08-19 11:51:00
    Opencv 图片的初步处理——平滑处理 明天上午还有HP的二面 本来要睡了 想了下 还是又写了一篇 关键函数: Smooth 各种方法的图像平滑 void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=...
  • 图像平滑处理(滤波)

    万次阅读 2016-04-05 20:03:15
    Author:胡健1、图像平滑(smooth)也称为“模糊处理”,最常见的smooth的用法是减少图像上的噪声或者失真。 2、图像滤波 什么是图像滤波呢?就是在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制。图像...
  • 接下来的范例学习都集中在图像处理方面的学习,首先学习的是图像的平滑处理,相信学过图像处理的同学都不陌生,图像的平滑处理很普遍,最主要的功能就是去噪声,在OpenCV中最经常使用的平滑处理有四种:均值滤波,...
  • 跨域的图片平滑处理

    2008-01-28 11:27:00
    在9里,动态图片默认是不做平滑处理的,一般可以用BitmapData画下来时,设置平滑处理。但由于跨域问题,如果没有crossdomain.xml这个文件,就只能残念了......最后作者还很善良的提出了两个意见,不过
  • numpy之数据平滑处理

    千次阅读 2019-07-10 20:14:00
    数据平滑:通常包含降噪、拟合等操作。降噪的功能在于去除额外的影响因素,拟合的目的在于数学模型化,可以通过更多的数学方法识别曲线的特征。 2.绘制两支股票的收益率 ---收益率 =(后一天的收盘价 - 前一天的...
  • OpenCV入门(七)--平滑处理

    千次阅读 2014-10-22 11:49:44
    平滑处理也称模糊处理,OpenCV提供5中不同的平滑处理fangfa
  • OpenCV入门(二) 图像平滑处理

    千次阅读 2014-09-30 22:25:25
    对一幅图像平滑处理
  • 在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程称为对图像的平滑处理,所得的图像称为平滑图像。 图像平滑处理会对图像中与周围像素点的像素值差异较大的像素点进行处理,将其值调整为周围像素点...
  • python使用matplotlib.pyplot 画曲线,并平滑处理 import matplotlib.pyplot as plt list0 = ['数据'] plt.plot(list0) plt.show() 得到: 接下来平滑处理: 先导入: import scipy.signal 使用Savitzky-Golay...
  • Kinect API 自带骨骼数据平滑处理

    千次阅读 2014-06-16 21:49:47
    如何平滑处理Kinect采集的骨骼数据 | KinectAPI编程 1. What causes skeleton jitters? Though the skeleton jitters could be caused by the application performance due to both software and hardware,...
  • Kinect防抖平滑参数设置

    千次阅读 2014-05-21 13:05:43
     //对骨骼关节点进行平滑处理会产生性能开销。平滑处理的越多,性能消耗越大。设置平滑参数没有经验可以遵循。需要不断的测试和调试已达到最好的性能和效果。在程序运行的不同阶段,可能需要设置不同的平滑参数。 ...
  • scipy.interpolate: 插值和平滑处理

    千次阅读 2020-10-10 16:39:51
    y = np.exp(-x**2)+np.random.randn(200)/10 # 平滑曲线处理,平滑参数s=1 s = UnivariateSpline(x,y,s=1) xs = np.linspace(-5,5,1000) ys = s(xs) plt.plot(x,y,'.-') plt.plot(xs,ys,label='s=1') plt.legend() ...
  • 指定窗宽为30,对y进行中值滤波 yy = medfilt1(y,30); 对比smooth函数的平滑处理结果,medfilt1函数的平滑处理结果更好,更接近原始值。
  • 前面介绍里面,我有写过对于图像的平滑处理的几种方法: 归一化滤波,高斯模糊,中值滤波,双边滤波。 接下来,一一介绍里面参数的含义,以及自己做出的一些总结,还有上篇里面说的关于进度条数值不变的原因。 在开始...
  • python 数据、曲线平滑处理——方法总结Savitzky-Golay 滤波器实现曲线平滑插值法对折线进行平滑曲线处理基于Numpy.convolve实现滑动平均滤波数据平滑处理——log()和exp()函数 问题描述: 在寻找曲线的波峰、波谷时...
  • Python对折线进行平滑曲线处理

    万次阅读 2018-03-14 20:41:52
    在用python绘图的时候,经常由于数据的原因导致画出来的图折线分界过于明显,因此需要对原数据绘制的折线进行平滑处理,本文介绍利用插值法进行平滑曲线处理: 实现所需的库 numpy、scipy、matplotlib 插值法...
  • 但是点云数据中往往存在噪声,这样得到的重建网格通常都需要进行平滑处理。网格平滑是一种调整数据集中点坐标的技术。网格平滑的目的是提高网格的外观和提高单元数据集的形状。在平滑过程中,不会改变数据集的拓...
  • 游戏引擎 之 寻路&路径平滑处理

    千次阅读 2012-06-09 17:55:27
    游戏引擎中的寻路部分最主要由两大部分组成:寻路,路径平滑处理。确定起始点位置有两种方法:1. 最简单的方法:设置一个起点,一个终点;2. 设置脚印,即设置一连串的点,求出一条最短路径将这些点连起来。本文以第...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 77,038
精华内容 30,815
关键字:

平滑处理设置