高斯滤波,大家第二熟知一下高斯噪声

贰 高斯滤波函数

  对于图像来说,高斯滤波器是利用高斯核的2个二维的卷积算子,用于图像模糊化(去除细节和噪音)。

  1) 高斯分布

  1维高斯分布:

       图片 1  
图片 2

  二维高斯遍布:

   图片 3 图片 4

  2) 高斯核

  理论上,高斯分布在全体定义域上都有非负值,那就要求3个十分大的卷积核。实际上,仅供给取均值周围3倍标准差内的值,以外部份直接去掉即可。 如下图为多少个标准差为一.0的整数值高斯核。

                        图片 5

图片 6

5、综合示范代码

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"  
#include<opencv2/imgproc/imgproc.hpp>  
#include <iostream>  

using namespace cv;

int main(){

    Mat img = imread("dog.jpg");

    Mat out1,out2,out3;

    boxFilter(img,out1,-1,Size(30,30));
    blur(img, out2, Size(30, 30));

    namedWindow("方框滤波", 2);
    imshow("方框滤波", out1);

    GaussianBlur(img, out3, Size(29, 29), 0, 0);

    namedWindow("均值滤波", 2);
    imshow("均值滤波", out2);

    namedWindow("高斯滤波", 2);
    imshow("高斯滤波", out3);

    waitKey(0);


    return 0;
}

参考:
http://blog.csdn.net/keith\_bb/article/details/53869626
http://blog.csdn.net/poem\_qianmo/article/details/22745559

伍 高斯滤波步骤

 (1)移动相关核的主题成分,使它放在输入图像待处理像素的正上方 

 (2)将输入图像的像素值作为权重,乘以相关核 

 (三)将方面各步获得的结果相加做为输出 

 

两者滤波(Bilateral
filter)是一种非线性的滤波方法,是结合图像的上空左近度和像素值相似度的1种折中处理,同时思考空域音讯和灰度相似性,达到保边去噪的目的。具有简易、非迭代、局地的风味
。双边滤波器的补益是能够做边缘保存(edge
preserving),一般过去用的维纳滤波只怕高斯滤波去降噪,都会较肯定地混淆边缘,对于频仍细节的保卫安全功用并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘周边,离的较远的像素不会太多影响到边缘上的像素值,这样就保险了边缘周围像素值的保存。但是由于保存了过多的反复音讯,对于彩色图像里的往往噪声,双边滤波器不可以彻底的滤掉,只可以够对于低频音信进行较好的滤波。

2、方框滤波

在有了上述的答辩功底之后,首先介绍一下方框滤波。
那是兼备滤波器中最容易易行的一种滤波模式。每3个输出像素的是根本邻域像素值的平均值获得。
通用的滤波kernel如下:

图片 7

这边是三个长度宽度分别为Kwidth和Kheight的窗口函数,在此区域内邻域中像素值叠加求平均即可求出位于kernel核心点像素的像素值。

在OpenCV中方框滤波的被封装在boxFilter函数中。
函数原型:

void boxFilter( InputArray src, OutputArray dst, int ddepth,
                             Size ksize, Point anchor = Point(-1,-1),
                             bool normalize = true,
                             int borderType = BORDER_DEFAULT );

逐一参数详解:

  • 第二个参数,InputArray类型的src,输入图像,即源图像,填Mat类的目的即可。该函数对通道是单身处理的,且能够拍卖任意通道数的图样,但须求留意,待处理的图样深度应该为CV_8U,
    CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
  • 其次个参数,OutputArray类型的dst,即指标图像,需求和源图片有同等的尺码和花色。
  • 其八个参数,int类型的ddepth,输出图像的深浅,-壹意味行使原图深度,即src.depth()。
  • 第13个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的分寸。壹般那样写Size(
    w,h )来代表内核的深浅( 当中,w 为像素宽度,
    h为像素中度)。Size(三,三)就意味着三x3的核大小,Size(伍,5)就表示5x五的核大小
  • 第四个参数,Point类型的anchor,表示锚点(即被平整的相当点),注意她有暗许值Point(-一,-一)。借使那么些点坐标是负值的话,就象征取核的着力为锚点,所以暗许值Point(-1,-一)表示那些锚点在核的为主。
  • 第5个参数,bool类型的normalize,暗中同意值为true,一个标识符,表示内核是还是不是被其区域归壹化(normalized)了。
  • 第三个参数,int类型的borderType,用于猜度图像外部像素的某种边界情势。有暗中同意值BORubiconDE奥迪Q3_DEFAULT,大家1般不去管它。

