资源简介
这个代码用VC6.0开发而成,控制台运行,是我在数字图像处理实验课上的拙作,图像源文件和目的文件是.raw原始图像格式。实现3×3模板下的图像中值滤波,修改成其他模板大小也非常方便。包含有源码,示例图像,实验结果演示文档等。
代码片段和文件信息
// MidFilter.cpp : Defines the entry point for the console application.
//
#include “stdafx.h“
///////////////宏定义和全局变量定义///////////////
#define W 512 //行总数
#define H 512 //列总数
#define pixelnum (W*H) //总像素数
unsigned char image[H][W]; //原灰度图像存储数组
unsigned char Mimage[H][W]; //原灰度图像存储数组
#define WSize 9 //用3*3模板中值滤波
//用于取模板各个象素点的相对位置(第一维表示H相对位置,第二维表示W相对位置)
int POS[WSize][2]={-1-1-10-110-100011-11011};
////////////////函数声明部分//////////////////////
void RiseSort(int Value[]int Length);
bool MidFilter(char *fileNamechar *midFilterFileName);
///////////////程序主体部分///////////////////////
int main(int argc char* argv[])
{
char *fileName*midFilterFileName;
fileName = “image/Image44.raw“; //源图像路径名
midFilterFileName = “image/midFilterFile.raw“; //中值滤波后的图像路径名
MidFilter(fileNamemidFilterFileName); //调用均衡化图像
printf(“Press any key to continue...“);
getchar();
return 0;
}
/*
实现功能:灰度图像中值滤波
参数:char *fileName 要处理的原图像512*512灰度图像
char *balanceFileName滤波处理后的512*512灰度图像
返回值:滤波成功就返回true失败就返回false
*/
bool MidFilter(char *fileNamechar *midFilterFileName)
{
FILE *imageFile; //图像的文件指针
int ij; //循环: i行计数j列计数
int k; //循环: k用于一维数组遍历
////////////////////////读取原raw图像文件到image数组////////////////////
//打开文件
if((imageFile=fopen(fileName“rb“))==NULL) //指向原始文件
{
cout<<“文件打开错误!“< return false; //失败返回
}
//读文件
for(i=0;i {
for(j=0;j {
image[i][j]=fgetc(imageFile);
}
}
//关闭文件
fclose(imageFile);
//////////////////进行中值滤波处理//////////////////
int value[WSize]; //定义临时数组用于存放模板象素值
//临时数组初始化
for(k=0;k {
value[k]=0;
}
//用原始图像数据 初始化 滤波图像数组(主要是填充边缘象素)
for(i=0;i {
for(j=0;j {
Mimage[i][j]=image[i][j];
}
}
//用模板中值填充模板中心点
for(i=1;i {
for(j=1;j {
for(k=0;k<9;k++)//读入模板覆盖的3*3象素
{
value[k]=image[i+POS[k][0]][j+POS[k][1]];
}
RiseSort(valueWSize); //对模板下的象素点进行冒泡排序
Mimage[i][j]=value[4]; //将中值赋给滤波数组
}
}
///////////////将滤波数组写入目标文件/////////////////
FILE *midFilterFile; //均衡化图像的文件指针
//创建文件
if((midFilterFile=fopen(midFilterFileName“wb“))==NULL) //指向原始文件
{
cout<<“文件打开错误!“< return false; //失败返回
}
//写文件
for(i=0;i {
for(j=0;j {
fputc(Mimage[i][j]midFilterFile);
}
}
//关闭文件
fclose(midFilterFile);
printf(“中值滤波后的图像已经保存在%s\n“midFilterFileName);
//成功返回
return true;
}
/*
实现功能:优化的冒泡排序
参数:int Value[] 要排序的整形数组
int Length 数组里要排序的长度
返回值: void不返回值(排序后的数组通过数组地址传递回去)
*/
void RiseSort(int Value[]int Length)
{
int ij; //循环: i控制冒泡趟数;j控制冒泡的数组长
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2006-12-30 13:16 MidFilter
目录 0 2006-12-30 13:14 MidFilter\Debug
文件 213140 2006-12-30 13:14 MidFilter\Debug\MidFilter.exe
文件 252004 2006-12-30 13:14 MidFilter\Debug\MidFilter.ilk
文件 9968 2006-12-30 13:14 MidFilter\Debug\MidFilter.obj
文件 359456 2006-12-30 10:14 MidFilter\Debug\MidFilter.pch
文件 533504 2006-12-30 13:14 MidFilter\Debug\MidFilter.pdb
文件 2487 2006-12-30 10:14 MidFilter\Debug\StdAfx.obj
文件 50176 2006-12-30 13:14 MidFilter\Debug\vc60.idb
文件 69632 2006-12-30 13:14 MidFilter\Debug\vc60.pdb
目录 0 2006-12-30 13:14 MidFilter\image
文件 262144 2006-12-03 11:22 MidFilter\image\Image44.raw
文件 262144 2006-12-30 13:14 MidFilter\image\midFilterFile.raw
文件 3901 2006-12-30 13:14 MidFilter\MidFilter.cpp
文件 4572 2006-12-30 09:52 MidFilter\MidFilter.dsp
文件 526 2006-12-30 09:52 MidFilter\MidFilter.dsw
文件 50176 2006-12-30 13:16 MidFilter\MidFilter.ncb
文件 48640 2006-12-30 13:16 MidFilter\MidFilter.opt
文件 1414 2006-12-30 13:14 MidFilter\MidFilter.plg
文件 1226 2006-12-30 09:52 MidFilter\ReadMe.txt
文件 296 2006-12-30 09:52 MidFilter\StdAfx.cpp
文件 830 2006-12-30 10:14 MidFilter\StdAfx.h
文件 1102767 2007-04-25 22:21 MidFilter可执行文件和实验结果.rar
----------- --------- ---------- ----- ----
3229003 23
- 上一篇:清大谭浩强教授的C++教程
- 下一篇:能随鼠标移动的放大镜
评论
共有 条评论