Opencv 滤波<11>

1. 平滑处理

“平滑处理“(smoothing)也称“模糊处理”(bluring),是一项简单且使用频率很高的图像处理方法。平滑处理的用途有很多,最常见的是用来减少图像上的噪点或者失真。在涉及到降低图像分辨率时,平滑处理是非常好用的方法。

2. 图像滤波与滤波器

图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。消除图像中的噪声成分叫作图像的平滑化或滤波操作。

信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。图像滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。而对滤波处理的要求也有两条:一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰视觉效果好。平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。(各种“两",:))

空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。关于滤波器,一种形象的比喻法是:我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。

3. 邻域算子与线性邻域滤波

邻域算子(局部算子)是利用给定像素周围的像素值的决定此像素的最终输出值的一种算子。而线性邻域滤波是一种常用的邻域算子,像素的输出值取决于输入像素的加权和,具体过程如下图。邻域算子除了用于局部色调调整以外,还可以用于图像滤波,实现图像的平滑和锐化,图像边缘增强或者图像噪声的去除。本篇文章,我们介绍的主角是线性邻域滤波算子,即用不同的权重去结合一个小邻域内的像素,来得到应有的处理效果。

图注:邻域滤波(卷积):左边图像与中间图像的卷积产生右边图像。目标图像中蓝色标记的像素是利用原图像中红色标记的像素计算得到的。

线性滤波处理的输出像素值是输入像素值的加权和 :

其中的加权和为 ,我们称其为“核”,滤波器的加权系数,即滤波器的“滤波系数”。

4. 均值滤波

均值就是平均的意思,对邻近的像素做个平均:x[i][j]=1/9(y[i-1][j-1]+y[i-1][j]+y[i-1][j+1]+y[i][j-1]+y[i][j]+y[i][j+1]+y[i+1][j-1]+y[i+1][j]+y[i+1][j+1]);

存在缺陷:即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。特别是椒盐噪声;

可以i通过下面看出:

using namespace std;
using namespace cv;

#define SRCIMAGE "原图"
#define SLATIMAGE "盐焦噪声原图"
#define MEANFILTER "自定义均值滤波"
#define MEANFILTER1 "OpenCV 均值滤波"

void salt(Mat& image, int num);
void AverFiltering(const Mat& src, Mat& dst);
void AverFiltering1(const Mat& src, Mat& dst);
void main()
{
    Mat srcImage = imread("E:\\欣奕华\\项目\\OPENCV\\Filter\\2.jpg", 1);
    imshow(SRCIMAGE, srcImage);
    salt(srcImage, 1000);
    imshow(SLATIMAGE, srcImage);
    double tick = getTickCount();
    Mat dstImage;
    dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());
    blur(srcImage, dstImage, Size(3, 3));
    imshow(MEANFILTER1, dstImage);
    tick = static_cast<double>(getTickCount() - tick) / getTickFrequency();
    cout << tick;
    cout << endl << endl;

    tick = getTickCount();
    AverFiltering1(srcImage, dstImage);
    imshow(MEANFILTER, dstImage);
    tick = static_cast<double>(getTickCount() - tick) / getTickFrequency();
    cout << tick;

    waitKey(0);
}

void salt(Mat& image, int num)
{
    if (image.data == NULL)
        return;
    else
    {
        int i, j;
        srand(time(NULL));
        for (int x = 0; x < num; x++)
        {
            i = rand() % image.rows;
            j = rand() % image.cols;
            for (int n = 0; n < image.channels(); n++)
            {
                image.at<Vec3b>(i, j)[n] = 255;
            }
        }
    }
}

void AverFiltering1(const Mat& src, Mat& dst)
{
    if (src.data == NULL)
        return;
    else
    {
        //dst.create(src.rows, src.cols, src.type());
        for (int i = 1; i < src.rows; i++)
        {
            for (int j = 1; j < src.cols; j++)
            {
                if ((i - 1) >= 0 && (j - 1) >= 0 && (i + 1) < src.rows && (j + 1) < src.cols)
                {
                    dst.at<Vec3b>(i, j)[0] = (src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i - 1, j)[0] + src.at<Vec3b>(i + 1, j)[0] + src.at<Vec3b>(i - 1, j - 1)[0] + src.at<Vec3b>(i, j - 1)[0] + src.at<Vec3b>(i + 1, j - 1)[0] + src.at<Vec3b>(i - 1, j + 1)[0] + src.at<Vec3b>(i, j + 1)[0] + src.at<Vec3b>(i + 1, j + 1)[0]) / 9;

                    dst.at<Vec3b>(i, j)[1] = (src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i - 1, j)[1] + src.at<Vec3b>(i + 1, j)[1] + src.at<Vec3b>(i - 1, j - 1)[1] + src.at<Vec3b>(i, j - 1)[1] + src.at<Vec3b>(i + 1, j - 1)[1] + src.at<Vec3b>(i - 1, j + 1)[1] + src.at<Vec3b>(i, j + 1)[1] + src.at<Vec3b>(i + 1, j + 1)[1]) / 9;
                    dst.at<Vec3b>(i, j)[2] = (src.at<Vec3b>(i, j)[2] + src.at<Vec3b>(i - 1, j)[2] + src.at<Vec3b>(i + 1, j)[2] + src.at<Vec3b>(i - 1, j - 1)[2] + src.at<Vec3b>(i, j - 1)[2] + src.at<Vec3b>(i + 1, j - 1)[2] + src.at<Vec3b>(i - 1, j + 1)[2] + src.at<Vec3b>(i, j + 1)[2] + src.at<Vec3b>(i + 1, j + 1)[2]) / 9;

                }
                else
                {
                    dst.at<Vec3b>(i, j)[0] = src.at<Vec3b>(i, j)[0];
                    dst.at<Vec3b>(i, j)[1] = src.at<Vec3b>(i, j)[1];
                    dst.at<Vec3b>(i, j)[2] = src.at<Vec3b>(i, j)[2];
                }
            }
        }
    }
}