boxFilter()函数方框滤波所用的核为:

图片 8

其中:

图片 9

当normalize=true的时候,方框滤波就改为了上面要说的的均值滤波。

三 高斯滤波性质

  高斯函数具有多个重点的质量,这几个性质使得它在最初图像处理中等专业学校门有用.这么些性质注解,高斯平滑滤波器无论在空间域依然在频率域都是老大灵光的低通滤波器,且在事实上图像处理中取得了工程人员的有效使用.高斯函数具有多少个要命人命关天的品质,它们是: 

  (一)二维高斯函数全体旋转对称性,即滤波器在逐一方向上的平整程度是一样的.一般的话,一幅图像的边缘方向是事先不精晓的,因而,在滤波前是无力回天显著三个大方向上比另壹主旋律上要求愈多的平滑.旋转对称性意味着高斯平滑滤波器在继续边缘检测中不会偏向任1方向. 

  (2)高斯函数是单值函数.那申明,高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每1邻域像素点权值是随该点与大旨点的距离单调增减的.那①属性是很重大的,因为边缘是1种图像局地特征,假设平滑运算对离算子宗旨很远的像素点依然有非常的大意义,则平滑运算会使图像失真. 

  (叁)高斯函数的傅立叶变换频谱是单瓣的.正如上面所示,那一性质是高斯函数付立叶变换等于高斯函数本人那一实际的第一手推论.图像常被不愿意的一再复信号所污染(噪声和细纹理).而所期待的图像特点(如边缘),既包括低频分量,又含有高频分量.高斯函数付立叶变换的单瓣意味着平滑图像不会被不须要的累累连续信号所污染,同时保留了绝半数以上所需确定性信号. 

  (四)高斯滤波器宽度(决定着平滑程度)是由参数σ表征的,而且σ和平滑程度的涉嫌是卓殊简单的.σ越大,高斯滤波器的频带就越宽,平滑程度就越好.通过调试平滑程度参数σ,可在图像特点过分模糊(过平整)与平滑图像中出于噪声和细纹理所引起的过多的不指望突变量(欠平滑)之间取得折衷. 

  (五)由于高斯函数的可分离性,较大尺寸的高斯滤波器能够能够有效地促成.二维高斯函数卷积能够分两步来进行,首先将图像与1维高斯函数进行卷积,然后将卷积结果与动向垂直的一模壹样壹维高斯函数卷积.由此,二维高斯滤波的总计量随滤波模板宽度成线性增进而不是成平方增进.

图片 10

引用块内容

4、高斯滤波

图像的高斯模糊进程正是图像与服从2维正态分布的卷积核做卷积。由叶昭君态分布又叫作高斯分布,所以那项技艺就叫作高斯模糊。
图像与圆圈卷积核做卷积将会扭转越发可信的焦外成像效果。由于高斯函数的傅立叶变换是其它三个高斯函数,所以高斯模糊对于图像来说就是1个低通滤波操作。
高斯滤波器是壹类依据高斯函数的形制来抉择权值的线性寒滑滤波器。高斯平滑滤波器对于抑克制从正态分布的噪声卓殊有效。

1维零均值高斯函数为:

图片 11

里头,高斯分布参数σ决定了高斯函数的幅度。

对于二维图像来说,常用二维零均值离散高斯函数作平滑滤波器。
2维高斯函数为:

图片 12

OpenCV中等高校函授数GaussianBlur达成了高斯滤波。
函数原型:

void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );

