滤波器
/**
* 均值滤波是最简单的滤波器,他将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");
}