签到

05月06日
尚未签到

共有回帖数 0

    回望空城

    等级:
    Linux下gcc编译通过。
    读取一个正方形的ppm文件,最大不超过200*200,然后读取一个滤镜文件,可以为1*1,3*3,5*5,7*7,9*9,生成一个滤过文件。原理是滤镜与原ppm文件对应像素乘加rgb,然后放到滤镜中心对应的生成ppm的中心上,然后滤镜移动过滤每一个像素(图像边缘像素不过滤)
    terminal中命令: 程序名 图像文件 滤镜文件
    现在制作的两个滤镜文件
    3x3滤镜锐化效果:
    3
    0 -1 0
    -1 5 -1
    0 -1 0
    5x5滤镜模糊效果:
    5
    0 1 1 1 0
    1 1 1 1 1
    1 1 3 1 1
    1 1 1 1 1
    0 1 1 1 0

    封装共两个文件:header.h,filter.c。
    header.h:
    #ifndef MP41_H
    #define MP41_H

    #include stdio.h
    #include stdlib.h
    #include string.h

    #define MAX_FILTER_SIZE 9
    #define MAX_IMAGE_SIZE 200
    #define NUM_CHANNELS 3
    #define RED 0
    #define GREEN 1
    #define BLUE 2


    int readFilter(char* fileName,
                  int filter[MAX_FILTER_SIZE][MAX_FILTER_SIZE],
                  int* size);



    int readImage(char* fileName,
                 int image[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE][NUM_CHANNELS],
                 int* x,
                 int* y,
                 int* max);


    int filterImage(int inImage[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE][NUM_CHANNELS],
                   int outImage[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE][NUM_CHANNELS],
                   int filter[MAX_FILTER_SIZE][MAX_FILTER_SIZE],
                   int x,
                   int y,
                   int fSize,
                   int max);



    int writeImage(char* fileName,
                  int image[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE][NUM_CHANNELS],
                  int x,
                  int y,
                  int max);

    #endif
    filter.c:
    #include "header.h"

    int readImage(char* fileName,
                 int image[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE][NUM_CHANNELS],
                 int* x,
                 int* y,
                 int* max)
    {
    int column;                                  
    int row;                                    
    int RGB;                                    
    FILE *inputfile;                          

    inputfile=fopen(fileName,"r");              

    fscanf(inputfile,"P3");                    
    fscanf(inputfile,"%d",x);                    
    fscanf(inputfile,"%d",y);                    
    fscanf(inputfile,"%d",max);                  

    for (row=0;row*y;row++)               {      
    for (column=0;column*x;column++)   {        
       for (RGB=0;RGB3;RGB++)          {        
       fscanf(inputfile,"%d",&image[column][row][RGB]);
       }                                        
      }                                          
    }                                            
                                                   
                                                 
                                                 
    return 0;
    }


    int readFilter(char* fileName,
                  int filter[MAX_FILTER_SIZE][MAX_FILTER_SIZE],
                  int* size)
    {

    int column;                                  
    int row;                                      
    FILE *inputfile;                              

    inputfile=fopen(fileName,"r");                

    fscanf(inputfile,"%d",size);                  

    for (row=0;row*size;row++)               {    
    for (column=0;column*size;column++)   {      
       fscanf(inputfile,"%d",&filter[column][row]);
    }                                            
    }                                              
    return 0;                                      
    }

    int filterImage(int inImage[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE][NUM_CHANNELS],
                   int outImage[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE][NUM_CHANNELS],
                   int filter[MAX_FILTER_SIZE][MAX_FILTER_SIZE],
                   int x,
                   int y,
                   int fSize,
                   int max)
    {
    int scolumn;                                
    int srow;                                    
    int RGB;                                      
    int fc;                                      
    int fr;                                      
    int column;                                  
    int row;                                      
    int margin=(fSize-1)/2;                      
    int SOP=0;                                    
    int weight=0;                                
    or (srow=0;srowy;srow++)           {        
      for (scolumn=0;scolumnx;scolumn++){        
       for (RGB=0;RGB3;RGB++)          {          
       outImage[scolumn][srow][RGB]=inImage[scolumn][srow][RGB];
       }                                          
      }                                            
    }                                            


    for (fr=0;frfSize;fr++) {                  
      for (fc=0;fcfSize;fc++){                  
       weight = weight + filter[fc][fr];          
       }                                          
      }

      if (weight ==0)                              
       weight =1;                                  
                                                   

    for (RGB=0;RGB3;RGB++)                {      
      for(srow=margin;srowy-margin;srow++){      
       for(scolumn=margin;scolumnx-margin;scolumn++) {
                                                   
        for(row=srow-margin,fr=0;row=srow+margin;row++,fr++)                {
                                                   
         for(column=scolumn-margin,fc=0;column=scolumn+margin;column++,fc++){
                                                   
            SOP = SOP + filter[fc][fr]*inImage[column][row][RGB];
                                                   
          }
         }

         if (SOP0)                                
          SOP = 0;                                
           
         if (SOP/weightmax)                      
          outImage[scolumn][srow][RGB]=max;        

         else                                      
          outImage[scolumn][srow][RGB]=SOP/weight;

        SOP =0;                                  
        }
       }
      }

    return 0;    
    }

    int writeImage(char* fileName,
                  int image[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE][NUM_CHANNELS],
                  int x,
                  int y,
                  int max)
    {

    int column;                                      
    int row;                                        
    FILE *outputfile;                                

    outputfile = fopen(fileName,"w");                

    fprintf(outputfile,"P3n%d %dn%dn",x,y,max);

    for (row=0;rowy;row++)                 {        
    for (column=0;columnx;column++)      {        
      fprintf(outputfile,"%d %d %dn",image[column][row][0],
                image[column][row][1],image[column][row][2]);
                                                   
                                                   
      }
    }

    return 0;
    }

    楼主 2015-12-05 13:55 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知