参数:

  • 先是个参数,InputArray类型的src,输入图像,即源图像,填Mat类的目的即可。它能够是单独的轻易通道数的图片,但须求小心,图片深度应该为CV_8U,CV_16U,
    CV_16S, CV_32F 以及 CV_64F之一。
  • 第四个参数,OutputArray类型的dst,即目的图像,供给和源图片有壹样的尺码和项目。比如能够用Mat::Clone,以源图片为模板,来先导化获得如假包换的靶子图。
  • 其四个参数,Size类型的ksize高斯基础的尺寸。当中ksize.width和ksize.height能够差异,但他俩都必须为正数和奇数。恐怕,它们得以是零的,它们都以由sigma总括而来。
  • 第七个参数,double类型的sigmaX,表示高斯核函数在X方向的的标准不是。
  • 第六个参数,double类型的sigmaY,表示高斯核函数在Y方向的的正规化不是。若sigmaY为零,就将它设为sigmaX,假如sigmaX和sigmaY都以0,那么就由ksize.width和ksize.height总括出来。
    为了结果的正确着想,最棒是把第多少个参数Size,第多少个参数sigmaX和第6个参数sigmaY全体点名到。
  • 第肆个参数,int类型的borderType,用于估摸图像外部像素的某种边界情势。有私下认可值BOEscortDE酷路泽_DEFAULT,我们一般不去管它。

一 高斯滤波简介

  明白高斯滤波从前,大家第三了解一下高斯噪声。高斯噪声是指它的可能率密度函数服从高斯分布(即正态分布)的一类噪声。要是八个噪音,它的拉长率分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。高斯白噪声的二阶矩不相干,一阶矩为常数,是指先后时限信号在时光上的相关性,高斯白噪声包括热噪声散粒噪声

  高斯滤波器是壹类依据高斯函数的样子来选用权值的线性凉滑滤波器。高斯平滑滤波器对于抑击败从正态分布的噪音万分实惠。1维零均值高斯函数为:

                            
