一、实验目的

图像变换是数字图像处理中的一种综合变换,如直方图变换、几何变换等。通过本实验,掌握中值滤波处理。

二、实验任务

设计程序,用中值滤波法(模板的大小为3×3)。进行去噪处理。

得出实验结果图像后,分析去噪的具体原因。并尝试使用1×3   1×11  1×21模板去处理图像,并分析不同效果的原因。

三、实验环境

本实验在Windows平台上进行,对内存及cpu主频无特别要求,使用MINGW(gcc)编译器。

四、实验步骤

实验结果:

1.3*3模板

2.1*3模板

3.1*11模板

4.1*21模板

去噪的具体原因

去噪是指减少数字图像中噪声,椒盐噪声是一种在图像上出现很多白点或黑点的噪声,一般采用中值滤波器滤波可以得到较好的结果。中值滤波法是一种非线性平滑技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近真实值,从而消除孤立的噪声点,这样就可以去除图像上的白点,到达去噪的效果。

dhc.h 和 dhc.c 文件以获取位图的高、宽, 以及从文件头到实际的位图数据的偏移字节数,从而实现对位图实际数据的操作

1.hdr.h

#ifndef __HDR_H__
#define __HDR_H__
struct bmphdr
{char signature[2];  //文件类型,字符串"BM"int size;           //文件大小short reserved[2];  //保留字int offset;         //从文件到实际位图数据的偏移量int hdr_size;       //文件头的长度int width;          //图像的宽度,单位是像素int height;         //图像的高度,单位是像素short nr_planes;    //位平面数,值为1short bits_per_pixel;//每个像素的位数int compress_type;   //指定压缩类型int data_size;       //位图数据大小int resol_hori;      //水平int resol_vert;      //垂直int nr_colors;       //使用的颜色数int important_color; //图像中重要的颜色数char info[1024];
};
struct bmphdr *get_header(char filename[]);  //得到文件头信息
#endif

2.hdr.c

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include "hdr.h"
struct bmphdr *get_header(char filename[])
{FILE *fp;struct bmphdr *hdr;fp = fopen(filename, "rb");//检查文件是否存在if (!fp){printf("File open error or such file does not exist!\n");return NULL;}//为位图文件信息头分配内存空间hdr = (struct bmphdr *)malloc(sizeof(struct bmphdr));//fread(buf,size,count,fp)//从图像中读取文件类型fread(hdr->signature, 2, 1, fp);//判断文件是否为BMP文件if (hdr->signature[0] != 'B' || hdr->signature[1] != 'M'){printf("Not a bmp file!\n");return NULL;}//读取位图文件头信息fread(&hdr->size, 4, 1, fp);fread(hdr->reserved, 4, 1, fp);fread(&hdr->offset, 4, 1, fp);fread(&hdr->hdr_size, 4, 1, fp);fread(&hdr->width, 4, 1, fp);fread(&hdr->height, 4, 1, fp);fread(&hdr->nr_planes, 2, 1, fp);fread(&hdr->bits_per_pixel, 2, 1, fp);fread(&hdr->compress_type, 4, 1, fp);fread(&hdr->data_size, 4, 1, fp);fread(&hdr->resol_hori, 4, 1, fp);fread(&hdr->resol_vert, 4, 1, fp);fread(&hdr->nr_colors, 4, 1, fp);fread(&hdr->important_color, 4, 1, fp);if (hdr->offset > 54)fread(&hdr->info, 1024, 1, fp);fclose(fp); //关闭文件return hdr;
}

3.完整代码

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include "hdr.h"
struct bmphdr *hdr;
unsigned char *bitmap,*to;
char buf[2048];
//像素点的位置数组
int di[8] = {0,0,1,1,1,-1,-1,-1};
int dj[8] = {1,-1,0,1,-1,0,1,-1};
unsigned char tmp[9];
int cmp(const void *a,const void *b)
{unsigned char *t1,*t2;t1 = (unsigned char *)a;t2 = (unsigned char *)b;if(*t1<*t2)return -1;else if(*t1>*t2)return 1;elsereturn 0;
}
int main(int argc,char *argv[])
{int i,j,k,nr_pixels;FILE *fp,*fpnew; //原始图像文件、去噪后的图像文件unsigned pj,px;int ii,jj; if(argc != 3){printf("Usage:%s<file_form> <file_to>\n",argv[0]);exit(1);}hdr = get_header(argv[1]); //获取文件头信息if(!hdr) exit(1);fp = fopen(argv[1],"rb"); //打开图像文件if(!fp){printf("File open error!\n");exit(1);}fseek(fp,hdr->offset,SEEK_SET);nr_pixels = hdr->width*hdr->height; //像素个数bitmap = malloc(nr_pixels);fread(bitmap,nr_pixels,1,fp); //读取像素点fclose(fp);to = malloc(nr_pixels);for(i=0;i<hdr->height;i++)for(j=0;j<hdr->width;j++) {if(i==0 || i==hdr->height -1 || j==0 || j==hdr->width-1) {to[i*hdr->width+j] = bitmap[i*hdr->width+j]; //边界值处理} else {for(k=0;k<8;k++){   //模板范围像素点位置ii = i+di[k];jj = j+dj[k];tmp[k] = bitmap[ii*hdr->width+jj];}tmp[8] = bitmap[i*hdr->width+j];qsort(tmp,9,1,cmp);   //排序to[i*hdr->width+j] = tmp[4]; //取中值}}fpnew = fopen(argv[2],"wb+"); //打开结果文件if(!fpnew) {printf("File create error!\n");exit(1);}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);fwrite(to,nr_pixels,1,fpnew);fclose(fpnew); //关闭文件free(hdr);      //释放内存free(bitmap);return 0;
}

