グレースケールの入力画像の2値画像を大津の二値化で出力したい
解決したいこと
グレースケールの入力画像の2値画像を出力するプログラム(しきい値は大津の二値化で自動的に決定。)を作りたいです。
実行したところ、出力画像が真っ黒になってしまいます。おそらく二値化がうまく動いてないのかなとは思いますが、どう修正していいか全く分かりません。解決方法を教えてください。
発生している問題・エラー
エラーの表示はありませんが、出力画像がおかしいです。入力画像と出力画像を以下に貼り付けます。
該当するソースコード
/****************
* 判別分析法を用いた二値化 *
*****************/
#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 Expansion(unsigned char **input, unsigned char **output, int size_f, int size_x, int size_y);
long int hist[256];
void ootu(unsigned char **input, unsigned char **output, int size_x, int size_y){
double sb2_max = 0;
int value;
for(int t_num = 0; t_num < 256; t_num ++){
double sb2 = 0;
double w0 = 0, w1 = 0, m0 = 0, m1 = 0;
int class0 = 0, sum0 = 0, ave0 = 0;
int class1 = 0, sum1 = 0, ave1 = 0;
int i,j;
for(int i = 0; i < 128; i ++){
for(int j = 0; j < 128; j ++){
if(input[i][j] < t_num){
sum0 = sum0 + input[i][j];
class0 ++;
}else{
sum1 = sum1 + input[i][j];
class1 ++;
}
}
}
w0 = class0/(double)16384;
w1 = class1/(double)16384;
if(class0 == 0){
m0 = 0;
}else{
m0 = sum0/class0;
}
if(class1 == 0){
m1 = 0;
}else{
m1 = sum1/class1;
}
sb2 = w0 * w1 * (m0 - m1) * (m0 - m1);
if(sb2 > sb2_max){
sb2_max = sb2;
value = t_num;
}
}
int ix, iy;// ループ用変数
for(iy=0;iy<size_y;iy++){
for(ix=0;ix<size_x;ix++){
if(input[iy][ix]<= value){
output[iy][ix]=0;}
else {
output[iy][ix]=255;}
}
}
}
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!=3 && argc!=5) {
printf("Usage: EXPANSION [in_file] [out_file] {size_x} {size_y}\n");
exit(1);
}
if (argc == 3) {
//size_f = atoi(argv[3]);
size_x = SIZE_X;
size_y = SIZE_Y;
}
if (argc == 5) {
//size_f = atoi(argv[3]);
size_x = atoi(argv[3]);
size_y = atoi(argv[4]);
}
/*********************
* 画像格納領域の確保 *
*********************/
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); // 画像ファイルの読込
//histogram(); //ヒストグラムを作成
//ootu(input);
//binarize();
file_out(argv[2], output, size_x, size_y); // 画像ファイルの出力
//return 0;
}
自分で試したこと
しきい値valueの定義文の位置を何回か移動してみて実行を繰り返しましたが、解決しませんでした。