g(x)=exp( -x^2/(2 sigma^2) 

  当中,高斯分布参数Sigma决定了高斯函数的小幅度。对于图像处理的话,常用二维零均值离散高斯函数作平滑滤波器,高斯函数的图形: 

                  图片 13

高斯滤波

3、均值滤波

均值滤波的规律相当不难,正是出口图像的每二个像素是核窗口内输入图像对应像素的像素的平均值(
全体像素加权周到相等),其实不难它正是归壹化后的正方滤波。

只是均值滤波本人存在着原始的后天不足,即它不能够很好地珍重图像细节,在图像去噪的同时也毁掉了图像的底细部分,从而使图像变得模糊,无法很好地去除噪声点。

OpenCV中落到实处均值滤波的是blur函数

函数原型:

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

参数:

  • 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的靶子即可。该函数对通道是独自处理的,且能够拍卖任意通道数的图样,但须要留意,待处理的图片深度应该为CV_8U,
    CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
  • 第一个参数,OutputArray类型的dst,即指标图像,须要和源图片有同一的尺寸和类型。比如能够用Mat::Clone,以源图片为模板,来开端化获得如假包换的对象图。
  • 其几个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的轻重。1般这样写Size(
    w,h )来表示内核的大小( 在那之中,w 为像素宽度,
    h为像素中度)。Size(三,三)就代表三x叁的核大小,Size(五,伍)就意味着伍x5的核大小
  • 第5个参数,Point类型的anchor,表示锚点(即被平整的百般点),注意她有默许值Point(-一,-壹)。如若这么些点坐标是负值的话,就表示取核的中坚为锚点,所以暗中认可值Point(-1,-1)表示这么些锚点在核的基本。
  • 第5个参数,int类型的borderType,用于预计图像外部像素的某种边界格局。有暗中同意值BO凯雷德DEPAJERO_DEFAULT,大家一般不去管它。

当然要落到实处均匀滤波也得以运用方面提到的boxFilter函数,与方框滤波差别的是第陆个参数normalize设为true。从blur函数的定义中得以看出blur函数只是调用了boxFilter而已:

void cv::blur( InputArray src, OutputArray dst,
           Size ksize, Point anchor, int borderType )
{
    boxFilter( src, dst, -1, ksize, anchor, true, borderType );
}

陆 高斯滤波源码(C语言版)

  1 // gaosilvbo.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <stdlib.h>
  6 #include <math.h>
  7 
  8 typedef unsigned long DWORD;
  9 typedef long LONG;
 10 typedef unsigned short WORD;
 11 typedef unsigned char BYTE;
 12 
 13 typedef struct tagRGBQUAD {
 14     BYTE    rgbBlue;
 15     BYTE    rgbGreen;
 16     BYTE    rgbRed;
 17     BYTE    rgbReserved;
 18 } RGBQUAD;
 19 
 20 #pragma pack (2)     /*指定按字节对齐*/  
 21 typedef struct tagBITMAPFILEHEADER {
 22     WORD    bfType;
 23     DWORD   bfSize;
 24     WORD    bfReserved1;
 25     WORD    bfReserved2;
 26     DWORD   bfOffBits;
 27 } BITMAPFILEHEADER;
 28 
 29 //恢复对齐状态
 30 typedef struct tagBITMAPINFOHEADER{
 31     DWORD      biSize;
 32     LONG       biWidth;
 33     LONG       biHeight;
 34     WORD       biPlanes;
 35     WORD       biBitCount;
 36     DWORD      biCompression;
 37     DWORD      biSizeImage;
 38     LONG       biXPelsPerMeter;
 39     LONG       biYPelsPerMeter;
 40     DWORD      biClrUsed;
 41     DWORD      biClrImportant;
 42 } BITMAPINFOHEADER;
 43 
 44 unsigned char *pTempBmpBuf;    //读入图像数据的指针
 45 
 46 unsigned char *pBmpBuf;    //读入图像数据的指针
 47 
 48 
 49 int bmpWidth;              //图像的宽
 50 int bmpHeight;             //图像的高
 51 RGBQUAD *pColorTable;       //颜色表指针
 52 int biBitCount;            //图像类型,每像素位数
 53 
 54 bool readBmp(char *bmpName)
 55 {
 56     //二进制读方式打开指定的图像文件
 57 
 58     FILE *fp=fopen(bmpName,"rb");
 59     if(fp==0) return 0;
 60 
 61 
 62     //跳过位图文件头结构BITMAPFILEHEADER
 63     fseek(fp, sizeof(BITMAPFILEHEADER),0);
 64 
 65     //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
 66     BITMAPINFOHEADER head;  
 67     fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); 
 68 
 69     //获取图像宽、高、每像素所占位数等信息
 70     bmpWidth = head.biWidth;
 71     bmpHeight = head.biHeight;
 72     biBitCount = head.biBitCount;
 73 
 74 
 75     //定义变量,计算图像每行像素所占的字节数(必须是的倍数)
 76     int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
 77 
 78     //灰度图像有颜色表,且颜色表表项为
 79     if(biBitCount==8){
 80         //申请颜色表所需要的空间,读颜色表进内存
 81         pColorTable=new RGBQUAD[256];
 82         fread(pColorTable,sizeof(RGBQUAD),256,fp);
 83     }
 84 
 85 
 86     //申请位图数据所需要的空间,读位图数据进内存
 87     pTempBmpBuf=new unsigned char[lineByte * bmpHeight];
 88 
 89     pBmpBuf=new unsigned char[lineByte * bmpHeight];
 90     fread(pTempBmpBuf,1,lineByte * bmpHeight,fp);
 91     fseek(fp, 1078,0);
 92     fread(pBmpBuf,1,lineByte * bmpHeight,fp);
 93 
 94     //关闭文件
 95     fclose(fp);
 96     return 1;
 97 }
 98 
 99 bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,int biBitCount, RGBQUAD *pColorTable)