图像处理实验,中值滤波处理椒盐噪声相关推荐

  1. python中值滤波去除椒盐噪声_python 中值滤波,椒盐去噪,图片增强实例

    受光照.气候.成像设备等因素的影响,灰度化后的图像存在噪声和模糊干扰,直接影响到下一步的文字识别,因此,需要对图像进行增强处理.图片预处理中重要一环就是椒盐去澡,通常用到中值滤波器进行处理,效果很好. ...

  2. FPGA图像处理仿真实验——中值滤波

    1.中值滤波原理 中值滤波属于统计排序滤波,对窗口内的像素值进行排序并通过多路选择器选择使用排序后的值,可以是最大值.最小值.中值等.排序滤波用接近中间位置的排序值作为输出,进行图像的平滑滤波,能得到 ...

  3. FPGA图像处理_中值滤波、均值滤波、极值滤波

    FPGA实现图像滤波(中值滤波.均值滤波.极值滤波) 前言 一.滤波原理 二.FPGA上Verilog实现步骤 1.图像周围填0 2.数据延迟 3.数据处理 总结 前言 首先介绍滤波原理,再附上ver ...

  4. 图像处理:中值滤波均值滤波

    转自:openCV之中值滤波&均值滤波(及代码实现):https://blog.csdn.net/weixin_37720172/article/details/72627543  在开始我们 ...

  5. 图像处理-自适应中值滤波

    原文链接:https://blog.csdn.net/qq_35608277/article/details/78498044 提出原因: 常规的中值滤波器,在噪声的密度不是很大的情况下(根据经验,噪 ...

  6. 中值滤波去除图像噪声的matlab程序

    中值滤波:基于排序理论的一种能有效抑制噪声的非线性信号处理技术. 方法:取含有基数(偶数会有半像素的差)个模板数据的滑动模板,对模板中的数据从小到大排序,取排在中间位置上的数据作为最终的处理结果. m ...

  7. python 中值滤波,椒盐去噪,图片增强

    受光照.气候.成像设备等因素的影响,灰度化后的图像存在噪声和模糊干扰,直接影响到下一步的文字识别,因此,需要对图像进行增强处理.图片预处理中重要一环就是椒盐去澡,通常用到中值滤波器进行处理,效果很好. ...

  8. 【图像处理】——图像滤波(Python+opencv实现三种方法:均值滤波、中值滤波、高斯滤波等)

    目录 一.什么是滤波以及滤波的目的? 二.均值滤波(cv2.blur()) 1.原理 2.关键代码 3.封装代码 二.中值滤波(cv2.medianBlur()) 1.原理 2.关键代码 3.封装代码 ...

  9. 图像处理(三) 均值滤波与中值滤波的对比

    均值滤波与中值滤波的对比 均值滤波与中值滤波 实验对比 matlab 代码 均值滤波与中值滤波 均值滤波是典型的线性滤波算法,均值滤波是对目标像素及周边像素取平均值后再填回目标像素来实现滤波目的的方法 ...

最新文章

  1. php配置设置,PHP设置配置文件的方法
  2. docker中开启时运行多个不同进程,安装ssh,并在启动docker时与jenkins同时启动运行
  3. 阿里不让 MySQL 多表 Join ?我偏要!
  4. 【Python】random库的使用
  5. 多家大厂接连停产,半导体“最后一里路”面临“瘫痪”?
  6. 【剑指offer】面试题35:复杂链表的复制(Java 实现)
  7. minitab怎么算西格玛水平_六西格玛黑带培训工具因子分析的使用
  8. Array.forEach
  9. android ar人脸贴图,ARCore与ARKit实现人脸贴纸、更换材质等动画效果
  10. Excel 二次开发系列(3): 创建Excel二次开发环境
  11. BarTender怎么打印公式化的三列标签
  12. 游戏开发之类和对象的基本概念(C++基础)
  13. Midletinfo-探索手机javaME系统信息的实用工具
  14. VS2012注册密钥
  15. 现代信号处理 张贤达_信号处理领域科学家、清华教授张贤达逝世 享年74岁
  16. 静态网页—制作“人人网首页”页面
  17. 超算优化重在存储,DAOS助力瑞金打造先进的生信大数据平台
  18. 【Django下载文件-Kml文件下载】
  19. G711(G711a+g711u)编码原理及代码
  20. 用Python批处理将WORD文件转换成PDF格式(工具:win32com模块)

热门文章

  1. virtio-vsock
  2. 关于服务器配置的详细进度
  3. Java数据库基础--以SQL Server为例
  4. 查询数据 抓取 网站数据_有了数据,我就学会了如何在几个小时内抓取网站,您也可以...
  5. 哈工大《微积分》——一元积分学与微分方程
  6. linux符号链接怎么复制,如何复制符号链接?
  7. 多功能按键设计——利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按
  8. ubuntu15.04 + ROS jade
  9. 怎样设置计算机usb端口,USB端口被占用了,怎样将其他USB设备添加到我的计算机?...
  10. 什么是BFC机制,如何触发BFC(消除浮动带来的父元素塌陷、垂直方向margin重叠、嵌套块级元素父元素margin塌陷)