所有像素加权系数相等),调用此函数实现中值滤

时间:2019-10-03 11:42来源:美高梅手机游戏网站
上节笔记中提到的 均值模糊、高斯模糊 两种图像模糊操作都属于 图像的线性滤波 ,本文则首先将笔记OpenCV中存在的几种 基于统计排序的滤波器 , 即 中值滤波 、 最大值 与 最小值滤

上节笔记中提到的均值模糊、高斯模糊两种图像模糊操作都属于图像的线性滤波,本文则首先将笔记OpenCV中存在的几种基于统计排序的滤波器

  • 中值滤波最大值最小值滤波

  • 这几种滤波器在特定场合与应用场景下,也经常用来(划重点,对应滤波的作用!!!消除图像噪声``(中值滤波可以抑制椒盐噪声;``最大值滤波可以填充小的闭合区域以及狭窄的间断;``最小值滤波可以去除小的图像噪声或者图像元素对象的大小丝黏连);或者抑制图像像素极小值与极大值最大值最小值滤波)。

1.1.中值滤波

图像滤波:
尽量保留图像细节特征的条件下对目标图像的噪声进行抑制和平滑处理,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
滤波器
低通滤波器(允许低频通过),高通滤波器,带通滤波器,带阻滤波器,全通滤波器,陷波滤波器。
我在这儿主要介绍OpenCV中所提供的滤波操作,线性滤波与非线性滤波
opencv中线性滤波操作有:方框滤波、均值滤波和高斯滤波。非线性滤波操作有:中值滤波和双边滤波。

OpenCV中常见的滤波器 - 百度文库

  • 中值滤波同样也需要一个卷积核,与卷积滤波不同的是,它不会用卷积核的每个系数与对应的像素值做算术计算,而是把对应的像素值做排序取中间值作为输出。

方框滤波

一、方框滤波(box Filter)

  • 具体说明如图所示:手机美高梅游戏网址 1
  • 线性滤波是一个自带有/设置有系数的“实”模板
  • 中值滤波是有一个只有滤波特性,没有设置系数“空”模板
  • 运算逻辑顺序概况:“空”模板移动,套/捞与模板重合的N×N个像素值上来,对套上来的值排序,取中值;置回模板核中心格子下重合的像素块;

讲到方框滤波,我们不能不提及的是线性邻域滤波算子,即用不同的权重去结合一个小邻域内的像素,来得到应有的处理效果。邻域滤波(卷积):左边图像与中间图像的卷积产生右边图像。目标图像中绿色标记的像素是利用原图像中蓝色标记的像素计算得到的。线性滤波处理的输出像素值g(i,j)是输入像素值f(j+k,j+l)的加权和 ,其中加权和称之为“核”,滤波器的加权系数,即滤波器的“滤波系数”。

手机美高梅游戏网址 2

这里写图片描述

1. 原理

先给出内核,用内核各点的值与其对应的图像像素值相乘

手机美高梅游戏网址 3

手机美高梅游戏网址 4

可以看出通过滤波后,图片的边缘信息会丢失。

方框滤波(box Filter)被封装在一个名为boxFilter的函数中。

void boxFilter( InputArray src, OutputArray dst, int ddepth,
                Size ksize, Point anchor = Point(-1,-1),
                bool normalize = true,
                int borderType = BORDER_DEFAULT );
  • int ddepth 输出图像的深度,-1 代表使用原图深度,即src.depth()
  • Size ksize 内核的大小。一般这样写Size(w, h)来表示内核的大小,Size(3, 3)就表示 3x3 的核大小
  • Point anchor = Point(-1,-1) 表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1) 如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
  • bool normalize = true 默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了
  • int borderType = BORDER_DEFAULT 用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。

函数所用的核为:

手机美高梅游戏网址 5

下面实例中的 α = 1/25

  • normalize = true 时,方框滤波就变成了均值滤波。也就是说,均值滤波是方框滤波归一化(normalized)后的特殊情况。其中,归一化就是把要处理的量都缩放到一个范围内,比如(0,1),以便统一处理和直观量化。
  • normalize = false 时,方框滤波用于计算每个像素邻域内的积分特性,比如密集光流算法(dense optical flow algorithms)中用到的图像倒数的协方差矩阵(covariance matrices of image derivatives)

如果我们要在可变的窗口中计算像素总和,可以使用integral()函数。
注:integral n. 积分

中值滤波的相关API函数处于Imgproc包中,完整的说明如下:

手机美高梅游戏网址 6

2. 实例

核心代码