100 {
101     
102     if(!imgBuf)
103         return 0;
104 
105     //颜色表大小,以字节为单位,灰度图像颜色表为字节,彩色图像颜色表大小为
106     int colorTablesize=0;
107     if(biBitCount==8)
108         colorTablesize=1024;
109 
110     //待存储图像数据每行字节数为的倍数
111     int lineByte=(width * biBitCount/8+3)/4*4;
112 
113     //以二进制写的方式打开文件
114     FILE *fp=fopen(bmpName,"wb");
115     if(fp==0) return 0;
116 
117     //申请位图文件头结构变量,填写文件头信息
118     BITMAPFILEHEADER fileHead;
119     fileHead.bfType = 0x4D42;//bmp类型
120 
121     //bfSize是图像文件个组成部分之和
122     fileHead.bfSize= sizeof(BITMAPFILEHEADER)
123         + sizeof(BITMAPINFOHEADER)
124         + colorTablesize + lineByte*height;
125 
126     fileHead.bfReserved1 = 0;
127     fileHead.bfReserved2 = 0;
128 
129     //bfOffBits是图像文件前个部分所需空间之和
130     fileHead.bfOffBits=54+colorTablesize;
131 
132     //写文件头进文件
133     fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);
134 
135     //申请位图信息头结构变量,填写信息头信息
136     BITMAPINFOHEADER head; 
137     head.biBitCount=biBitCount;
138     head.biClrImportant=0;
139     head.biClrUsed=0;
140     head.biCompression=0;
141     head.biHeight=height;
142     head.biPlanes=1;
143     head.biSize=40;
144     head.biSizeImage=lineByte*height;
145     head.biWidth=width;
146     head.biXPelsPerMeter=0;
147     head.biYPelsPerMeter=0;
148 
149     //写位图信息头进内存
150     fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);
151 
152     //如果灰度图像,有颜色表,写入文件
153     if(biBitCount==8)
154         fwrite(pColorTable, sizeof(RGBQUAD),256, fp);
155 
156     //写位图数据进文件
157     fwrite(imgBuf, height*lineByte, 1, fp);
158 
159     //关闭文件
160     fclose(fp);
161     return 1;
162 }
163 
164 int _tmain(int argc, _TCHAR* argv[])
165 {
166         //读入指定BMP文件进内存
167     char readPath[]="guass_test.bmp";
168     readBmp(readPath);
169     //输出图像的信息
170     printf("width=%d,height=%d,biBitCount=%d\n",
171         bmpWidth,bmpHeight,biBitCount);
172 
173     //每行字节数
174     int lineByte=(bmpWidth*biBitCount/8+3)/4*4;
175     //定义最终写入的数据体
176     //pBmpBuf=new unsigned char[lineByte * bmpHeight];
177     //循环变量,图像的坐标
178     int y,x;
179 
180     //循环变量,针对彩色图像,遍历每像素的三个分量
181     int k;
182     //单精度变量暂存计算后的灰度值(针对灰度图像)
183     float       TempNum;
184     //指向TempBmpbuf的指针
185     unsigned char *TemPtr;
186     //指向BmpBuf的指针
187     unsigned char *Ptr;
188     //定义*3的模板(拉普拉斯)
189     float CoefArray[9]={1.0f,2.0f,1.0f,2.0f,4.0f,2.0f,1.0f,2.0f,1.0f};
190     //定义模板前乘的系数(拉普拉斯)
191     float coef=(float)(1.0/16.0);;  
192 
193     //lapulas滤波
194     if(biBitCount==8){//对于灰度图像
195         for(y=1;y<bmpHeight-1;y++){
196             for(x=0;x<bmpWidth-1;x++){    
197 
198                 TemPtr=pTempBmpBuf+y*lineByte+x;
199                 Ptr=pBmpBuf+y*lineByte+x;
200 
201                 TempNum=(float)((unsigned char)*(TemPtr+lineByte-1))*CoefArray[0];
202                 TempNum+=(float)((unsigned char)*(TemPtr+lineByte))*CoefArray[1];
203                 TempNum+=(float)((unsigned char)*(TemPtr+lineByte+1))*CoefArray[2];
204                 TempNum+=(float)((unsigned char)*(TemPtr-1))*CoefArray[3];
205                 TempNum+=(float)((unsigned char)*TemPtr)*CoefArray[4];
206                 TempNum+=(float)((unsigned char)*(TemPtr+1))*CoefArray[5];
207                 TempNum+=(float)((unsigned char)*(TemPtr-lineByte-1))*CoefArray[6];
208                 TempNum+=(float)((unsigned char)*(TemPtr-lineByte))*CoefArray[7];
209                 TempNum+=(float)((unsigned char)*(TemPtr-lineByte+1))*CoefArray[8];
210 
211                 TempNum*=coef;
212 
213                 if(TempNum>255.0) *Ptr =(BYTE)255;
214                 else if(TempNum<0.0) 
215                     *Ptr =(unsigned char)fabs(TempNum);
216                 //用到了fabs函数,需要添加math.h头文件
217                 else *Ptr=(char)TempNum;
218             }
219         }
220     }
221 
222     else if(biBitCount==24){//彩色图像
223         for(y=0;y<bmpHeight/2;y++){
224             for(x=0;x<bmpWidth/2;x++){ 
225                 for(k=0;k<3;k++)//每像素RGB三个分量分别置才变成黑色
226                     *(pBmpBuf+y*lineByte+x*3+k)=0;
227             }
228         }
229     }
230     //将图像数据存盘
231     char writePath[]="gauss_result.BMP";
232     saveBmp(writePath, pBmpBuf, bmpWidth, 
233         bmpHeight, biBitCount, pColorTable);
234     //清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间
235     delete []pBmpBuf;
236     delete []pTempBmpBuf;
237     if(biBitCount==8)
238         delete []pColorTable;
239     return 0;
240 }

