bmp---中值滤波

lastnemo 2010-11-21 11:07:26

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

///////////////宏定义和全局变量定义///////////////
#define width 256 //定义输入图像的宽
#define height 256 //定义输入图像的高
unsigned char image[height][width]; //源灰度图像存储数组
unsigned char Mimage[height][width]; //滤波图像存储数组
int a; //用于存储main()函数中获取的用户输入

unsigned char *bmp_head;
///////////////函数声明部分//////////////////////
void maopao(int sz[],int Length);
bool zzlb(char *fileName,char *zzlbfileName);

///////////////主函数///////////////////////
void main()
{
printf("请选择您希望使用的中值窗进行中值滤波,如使用3*3中值窗请键入3,如使用5*5中值窗请键入5,如使用7*7中值窗请键入7,然后按回车键:");
scanf("%d",&a);
char *fileName,*zzlbfileName;
fileName = "lena.bmp"; //源图像路径、名称
zzlbfileName = "zzlb_lena.bmp"; //中值滤波后的图像路径、名称
zzlb(fileName,zzlbfileName); //调用中值滤波函数
}

//////////////灰度图像中值滤波函数///////////////////
bool zzlb(char *fileName,char *zzlbfileName)
{
FILE *imageFile; //图像的文件指针
int i,j; //循环: i行计数,j列计数
int k; //循环: k用于一维数组lssz[k]
int l,m; //循环,读入模板覆盖的源图像的像素值到lssz[]中时,l行计数,m列计数
int mbwidth; //模板的宽度
int mbheight; //模板的高度
int mbzxX; //模板中心的X坐标(相对于模板)
int mbzxY; //模板中心的Y坐标(相对于模板)
int mbSize; //模板长度,定义一维数组长度使用,也将此数据传递于maopao(int sz[],int Length)函数中的Length
int lssz[49]; //用于存放滤波模板覆盖的源图像的像素值

if(a==3)
{
mbwidth=3;
mbheight=3;
mbzxX=1;
mbzxY=1;
}
else
if(a==5)
{
mbwidth=5;
mbheight=5;
mbzxX=2;
mbzxY=2;
}
else
if(a==7)
{
mbwidth=7;
mbheight=7;
mbzxX=3;
mbzxY=3;
}
else
{
printf("您没有选择正确的中值窗,请按任意键退出程序,重新运行。\n");
return false;
}

mbSize=mbwidth*mbheight;

//////////////读取源bmp图像文件到image数组//////////////
//打开文件
if((imageFile=fopen(fileName,"rb"))==NULL) //指向原始文件
{
printf("%s 文件打开错误!请按任意键退出。\n",fileName);
return false; //失败返回
}
bmp_head=(unsigned char*)malloc(1078);
fread(bmp_head,1,1078,imageFile);
///////////////将滤波数组写入目标文件/////////////////
FILE *zzlbFile; //中值滤波后图像的文件指针
//创建文件
if((zzlbFile=fopen(zzlbfileName,"wb"))==NULL) //指向中值滤波后的图像
{
printf("%s 文件创建错误!请按任意键退出。\n",zzlbfileName);
return false; //失败返回
}

//读文件
for(i=0;i<height;i++)
fread(image[i],sizeof(unsigned char),width,imageFile);
//关闭文件
fclose(imageFile);

//////////////////进行中值滤波处理//////////////////
/////用原始图像数据初始化滤波图像数组Mimage////////
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
Mimage[i][j]=image[i][j];
}
}

//用模板中值填充模板中心点
// 进行模板计算,行(除去边缘几行)
for(i=mbzxY;i<(height-mbheight+mbzxY+1);i++)
{
// 列(除去边缘几列)
for(j=mbzxX;j<(width-mbwidth+mbzxX+1);j++)
{
k=0;
//读入模板覆盖的源图像的像素值到lssz[]中
for(l=(-mbheight+mbzxY+1);l<(mbheight-mbzxY);l++)
{
for(m=(-mbwidth+mbzxX+1);m<(mbwidth-mbzxX);m++)
{
lssz[k]=image[i+l][j+m];
k=k++;
}
}
maopao(lssz,mbSize); //对模板下的像素点进行冒泡排序
Mimage[i][j]=lssz[(mbSize-1)/2]; //将中值赋给滤波图像存放数组
}
}


