c语言进行图像均值滤波程序,有问题

C语言 码拜 10年前 (2015-05-11) 1664次浏览 0个评论
 

c语言进行图像均值滤波程序,有问题#include<stdio.h>
#include<stdlib.h>
//宏定义
#define IMAGE_SIZE_ROW 256
#define IMAGE_SIZE_COL 256
unsigned char origin_image[IMAGE_SIZE_ROW][IMAGE_SIZE_ROW];
unsigned char result_image[IMAGE_SIZE_ROW][IMAGE_SIZE_ROW];
void FILT33(void *I_image,void *O_image,int size_x,int size_y,float eps);
//主函数
main(int argc,char *argv[])
{
FILE *I_file,*O_file;
char origin_image_file_name[80];
char result_image_file_name[80];
int i;
float eps=0.5;
//打开文件
if((I_file=fopen(“D:\cell.tif”,”rb”))==NULL)
{   perror(“printf program error\n”);
printf(“error”);exit(0);}
//读入数据
for(i=0;i<IMAGE_SIZE_ROW;i++)
fread(origin_image[i],sizeof(unsigned char),IMAGE_SIZE_COL,I_file);
//do 3×3 smoothing
FILT33(origin_image,result_image,IMAGE_SIZE_ROW,IMAGE_SIZE_COL,eps);
fclose(I_file);
}
//滤波子函数
void FILT33(void *I_image,void *O_image,int size_x,int size_y,float eps)
// 3×3 smoothing function
/*arguments:
I_image  –> input image pointer
I_image  –> output image pointer
size_x,size_y   –> image size in both dimensions(row,col)
eps  –>difference tolerence  */
{
int i,j,ia1,im1,ja1,jm1;
float mean_value,gmax,difference;
unsigned char *ptr1,*ptr2;
ptr1=(unsigned char  *)I_image;
ptr2=(unsigned char  *)O_image;
for(i=0;i<size_x;i++)
{
printf(“*”);
for(j=0;j<size_y;j++)
{
ia1=(i+1>size_x-1)?size_x-1:i+1;//get i+1
    ja1=(j+1>size_y-1)?size_y-1:j+1;//get j+1
im1=(i-1<0)?0:i-1;//get i-1
im1=(j-1<0)?0:j-1;//get j-1
//calculate 8-neibourhood mean value
mean_value=ptr1[im1*size_y+jm1]+ptr1[im1*size_y+j]+ptr1[im1*size_y+ja1]
+ptr1[i*size_y+jm1]+ptr1[i*size_y+ja1]
+ptr1[ia1*size_y+jm1]+ptr1[ia1*size_y+j]+ptr1[ia1*size_y+ja1];
mean_value=mean_value/8;
//if the difference between mean_value and f(i,j) is greater than “”eps””
//then nochange;else f(i,j) is replaced by mean_value
difference=ptr1[i*size_y+j]-mean_value;
difference=(difference>0)?difference:0-difference;
if(difference<eps) ptr2[i*size_y+j]=mean_value+0.5;
else ptr2[i*size_y+j]=ptr1[i*size_y+j];
}
}
}
出现的错误见附图,多谢大家了,

5分
代码写的很乱,没有层次感,没看懂,猜测内存分配的问题,看看是不是有内存分配时候大小不够的或导致越界的,跟踪调试一下试试吧
我是直接复制的,放这里可能没有层次感了,这个可以直接放VC里运行的,代码不多,麻烦看下,谢谢了
10分
不是有个插入代码的功能呢吗
还有自定义函数的参数最好不要超过四个,一是容易弄混,二是效率不是很高,再者就是别人阅读你的代码会很不舒服的,甚至会直接不看你的代码的
#include<stdio.h>
#include<stdlib.h>
#define IMAGE_SIZE_ROW 256
#define IMAGE_SIZE_COL 256
unsigned char origin_image[IMAGE_SIZE_ROW][IMAGE_SIZE_ROW];
unsigned char result_image[IMAGE_SIZE_ROW][IMAGE_SIZE_ROW];
void FILT33(void *I_image,void *O_image,int size_x,int size_y,float eps);
main(int argc,char *argv[])
{
	FILE *I_file,*O_file;
	char origin_image_file_name[80];
    char result_image_file_name[80];
    int i;
	float eps=0.5;
    I_file=fopen("D:\cell.tif","rb");
	if(I_file==NULL)
	{   perror("printf program error\n");
		printf("error");exit(0);   }

	for(i=0;i<IMAGE_SIZE_ROW;i++)
    fread(origin_image[i],sizeof(unsigned char),IMAGE_SIZE_COL,I_file); 

	FILT33(origin_image,result_image,IMAGE_SIZE_ROW,IMAGE_SIZE_COL,eps);

	fclose(I_file);
}
void FILT33(void *I_image,void *O_image,int size_x,int size_y,float eps)
// 3x3 smoothing function
/*arguments:
I_image  --> input image pointer
I_image  --> output image pointer
size_x,size_y   --> image size in both dimensions(row,col)
eps  -->difference tolerence  */
{
	int i,j,ia1,im1,ja1,jm1;
	float mean_value,gmax,difference;
	unsigned char *ptr1,*ptr2;
	ptr1=(unsigned char  *)I_image;
	ptr2=(unsigned char  *)O_image;
	for(i=0;i<size_x;i++)
	{
		printf("*");
		for(j=0;j<size_y;j++)
		{
			ia1=(i+1>size_x-1)?size_x-1:i+1;//get i+1
		    ja1=(j+1>size_y-1)?size_y-1:j+1;//get j+1
			im1=(i-1<0)?0:i-1;//get i-1
			im1=(j-1<0)?0:j-1;//get j-1
			//calculate 8-neibourhood mean value
			mean_value=ptr1[im1*size_y+jm1]+ptr1[im1*size_y+j]+ptr1[im1*size_y+ja1]
				+ptr1[i*size_y+jm1]+ptr1[i*size_y+ja1]
				+ptr1[ia1*size_y+jm1]+ptr1[ia1*size_y+j]+ptr1[ia1*size_y+ja1];
			mean_value=mean_value/8;
			//if the difference between mean_value and f(i,j) is greater than ""eps""
			//then nochange;else f(i,j) is replaced by mean_value
			difference=ptr1[i*size_y+j]-mean_value;
			difference=(difference>0)?difference:0-difference;
			if(difference<eps) ptr2[i*size_y+j]=mean_value+0.5;
			else ptr2[i*size_y+j]=ptr1[i*size_y+j];
		}
	}
}

我改过了,代码直接插入的,麻烦看下,谢谢了

没人吗,求大神指导,自己先顶一个
5分
自己debug一下吧,应该是内存问题导致的crash, 应该很好debug的
会不会是读进来的图像数据不能像matlab里那样直接看做一个矩阵来处理,fread函数读进来的图像数据是怎样的,二进制的?数据什么形式排列的?
im1=(i-1<0)?0:i-1;//get i-1
im1=(j-1<0)?0:j-1;//get j-1
应该改成以下吧
 im1=(i-1<0)?0:i-1;//get i-1
 jm1=(j-1<0)?0:j-1;//get j-1
不然jm1的值是不确定的。
我用你的程序运行结果全是*

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c语言进行图像均值滤波程序,有问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!