共有回帖数 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 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知