fwrite(bmp_head,1,1078,zzlbFile);
//写文件
for(i=0;i<height;i++)
fwrite(Mimage[i],sizeof(unsigned char),width,zzlbFile);
//关闭文件
fclose(zzlbFile);
printf("%s文件保存完成,请按任意键退出。\n",zzlbfileName);
//成功返回
return true;
}

///////////////冒泡排序函数///////////////////
void maopao(int sz[],int Length)
{
int i,j; //循环: i控制冒泡(排序)趟数;j控制冒泡(排序)的数组长度
int lsbl; //用于交换的临时变量
/////////////冒泡排序/////////////
for(i=0;i<Length-1;i++)
{
for(j=0;j<Length-i-1;j++)
{
if(sz[j]>sz[j+1])
{
lsbl=sz[j];
sz[j]=sz[j+1];
sz[j+1]=lsbl;
}
}
}

}

结果绘图失败,应该是文件信息有丢失?我不知道了
...全文
293 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xujiang1987123 2011-05-21
  • 打赏
  • 举报
回复
能把图像处理前后的图片发出来看看吗?
memoleak 2010-11-21
  • 打赏
  • 举报
回复
发现一个常数1078,bmp文件有好多类型的,除非你能确定你测试的文件头是1078字节。。。
lastnemo 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shadowlsj 的回复:]

哥哥,你扯遠了,就圖論圖,你先把手上的平滑了先。。。其他的容後再討論。。。
[/Quote]哥们多谢啦,我这个程序是处理灰色图像的。我说怎么不行呢,因为加完噪声的lena是24位真彩(虽然她看上去是灰的),我用ps去色后就好了,图像位移还是1078,就能够去噪了。
lastnemo 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shadowlsj 的回复:]

哥哥,你扯遠了,就圖論圖,你先把手上的平滑了先。。。其他的容後再討論。。。
[/Quote]好吧
shadowlsj 2010-11-21
  • 打赏
  • 举报
回复
哥哥,你扯遠了,就圖論圖,你先把手上的平滑了先。。。其他的容後再討論。。。
lastnemo 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shadowlsj 的回复:]

是rgb真彩圖?

debug啊,一步步看mem變化麼,看每個像素的平滑後值對不對麼。你總有個心理值麼。

看是不是平滑算法出問題呢。
[/Quote]我在想为什么一加了噪声,图像就从灰色变为真彩了呢?
shadowlsj 2010-11-21
  • 打赏
  • 举报
回复
是rgb真彩圖?

debug啊,一步步看mem變化麼,看每個像素的平滑後值對不對麼。你總有個心理值麼。

看是不是平滑算法出問題呢。
lastnemo 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shadowlsj 的回复:]

1078這種默認調色板256色是不準的。比如2值圖(調色板為2),比如真彩圖(無調色板)。。。

先分析下你要處理的圖像的屬性吧。
[/Quote]的确是错了,已经将三个1078改成54了,依然绘图失败。
lastnemo 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 memoleak 的回复:]

发现一个常数1078,bmp文件有好多类型的,除非你能确定你测试的文件头是1078字节。。。
[/Quote]那如何查看图像的属性?
lastnemo 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 lastnemo 的回复:]
C/C++ code

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

///////////////宏定义和全局变量定义///////////////
#define width 256 //定义输入图像的宽
#define height 256 //定义输入图……
[/Quote]


那如何查看图像的属性?
shadowlsj 2010-11-21
  • 打赏
  • 举报
回复
1078這種默認調色板256色是不準的。比如2值圖(調色板為2),比如真彩圖(無調色板)。。。

先分析下你要處理的圖像的屬性吧。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