2. 方框滤波

3 .中值滤波

4.高斯滤波

…………

后面还有很多滤波器,等后期使用时候再进一步学习,现阶段了解滤波这一概念!!!

原文地址:https://www.cnblogs.com/xingyuanzier/p/12228178.html

时间: 2024-12-24 09:39:54

Opencv 滤波<11>的相关文章

图像储存容器Mat[OpenCV 笔记11]

IplImage 与 Mat IplImage是OpenCV1中的图像存储结构体,基于C接口创建.在退出之前必须release,否则就会造成内存泄露.在一些只能使用C语言的嵌入式系统中,不得不使用. IplImage* img = cvLoadImage("imagename.jpg",1); Mat类内存分配是自动完成的,不必手动开辟空间(非必须),不必在不需要时释放空间. Mat类的构成 Mat由矩阵头和一个指向存储图像矩阵的指针组成.为应该尽量避免图像的复制,加快程序运行速度,M

OpenCV——滤波

常见滤波函数: 其中前3中为线性滤波,后2中为非线性滤波 原文地址:https://www.cnblogs.com/long5683/p/9664779.html

[OpenCV] Samples 11: image sequence

一帧一帧地读取视频流. VideoCapture sequence(file_video); sequence >> image. #include <opencv2/core/core.hpp> #include <opencv2/videoio/videoio.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace cv; using na

openCV—Python(11)—— 图像边缘检测

一.函数简介 1.laplacian算子 函数原型:Laplacian(src, ddepth, dst=None, ksize=None, scale=None, delta=None, borderType=None) src:图像矩阵 ddepth:深度类型 2.Sobel算子 函数原型:Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None) src:图像矩阵 dde

opencv学习之路(12)、图像滤波

一.图像滤波简介 二.方框滤波--boxFilter() 1 #include<opencv2/opencv.hpp> 2 using namespace cv; 3 4 void main(){ 5 Mat src=imread("E://1.jpg"); 6 Mat dst; 7 //方框滤波器,-1代表原图像深度,size内核大小,true按权重相加(此时等于均值滤波),false按原像素相加(所以很多像素点都大于了255,如上图所示) 8 boxFilter(src

OpenCV-跟我学一起学数字图像处理之中值滤波

中值滤波(median filter)在数字图像处理中属于空域平滑滤波的内容(spatial filtering).对消除椒盐噪声具有很好的效果. 数学原理 为了讲述的便捷,我们以灰度图为例.RGB三通道的彩色图可以通过每一个通道各自的中值滤波联合得到. 数字图像是以矩阵的方式存储的,具体存储方式可以参见OpenCV手册.中值滤波是通过所谓的mask operation操作进行的.以3x3的mask为例.设图像的矩阵形式如下: 0,0 0,1 0,2 0,3 0,4 0,5 1,0 1,1 1,

OpenCV实现立体视觉的经验

来源网址:http://blog.lehu.shu.edu.cn/byman/A263366.html 2010/11/12 15:17:14 | 分享一些OpenCV实现立体视觉的经验 尝试用OpenCV来实现立体视觉也有一段时间了,主要的参考资料就是Learning OpenCV十一.十二章和OpenCV论坛上一些前辈的讨论.过程中磕磕碰碰,走了不少弯路,终于在前不久解决了最头大的问题,把整个标定.校准.匹配的流程调试成功.(虽然还有一些问题至今尚未搞清) 在这里写这篇文章,第一方面是给自己

双目标定与三维计算:从理论到OpenCV实践

双目标定与三维计算:从理论到OpenCV实践 一.双目立体成像主要步骤    2 二.三角测量    3 2.1 主光线在无穷远处相交    3 2.2 主光线在有限距离内相交    3 2.3 深度与视差    4 2.4 双目立体坐标系    5 2.5 实际情况的双目    5 三.对级几何    6 3.1 对极几何的定义    6 3.2 极点极线极面的定义    6 3.3 对极几何的一些结论    7 四.本征矩阵E和基础矩阵F    8 4.1 基本信息    8 4.2 两者区

OpenCV3入门(六)图像滤波

1.图像滤波理论 1.1图像滤波理论 图像滤波即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作.消除图像中的噪声又叫做图像滤波或平滑,滤波的目的有两个,一是突出特征以方便处理,二是抑制噪声. 空间域滤波就是在图像平面上对像素进行操作.空间域滤波大体分为两类:平滑.锐化. 平滑滤波:模糊处理,用于减小噪声,实际上是低通滤波,典型的滤波器是高斯滤波. 锐化滤波:提取边缘突出边缘及细节.弥补平滑滤波造成的边缘模糊.实际上是高通滤波. 空间域处理可由下式表示: g(