高斯滤波处理以后:                                                                  
高斯滤波处理从前:

图片 14   
图片 15

 

 

 

 

 

 

 

高斯滤波是1种线性凉滑滤波,适用于化解高斯噪声,广泛应用于图像处理的减噪进度。通俗的讲,高斯滤波正是对整幅图像举行加权平均的进度,每一种像素点的值,都由其本人和邻域内的任何像素值经过加权平均后拿走。高斯滤波的具体操作是:用二个模板(或称卷积、掩模)扫描图像中的每二个像素,用模板分明的邻域内像素的加权平均灰度值去替代模板宗旨像素点的值。从数学的角度来看,图像的高斯模糊进程正是图像与正态分布做卷积。由黄浩然态分布又叫作高斯分布,所以那项技艺就叫作高斯模糊。图像与圆圈方框模糊做卷积将会转变越来越准确的焦外成像效果。由于高斯函数的傅立叶变换是别的四个高斯函数,所以高斯模糊对于图像来说就是贰个低通滤波操作。高斯滤波器是壹类依照高斯函数的形状来挑选权值的线性寒滑滤波器。高斯平滑滤波器对于遏征坚守正态分布的噪声分外实用。一维零均值高斯函数为:G(x)=exp(-x2/2sigma贰)。当中,高斯分布参数Sigma决定了高斯函数的肥瘦。对于图像处理的话,常用贰维零均值离散高斯函数作平滑滤波器。

图片 16

那边写图片描述

一、图像平滑与滤波概念

介绍图像滤波以前有至关重要通晓一下图像平滑的定义。

图像平滑(smoothing)也号称图像模糊(blurring),是一种在图像处理中运用频率很高的操作,进行图像平滑的操作原因有成都百货上千,在此间根本介绍使用平滑操作降低图片噪声。因为在图像中,噪声的能量几近集中在步长谱的低频和中频部分,而在较高的频道,1些要害的底细新闻往往被噪声淹没。在一幅图像中,所谓的频仍部分是指图像中像素值落差一点都不小的局地,而低频则是指像素值与旁边的像素值相差十分小甚至同一,而图像的一部分细节的①部分往往由高频消息来表现,图像中混合的噪音往往也处在高频段,那就招致了一部分细节新闻被噪声淹没,能够依据差别的噪声类型用不相同的滤波器实行处理。
滤波的目标有多个即:一.抽出对象的性状作为图像识其余性状方式;二.为适应图像处理要求,化解数字图像所混入的噪音
对图像滤波有七个要求:一.不可能破坏图像的大致和边缘等根本音讯;贰.使图像清晰视觉效果更加好

为了拓展图像平滑操作,常常在图像上加三个滤波器(filter),最广泛的门类是线性的,输出像素值g(x,
y)最后由原像素值和加权值决定。其进程如下:

图片 17

里头h(x,
y)被叫作核(kernel),是加到图像上滤波器(filter)的周到,它推向把滤波器进行可视化为2个窗口在图像上海滑稽剧团动,那一个关系到邻域的卷积操作。

邻域算子值利用给定像素相近像素的值决定此像素的最终输出。左侧图像正是原像素的值,中间图像是滤波器(filter),filter的指标就是将滤波器的加权值进行这样的可视化窗口,最右侧的图像是原图像和滤波器一起卷积生成,图像中的深深湖蓝部分是左图中革命和高级中学级滤波器卷积计算得到的结果。所以能够看来图像像素最终的值不仅与原像素有关也可滤波器选用的kernel窗口大小有关。

4 高斯滤波应用

  高斯滤波后图像被平整的品位在于标准差。它的出口是小圈子像素的加权平均,同时离为主越近的像素权重越高。因而,相对于均值滤波(mean filter)它的平滑效果更温和,而且边缘保留的也越来越好。

  高斯滤波被用作为平滑滤波器的本质原因是因为它是1个低通滤波器,见下图。而且,大部份基于卷积平滑滤波器都以低通滤波器。

                        图片 18

                      图.高斯滤波器(标准差=三像素)的频率响应。The spatial frequency axis is marked 

                         
