数字图像处理第4讲邻域平均法及中值滤波
- 格式:pptx
- 大小:1.02 MB
- 文档页数:12
数字图像处理之快速中值滤波算法快速中值滤波算法 : 在图像处理中,在进⾏如边缘检测这样的进⼀步处理之前,通常需要⾸先进⾏⼀定程度的降噪。
中值滤波是⼀种⾮线性数字滤波器技术,经常⽤于去除图像或者其它信号中的噪声。
这个设计思想就是检查输⼊信号中的采样并判断它是否代表了信号,使⽤奇数个采样组成的观察窗实现这项功能。
观察窗⼝中的数值进⾏排序,位于观察窗中间的中值作为输出。
然后,丢弃最早的值,取得新的采样,重复上⾯的计算过程。
中值滤波是图像处理中的⼀个常⽤步骤,它对于斑点噪声和椒盐噪声来说尤其有⽤。
保存边缘的特性使它在不希望出现边缘模糊的场合也很有⽤。
为了演⽰中值滤波器的⼯作过程,我们给下⾯的数组加上观察窗 3 ,重复边界的数值: x = [2 80 6 3] y[1] = Median[2 2 80] = 2 y[2] = Median[2 80 6] = Median[2 6 80] = 6 y[3] = Median[80 6 3] = Median[3 6 80] = 6 y[4] = Median[6 3 3] = Median[3 3 6] = 3 于是 y = [2 6 6 3] 其中 y 是 x 的中值滤波输出。
普通中值滤波算法伪代码: Input: image X of size m*n, kernel radius r. output: image Y as X. for i = r to m - r do for j = r to n - r do initialize list A[] for a = i-r to i+r for b = j-r to j+r add X(a, b) to A[] end end sort A[] then Y(i ,j) = A[A.size/2] end end 处理前: 处理后: 但是,上述算法在像素处理处的复杂度为O(r2). OpenCV实现代码:#include "cv.h"#include "highgui.h"#include <iostream>using namespace std;using namespace cv;int main(int argc, char* argv[]){Mat src = imread("beauty.jpg");Mat dst;//参数是按顺序写的//⾼斯滤波//src:输⼊图像//dst:输出图像//Size(5,5)模板⼤⼩,为奇数//x⽅向⽅差//Y⽅向⽅差GaussianBlur(src,dst,Size(5,5),0,0);imwrite("gauss.jpg",dst);//中值滤波//src:输⼊图像//dst::输出图像//模板宽度,为奇数medianBlur(src,dst,3);imwrite("med.jpg",dst);//均值滤波//src:输⼊图像//dst:输出图像//模板⼤⼩//Point(-1,-1):被平滑点位置,为负值取核中⼼blur(src,dst,Size(3,3),Point(-1,-1));imwrite("mean.jpg",dst);//双边滤波//src:输⼊图像//dst:输⼊图像//滤波模板半径//颜⾊空间标准差//坐标空间标准差bilateralFilter(src,dst,5,10.0,2.0);//这⾥滤波没什么效果,不明⽩imwrite("bil.jpg",dst);waitKey();return0;}View Code 快速中值滤波算法: O(r)复杂度的Huang算法:<> 这个代码的核⼼在于维护⼀个kernel直⽅图,可以实现快速的读取和删除扫描区域的像素值。
数字图像处理------中值滤波⼀中值滤波概念中值滤波算法以某像素的领域图像区域中的像素值的排序为基础,将像素领域内灰度的中值代替该像素的值[1];如:以3*3的领域为例求中值滤波中像素5的值图11)int pixel[9]中存储像素1,像素2...像素9的值;2)对数组pixel[9]进⾏排序操作;3)像素5的值即为数组pixel[9]的中值pixel[4]。
中值滤波对处理椒盐噪声⾮常有效。
⼆中值滤波代码实现//中值滤波:本算法采⽤3*3的领域范围void MyImage::MedianFilterOper(){//0. 准备:获取图⽚的宽,⾼和像素信息,int const num = 3 * 3;unsigned char pixel[num] = { 0 }; //保存领域的像素值int width = m_bmpInfo.biWidth;int height = m_bmpInfo.biHeight;int widthbyte = (width * m_bmpInfo.biBitCount / 8 + 3) / 4 * 4; //保证为4的倍数//相对于中⼼点,3*3领域中的点需要偏移的位置int delta[3 * 3][2] = {{ -1, -1 }, { -1, 0 }, { -1, 1 }, { 0, -1 }, { 0, 0 }, { 0, 1 }, { 1, -1 }, { 1, 0 }, {1, 1}};//1. 中值滤波,没有考虑边缘for (int i = 1; i < height-1; ++i){for (int j = 1; j < widthbyte-1; ++j){//1.1 提取领域值for (int k = 0; k < num; ++k){pixel[k] = m_imagedata[(i + delta[k][0])*widthbyte + j + delta[k][1]];}//1.2 排序qsort(pixel, num, sizeof(unsigned char), compa);//1.3 获取该中⼼点的值m_imagedata[i*widthbyte + j] = pixel[num / 2];}}}3 中值滤波概述 滤波是基于排序统计理论的⼀种能有效抑制噪声的⾮线性信号平滑处理技术,它将每⼀点的设置为该点某邻域窗⼝内的所有像素点灰度值的。
数字图像处理实验报告(邻域平均法和中值滤波法)数字图像处理实验报告班级:姓名:学号:日期:邻域平均法和中值滤波处理一、实验目的图像变换是数字图像处理中的一种综合变换,如直方图变换、几何变换等。
通过本实验,使得学生掌握两种变换的程序实现方法。
二、实验任务请设计程序,分别用邻域平均法,其模板为:和中值滤波法对testnoise 图像进行去噪处理(中值滤波的模板的大小也设为3X 3)。
三、实验环境本实验在Windows 平台上进行,对内存及cpu 主频无特别要求,使用VC或者MINGW (gcc)编译器均可。
四、设计思路介绍代码的框架结构、所用的数据结构、各个类的介绍(类的功能、类中方法的功能、类的成员变量的作用)、各方法间的关系写。
在此不进行赘述。
五、具体实现实现设计思路中定义的所有的数据类型,对每个操作给出实际算法。
对主程序和其他模块也都需要写出实际算法。
代码:<邻域平均法>(3*3)#include#include#include#include "hdr.h" /* ------ 定义结构指针--- */struct bmphdr *hdr;// 定义用于直方图变量unsigned char *bitmap,*count,*new_color; /* ---- main() 函数编--- */ int main(){ //定义整数i,j 用于函数循环时的,nr_pixels 为图像中像素的个数int i, j ,nr_pixels,nr_w,nr_h; // 定义两个文件指针分别用于提取原图的数据和生成直方图均衡化后的图像FILE *fp, *fpnew; // 定义主函数的参数包括:输入的位图文件名和输出的位图文件名,此处内容可以不要,在DOS下执行命令的时候再临时输入也可,为了方便演示,我这里直接把函数的参数确定了。
//argc=3; //argv[1]="test.bmp"; //argv[2]="testzf.bmp"; // 参数输入出错显示/* if (argc != 3) {printf("please input the name of input and out bitmap files\n");exit(1);}*/// 获取位图文件相关信息// hdr = get_header(argv[1]); hdr = get_header("testnoise.bmp");if (!hdr) exit(1); // 以二进制可读方式打开输入位图文件fp = fopen("testnoise.bmp", "rb");if (!fp) {printf("File open error!\n");exit(1);} // 文件指针指向数据区域fseek(fp, hdr->offset, SEEK_SET)计算位图像素的个数nr_pixels = hdr->width * hdr->height;nr_w = hdr->width;nr_h = hdr->height;bitmap = malloc(nr_pixels);new_color = malloc(nr_pixels);count = malloc((nr_w+2)*(+nr_h+2));//读取位图数据到bitmap 中fread(bitmap, nr_pixels, 1, fp);fclose(fp);// 因为图像边缘无法使用邻域平均,所以根据邻近颜色填补图像的周围一圈,存入count[] 数组中// 中心图像存入count[] for(i=nr_w+3;i<(nr_w+2)*(+nr_h+2)-nr_w-3;i++) { j=i/(nr_w+2);if(i%(nr_w+2)!=0&&(i+1)%(nr_w+2)!=0) count[i]=bitmap[i-nr_w-1-2*j]; } // 填补第一排for(i=1;i} // 填补最后一排for(i=1;i} // 填补左边一排for(i=0;i} // 填补右边一排for(i=0;i<nr_h+3;i++)< p="">{ count[(i+1)*(nr_w+2)-1]=count[(i+1)*(nr_w+2)-2];}// 邻域平均3*3for(j=nr_w+3,i=0;j<(nr_w+2)*(+nr_h+2)-nr_w-3;j++) {if(j%(nr_w+2)!=0&&(j+1)%(nr_w+2)!=0)new_color[i]=(count[j]+count[j-1]+count[j+1]+count[j-nr_w-2]+count[j-1-nr_w-2]+count[j+1-nr_w-2]+count[j+nr_w+2]+count[j-1+nr_w+2]+count[j+1+nr_w+2])/9,i++; } //结果存入bitmap[] 中for (i = 0; i < nr_pixels; i++;bitmap[i]=new_color[i]; // 打开一个以输出文件名命名的文件,设为可写的二进制形式fpnew = fopen("test_lynoise.bmp", "wb+");// 由于位图文件的头部信息并没有因直方图均衡化而改变,因此输出图像的头部信息从原位图文件中拷贝即可:fwrite(hdr->signature, 2, 1, fpnew); fwrite(&hdr->size, 4, 1, fpnew);fwrite(hdr->reserved, 4, 1, fpnew); fwrite(&hdr->offset, 4, 1, fpnew); fwrite(&hdr->hdr_size, 4, 1, fpnew); fwrite(&hdr->width, 4, 1, fpnew); fwrite(&hdr->height, 4, 1, fpnew); fwrite(&hdr->nr_planes, 2, 1, fpnew); fwrite(&hdr->bits_per_pixel, 2, 1, fpnew); fwrite(&hdr->compress_type, 4, 1, fpnew); fwrite(&hdr->data_size, 4, 1, fpnew); fwrite(&hdr->resol_hori, 4, 1, fpnew); fwrite(&hdr->resol_vert, 4, 1, fpnew);fwrite(&hdr->nr_colors, 4, 1, fpnew); fwrite(&hdr->important_color, 4, 1, fpnew); if (hdr->offset > 54) fwrite(hdr->info, (hdr->offset - 54), 1, fpnew); // 直方图均衡化的数据(bitmap) 赋值fwrite(bitmap, nr_pixels, 1, fpnew);// 关闭fclose(fpnew);// 释放内存(优化程序必需) free(hdr);free(bitmap);</nr_h+3;i++)<>。
中值滤波和均值滤波中值滤波和均值滤波是数字图像处理中常用的两种滤波方法,它们在图像去噪和平滑处理中起着重要的作用。
本文将从原理、应用以及优缺点等方面介绍这两种滤波方法。
一、中值滤波中值滤波是一种非线性滤波方法,其基本原理是用像素点周围邻域内的中值来代替该像素点的灰度值。
中值滤波可以有效地去除图像中的椒盐噪声和脉冲噪声,同时能够保持图像的边缘信息。
其处理过程如下:1.选取一个模板,模板的大小根据噪声的程度来确定;2.将模板中的像素点按照灰度值大小进行排序,取其中位数作为中心像素点的灰度值;3.将中心像素点的灰度值替换为中值;4.重复以上步骤,对整个图像进行滤波。
中值滤波的优点是能够有效地去除椒盐噪声和脉冲噪声,同时保持图像的边缘信息。
然而,中值滤波也存在一些缺点,例如不能处理高斯噪声和均匀噪声,对图像细节信息的保护效果较差。
二、均值滤波均值滤波是一种线性平滑滤波方法,其基本原理是用像素点周围邻域内的平均值来代替该像素点的灰度值。
均值滤波可以有效地去除高斯噪声和均匀噪声,同时能够保持图像的整体平滑。
其处理过程如下:1.选取一个模板,模板的大小根据滤波效果来确定;2.计算模板内所有像素点的灰度值的平均值;3.将中心像素点的灰度值替换为平均值;4.重复以上步骤,对整个图像进行滤波。
均值滤波的优点是能够有效地去除高斯噪声和均匀噪声,同时能够保持图像的整体平滑。
然而,均值滤波也存在一些缺点,例如不能处理椒盐噪声和脉冲噪声,对图像细节信息的保护效果较差。
中值滤波和均值滤波在图像处理中各有优劣。
中值滤波适用于去除椒盐噪声和脉冲噪声,能够保持图像的边缘信息,但在处理高斯噪声和均匀噪声时效果较差。
而均值滤波适用于去除高斯噪声和均匀噪声,能够保持图像的整体平滑,但对于细节信息的保护效果较差。
在实际应用中,根据图像的特点和噪声的类型选择合适的滤波方法是很重要的。
如果图像受到椒盐噪声和脉冲噪声的影响,可以选择中值滤波进行去噪处理;如果图像受到高斯噪声和均匀噪声的影响,可以选择均值滤波进行平滑处理。
1、均值滤波器邻域平均法是一种局部空间域处理的算法。
设一幅图像f(x,y)为N ×N 的阵列,处理后 的图像为g(x,y),它的每个像素的灰度级由包含(x,y)领域的几个像素的灰度级的平均值所 决定,即用下式得到处理后的图像:∑∈=S j i j i f M y x g ),(),(1),(式中x,y=0,l,2,…,N-1;S 是以(x,y)为中心的邻域的集合,M 是S 内坐标点的总数。
图像邻域平均法的处理效果与所用的邻域半径有关。
半径愈大,则图像的模糊程度也度大。
外,图像邻域平均算法简单,计算速度快,但它的主要缺点是在降低噪声的同时使图像产生模糊,特别在边沿和细节处,邻域越大,模糊越厉害。
一个均值滤波的例子:I=imread('cameraman.tif');%读入图像J=imnoise(I,'salt & pepper',0.02);%给图像添加椒盐噪声K=imnoise(I,'gaussian',0,0.005);%给图像添加均值为0,方差为0.005的高斯噪声subplot(231),imshow(I)title('原图像')subplot(232),imshow(J)title('添加椒盐噪声图像')subplot(233),imshow(K)title('添加高斯噪声图像')subplot(234),imshow(I)title('原图像')K1=filter2(fspecial('average',3),J)/255;%使用3×3模板均值滤波subplot(235),imshow(K1)title('3*3椒盐噪声均值滤波')K2=filter2(fspecial('average',3),K)/255;%使用3×3模板均值滤波subplot(236),imshow(K2)title('3*3高斯噪声均值滤波')2、中值滤波器它是一种基于排序统计理论的可有效抑制噪声的非线性平滑滤波器,其基本原理是把数字图像或数字序列中一点的值用该点的一个领域中各点值的中值代换。
图像的平滑——邻域平均法和中值滤波一、 邻域平均法将原图中的一个像素的灰度值和它周围邻近8个像素即一个3*3的模板(当然也可以选择其他n*n 的模板)的灰度值相加,然后将求得的平均值作为新图像中该像素的灰度值。
可用如右图方法来表示该操作: 首先,这样操作会存在一个边界的问题: 设原图像为 经过模板操作后的图像为解决这个问题可以采用两种简单方法:一种方法是忽略图像边界数据, 另一种方法是在图像四周复制原图像边界像素的值,从而使卷积核悬挂在图像四周时可以进行正常的计算。
实际应用中,多采用第一种方法。
其次,是计算出来的像素值的动态范围问题, 对此可简单地将其值置为0或255即可。
设有一幅N ×N 的图像f(x,y),若平滑图像为g(x,y),则有式中x,y=0,1,…,N-1; s 为(x,y )邻域内像素坐标的集合; M 表示集合s 内像素的总数。
可见邻域平均法就是将当前像素邻域内各像素的灰度平均值作为其输出值的去噪方法。
例如,对图像采用3×3的邻域平均法,对于像素 (m,n),其邻域像素如下:则有:这种算法简单,但它的主要缺点是在降低噪声的同时使图像产生模糊,特别在边缘和细节处。
而且邻域越大,在去噪能力增强的同时模糊程度越严重。
邻域平均法代码分析(3*3): void CKuangjiaView::OnAverage() { BYTE*p,*q; int w,h; int i,j,temp;⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1111*1111191⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡44444333332222211111⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎣⎡--------------333222w=pDib->GetWidth();//获取宽度h=pDib->GetHeight();//获取高度p=pDib->GetData();q=new BYTE[w*h];//创建一个新的数组用来计算memcpy(q,p,w*h);//将图像信息拷贝到新数组中for(i=1;i<h-1;i++)for(j=1;j<w-1;j++)//忽略上下左右边界{temp=(q[(i-1)*w+(j-1)]+q[(i-1)*w+j]+q[(i-1)*w+(j+1)]+q[i*w+(j-1)]+q[i*w+j+1]+q[(i+1)*w+(j-1)]+q[(i+1)*w+j]+q[(i+1)*w+j+1])/8;//以(i,j)为中心的3*3个像素点*(p+i*w+j)=temp;//(i,j)新的像素大小}delete[] q;Invalidate();}二、中值滤波中值滤波是对一个滑动窗口内的诸像素灰度值排序,用中值代替窗口中心像素的原来灰度值,因此它是一种非线性的图像平滑法。