boxFilter(src, dst, -1, Size(10, 10)); // 后面3个参数都用默认值
                                       // Point anchor = Point(-1,-1)
                                       // bool normalize = true
                                       // int borderType = BORDER_DEFAULT

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main() {

    Mat src = imread("../pics/pig.jpg");

    namedWindow("原图");
    imshow("原图", src);

    Mat dst;

    // 方框滤波
    boxFilter(src, dst, -1, Size(10, 10)); // 后面3个参数都用默认值

    namedWindow("方框滤波");
    imshow("方框滤波", dst);

    waitKey(0);
}

10 * 10 的核

Size(10, 10)

手机美高梅游戏网址 7

  • medianBlur(Mat src, Mat dst, int ksize)``src:表示输入图像, 当ksize3、5的时候输入图像可以为浮点数或者整数类型, 当ksize大于5手机美高梅游戏网址,的时候,则只能为字节类型图像,即CV_8UCdst:表示中值滤波以后输出的图像,其类型与输入图像保持一致ksize:表示上图中模板的大小,常见为3、5,注意模板大小必须为奇数而且必须大于1

这里写图片描述

二、均值滤波

调用此函数实现中值滤波的相关代码如下:

  /**
      * opencv中方框滤波函数
      * 第一个参数:输入的图片
      * 第二个参数:输出的图片
      * 第三个参数:图片的深度(存储每个像素所用的位数)一般情况使用-1也就是原有的图像深度
      * 第四个参数:核心的大小
      * 第五个参数:锚点的位置,就是我们要进行处理的点,默认值(-1,-1)表示锚点在核的中心
      * 第六个参数:normalize默认值为true,表示内核是否被其区域归一化(normalized)了,当normalize=true的时候,方框滤波就变成了我们熟悉的均值滤波。也就是说,均值滤波是方框滤波归一化(normalized)后的特殊情况。其中,归一化就是把要处理的量都缩放到一个范围内,比如(0,1),以便统一处理和直观量化。而非归一化(Unnormalized)的方框滤波用于计算每个像素邻域内的积分特性,比如密集光流算法(dense optical flow algorithms)中用到的图像倒数的协方差矩阵(covariance matrices of image derivatives)如果我们要在可变的窗口中计算像素总和,可以使用integral()函数
      * 第七个参数:边界模式,默认值BORDER_DEFAULT
      */
CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth,
                             Size ksize, Point anchor = Point(-1,-1),
                             bool normalize = true,
                             int borderType = BORDER_DEFAULT );

extern "C"
JNIEXPORT jintArray JNICALL
Java_com_xy_opencv_ndk_1opencv002_MainActivity_blurImage(JNIEnv *env, jclass type,jintArray pixels_, jint w, jint h) {
    jint *pixels = env->GetIntArrayElements(pixels_, NULL);
    Mat img(h, w, CV_8UC4, pixels);
    boxFilter(img,img,-1,Size(30,30));
    int size = w * h;
    jintArray array = env->NewIntArray(size);
    env->SetIntArrayRegion(array, 0, size, pixels);
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    return array;
    }

1. 原理

均值滤波,是最简单的一种滤波操作,输出图像的每一个像素是核窗口内输入图像对应像素的像素的平均值( 所有像素加权系数相等),其实说白了它就是归一化后的方框滤波,blur 函数内部中其实就是调用了一下 boxFilter。

均值滤波封装在一个名为blur的函数中。

void blur( InputArray src, OutputArray dst,
           Size ksize, Point anchor = Point(-1,-1),
           int borderType = BORDER_DEFAULT );

均值滤波的核:

手机美高梅游戏网址 8

Mat src = Imgcodecs.imread(fileUri.getPath;if(src.empty{ return;}Mat dst = new Mat();Imgproc.medianBlur(src, dst, 5);

划重点!!!

手机美高梅游戏网址 9

这里写图片描述

2. 缺陷

均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

  • 中值滤波对图像的椒盐噪声很明显的抑制作用,是一个很好的图像降噪的滤波函数

均值滤波
方框滤波归一化之后就是均值滤波。也就是输出图像的每一个像素是核窗口内输入图像对应像素的像素平均值( 所有像素加权系数相等)。

3. 实例

核心代码

blur(src, dst, Size(10, 10));

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main() {

    Mat src = imread("../pics/pig.jpg");

    namedWindow("原图");
    imshow("原图", src);

    Mat dst;

    // 均值滤波
    blur(src, dst, Size(10, 10));

    namedWindow("均值滤波");
    imshow("均值滤波", dst);

    waitKey(0);
}

10 * 10 的核,与前面方框滤波的结果一样

Size(10, 10)

手机美高梅游戏网址 10

编辑:美高梅手机游戏网站 本文来源:所有像素加权系数相等),调用此函数实现中值滤

关键词:

  • 上一篇:没有了
  • 下一篇:没有了