入力画像にメディアンフィルタを適用して平滑化画像を出力するプログラムを作りたい
解決したいこと
グレースケールの入力画像にメディアンフィルタを適用して平滑化画像を出力するプログラムを作りたいです。エラーが発生して困っています。解決方法を教えてください。
発生している問題・エラー
clang: error: linker command failed with exit code 1 (use -v to see invocation)
該当するソースコード
/****************
* メディアンフィルタを用いた平滑化 *
*****************/
#include <stdio.h>
#include <stdlib.h>
#include "image.h"
void file_in(char *file_name, unsigned char **input, int size_x, int size_y);
void file_out(char *file_name, unsigned char **output, int size_x, int size_y);
void median(unsigned char **input, unsigned char **output, int size_f, int size_x, int size_y)
{
int ix, iy;//ループ用変数
int fix, fiy;//フィルタの変数
int M=size_f*size_f;
unsigned char data[M];//並べ替えでM番目を使う
int count;
int i,j;//並べ替えループ用変数
if(!(size_f>0)&&(size_f%2)==1){//フィルタサイズは正の奇数
printf("error");
exit(1);
}
for(ix=size_f/2;ix<size_x-size_f/2;ix++){
for(iy=size_f/2;iy<size_y-size_f/2;iy++){
count=0;
for(fix=-size_f/2;fix<=size_f/2;fix++)
for(fiy=-size_f/2;fiy<=size_f/2;fiy++){
data[count]=input[iy+fiy][ix+fix];
count++;
}
for(i=0;i<(M-1);i++);//昇順ソート
for(j=i;j<(M-1);j++)
if(data[i]<data[j+1]){
data[M]=data[i];
data[i]=data[j+1];
data[j+1]=data[M];
}
output[iy][ix]=data[(M-1)/2];//中央値の代入
}
}
}
int main(int argc, char *argv[])
{
int ix, iy; // ループ用変数
int size_x, size_y; // 入力画像の大きさ
int size_f; // フィルタの大きさ
unsigned char **input; // 入力画像
unsigned char **output; // 出力画像
FILE *fp; // ファイルポインタ
FILE *hoge; //パイプを開く
/*************
* 引数の確認 *
*************/
if (argc!=4 && argc!=6) {
printf("Usage: EXPANSION [in_file] [out_file] [size_filter] {size_x} {size_y}\n");
exit(1);
}
if (argc == 4) {
size_f = atoi(argv[3]);
size_x = SIZE_X;
size_y = SIZE_Y;
}
if (argc == 6) {
size_f = atoi(argv[3]);
size_x = atoi(argv[4]);
size_y = atoi(argv[5]);
}
/*********************
* 画像格納領域の確保 *
*********************/
input = (unsigned char **)malloc(size_y*sizeof(unsigned char *));
if (input == NULL) {
printf("MEMORY ERROR!\n");
exit(1);
}
for (iy=0; iy<size_y; iy++) {
input[iy] = (unsigned char *)malloc(size_x*sizeof(unsigned char));
if (input[iy] == NULL) {
printf("MEMORY ERROR!\n");
exit(1);
}
}
output = (unsigned char **)malloc(size_y*sizeof(unsigned char *));
if (output == NULL) {
printf("MEMORY ERROR!\n");
exit(1);
}
for (iy=0; iy<size_y; iy++) {
output[iy] = (unsigned char *)malloc(size_x*sizeof(unsigned char));
if (output[iy] == NULL) {
printf("MEMORY ERROR!\n");
exit(1);
}
}
/*******************************
* ファイル入出力・フィルタ処理 *
*******************************/
file_in(argv[1], input, size_x, size_y); // 画像ファイルの読込
median(input, output, size_f, size_x, size_y);//メディアンフィルタ
file_out(argv[2], output, size_x, size_y); // 画像ファイルの出力
return 0;
}