java opencv 基本操作8

本文介绍了图像处理中的几种滤波技术,包括均值滤波、高斯滤波、中值滤波和双边滤波,详细阐述了它们的工作原理和应用场景。此外,还探讨了图像金字塔的概念,包括图像的放大和缩小操作。这些技术在图像去噪、平滑和尺寸变换方面具有重要作用。
摘要由CSDN通过智能技术生成

滤波器

/**
     * 均值滤波是最简单的滤波器,他将K*K窗口中像素值的平均值作为输出。这种滤波器等价于图像与全部元素值为1的核函数先进性卷积。
     * blur( 
     *  Mat src,      --输入图像
     *  Mat dst,      --输出图像
     *  Size ksize,   --均值滤波内核的大小
     *  Point anchor = Point(-1,-1),   -- 锚点,默认值Point(-1,-1)表示锚位于内核中心
     *  int borderType = BORDER_DEFAULT  --图像的边界模式
     *  )
     *  
     *  高斯滤波,对图像邻域内像素进行平滑时,邻域内不同位置的像素被赋予不同的权值,对图像进行平滑的同时,同时能够更多的保留图像的总体灰度分布特征
     *  GaussianBlur(
     *  Mat src,           --输入图像
     *  Mat dst,           --输出图像
     *  Size ksize,        --高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数
     *  double sigmaX,     --表示高斯核函数在X方向的的标准偏差
     *  double sigmaY=0,   --表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来
     *  int borderType=BORDER_DEFAULT)
     *  )
     *  
     * 中值滤波 是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像边缘细节.
     * medianBlur(
     * Mat src,   --输入图像
     * Mat dst,   --输出图像
     * int ksize  --是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。需要注意,核大小必须是比1大的奇数,比如3、5、7等。 
     * )
     * 
     *  双边滤波综合考虑距离和色彩的权重结果,既能够有效地去除噪声,又能够较好地保护边缘信息。 在双边滤波中,当处在边缘时,
     *  与当前点色彩相近的像素点(颜色距离很近)会被给予较大的权重值;而与当前色彩差别较大的像素点(颜色距离很远)会被给予较小的权重值
     *  (极端情况下权重可能为0,直接忽略该点),这样就保护了边缘信息。
     *  bilateralFilter(
     *  Mat src,   --输入图像
     *  Mat dst,   --输出图像
     *  int d,      --是在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,
     *                则会自动从参数 sigmaSpace 计算得到。如果滤波空间较大(d>5),则速度较慢。因此,在实时应用中,推荐d=5。对于较大噪声的离线滤波,可以选择d=9。
     *  double sigmaColor,  --是滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。与当前像素点的像素值差值小于 sigmaColor 的像素点,
     *                        能够参与到当前的滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。该值为0时,滤波失去意义;该值为255时,指定直径内的所有点都能够参与运算。
     *  double sigmaSpace,  --是坐标空间中的sigma值。它的值越大,说明有越多的点能够参与到滤波计算中来。当d>0时,无论sigmaSpace的值如何,d都指定邻域大小;否则,d与 sigmaSpace的值成比例。
     *  int borderType)
     *  
     *  均值漂移算法是一种通用的聚类算法,它的基本原理是:对于给定的一定数量样本,任选其中一个样本,以该样本为中心点划定一个圆形区域,求取该圆形区域内样本的质心,
     *  即密度最大处的点,再以该点为中心继续执行上述迭代过程,直至最终收敛。可以利用均值偏移算法的这个特性,实现彩色图像分割,
     *  pyrMeanShiftFiltering( 
     *  Mat src,    --输入图像
     *  Mat dst,    --输出图像
     *  double sp,   --定义的漂移物理空间半径大小
     *  double sr,    --定义的漂移色彩空间半径大小
     *  int maxLevel=1,  --定义金字塔的最大层数;
     *  TermCriteria termcrit=TermCriteria(TermCriteria.COUNT+TermCriteria.EPS,5,1)  --定义的漂移迭代终止条件,可以设置为迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合
     *  );
     */
    @Test
    public void test21() {
    	Mat src = GeneralUtils.converMat("D:\\test\\0001.jpg");
    	
    	Mat result = new Mat();
    	
    	//均值滤波(模糊)
    	Imgproc.blur(src, result, new Size(7, 7));
    	GeneralUtils.saveByteImg(result, "D:\\test\\blur.jpg");
    	
    	//高斯滤波(模糊)
    	Imgproc.GaussianBlur(src, result, new Size(7, 7), 15);
    	GeneralUtils.saveByteImg(result, "D:\\test\\gaussianBlur.jpg");
    	
    	//中值滤波(模糊)
    	Imgproc.medianBlur(src, result, 7);
    	GeneralUtils.saveByteImg(result, "D:\\test\\medianBlur.jpg");
    	
    
    	//双边滤波(模糊)
    	Imgproc.bilateralFilter(src, result, 10, 200, 10);
    	GeneralUtils.saveByteImg(result, "D:\\test\\bilateralFilter.jpg");
    	
    	//均值迁移模糊
    	Imgproc.pyrMeanShiftFiltering(src, result, 10, 15, 3, new TermCriteria(TermCriteria.COUNT + TermCriteria.EPS, 5, 1));
    	GeneralUtils.saveByteImg(result, "D:\\test\\pyrMeanShiftFiltering.jpg");
    }

图像金字塔

     /**图像金字塔
     * 当我们需要将图像转换到另一个尺寸的时候, 有两种可能:放大 图像 或者缩小 图像。 图像金字塔是视觉运用中广泛采用的一项技术。
     *一个图像金字塔是一系列图像的集合 - 所有图像来源于同一张原始图像 - 通过梯次向下采样获得,直到达到某个终止条件才停止采样。
     *有两种类型的图像金字塔常常出现在文献和应用中:高斯金字塔(Gaussian pyramid): 用来向下采样
     *拉普拉斯金字塔(Laplacian pyramid): 用来从金字塔低层图像重建上层未采样图像
     * pyrUp (
     * Mat src,      --输入图像
     * Mat dst, ,    --输出图像
     * Size dstsize,   --目的图像大小, 既然我们是向上采样, pyrUp 期待一个两倍于输入图像( src )的大小
     * int borderType=BORDER_DEFAULT
     * )
     * 
     * pyrDown (
     * Mat src,      --输入图像
     * Mat dst, ,    --输出图像
     * Size dstsize,   --目的图像大小, 既然我们是向下采样, pyrDown 期待一个1/2于输入图像( src )的大小
     * int borderType=BORDER_DEFAULT
     * )
     */
    @Test
    public void test28() {
    	Mat src = GeneralUtils.converMat("D:\\test\\0001.jpg");

    	//向上采样(放大图片)
    	Mat dst = new Mat();
    	Size size = new Size(src.width()*2, src.height()*2);
    	Imgproc.pyrUp(src, dst, size);
    	GeneralUtils.saveByteImg(dst, "D:\\test\\pyrUp.jpg");
    	
    	//向下采样(缩小图片)
    	size = new Size(src.width()/2, src.height()/2);
    	Imgproc.pyrDown(src, dst, size);
    	GeneralUtils.saveByteImg(dst, "D:\\test\\pyrDown.jpg");
    }

《中医基础理论》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古智云开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值