in cycles per pixel, and hence no value above 0.5 has a real meaning。

  /**
      * 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的奇数
     */
CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );

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);
    medianBlur(img,img,31);
    int size = w * h;
    jintArray array = env->NewIntArray(size);
    env->SetIntArrayRegion(array, 0, size, pixels);
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    return array;
    }

那里写图片描述

相互滤波

均值滤波
方框滤波归壹化之后便是均值滤波。也便是出口图像的每叁个像素是核窗口内输入图像对应像素的像素平均值(
全数像素加权周全相等)。

本小说文章版权所属:微笑面对,请关怀笔者的CSDN博客:博客地址

图像滤波:
尽可能保存图像细节特征的条件下对目的图像的噪声举办防止和平滑处理,是图像预处理中不可缺点和失误的操作,其处理效果的36九等将间接影响到后续图像处理和剖析的管事和可信性。
滤波器
低通滤波器(允许低频通过),德州仪器滤波器,带通滤波器,带阻滤波器,全通滤波器,陷波滤波器。
自作者在那时候重要介绍OpenCV中所提供的滤波操作,线性滤波与非线性滤波
opencv中线性滤波操作有:正方滤波、均值滤波和高斯滤波。非线性滤波操作有:中值滤波和两边滤波。

 /**
   * 双边滤波
   * 第一个参数:传入的图片(必须是CV_8UC1或者CV_8UC3)
   * 第二个参数:传出的图片
   * 第三个参数:每个像素领域的直径
   * 第四个参数:sigmaColor,这个值越大,该像素领域内会有更广的颜色被混合到一起
   * 第五个参数:sigmaSpace,这个值越大,越远的像素会互相影响,第三个参数大于0时,领域的大小和这个值无关,否则成正比
   * 第六个参数:使用默认值BORDER_DEFAULT
   */
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace, 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_8UC3, pixels);
    Mat out(h,w,CV_8UC4);
    bilateralFilter(img,out,25,25*2,25/2);
    int size = w * h;
    jint *re = (jint *) out.data;
    jintArray array = env->NewIntArray(size);
    env->SetIntArrayRegion(array, 0, size, re);
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    return array;
    }

中值滤波很简短,一种非线性滤波操作,就是孔径范围内的拥有像素举办排序,然后取中位数,赋值给宗旨。

图片 19

此处写图片描述

正方滤波

讲到方框滤波,大家亟须提起的是线性邻域滤波算子,即用差别的权重去结合贰个小邻域内的像素,来获取相应的处理效果。邻域滤波(卷积):左侧图像与中档图像的卷积发生左边图像。目的图像浅豆暗绛红标记的像素是采用原图像青深绿标记的像素总计得到的。线性滤波处理的出口像素值g(i,j)是输入像素值f(j+k,j+l)的加权和
,在那之中加权和称之为“核”,滤波器的加权周全,即滤波器的“滤波周到”。

图片 20

此处写图片描述

 /**
 * 均值滤波(归一化之后又进行了方框滤波)
 * 第一个参数:输入的图片
 * 第二个参数:输出的图片
 * 第三个参数:核心的大小
 * 第四个参数:锚点的位置,就是我们要进行处理的点,默认值(-1,-1)表示锚点在核的中心
 * 第五个参数:边界模式,默认值BORDER_DEFAULT
 */

CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor = Point(-1,-1),
                        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);
    blur(img,img,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;
    }

图片 21

这里写图片描述

   /**
     * 高斯滤波
     * 第一个参数:传入的图片
     * 第二个参数:传出的图片
     * 第三个参数:核心(必须是正数和奇数)
     * 第四个参数:sigmaX代表高斯函数在x方向的标准偏差
     * 第五个参数:sigmaY代表高斯函数在Y方向的标准偏差,有默认值为0
     * 第六个参数:边界模式,使用默认值BORDER_DEFAULT
     */
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, 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);
    GaussianBlur(img,img,Size(31,31),0);
    int size = w * h;
    jintArray array = env->NewIntArray(size);
    env->SetIntArrayRegion(array, 0, size, pixels);
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    return array;
    }

相关文章