質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.53%

画像処理:2値化について

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,727

matchdas3333

score 10

前提・実現したいこと

コマンドラインで画像のファイル名、大きさ、そして閾値を与えて画像の2値化の処理を行いたいのですが、実行後出力された画像がどう見てもうまく2値化されていません。おそらく処理を行う「threshing」という関数での閾値判定のところがうまくいっていないのだと推測できるのですが、どのように改善すれば正しく処理が行われるのかわかりません。
よろしくお願いいたします。

追加の補足

この処理を行った後の画像についてですが、処理後の画像の下半分の画素値がすべて0になってしまいます。

該当のソースコード

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define USAGE "usage:proc.exe input-filename width height output-filename thresh \n"

#pragma warning(disable:4996)


void get_args(int argc, char **argv);
void image_read_char(char *filename, int offset, unsigned char *im);
void image_write_char(char *filename, int w, int h, unsigned char *im);
void threshing(unsigned char *a, unsigned char *b, int w, int h,int thresh);

int width, height, header_size, thresh;
unsigned char *inimg, *outimg;

void get_args(int argc, char **argv){
    if (argc != 6){
        fprintf(stderr, USAGE);
        exit(1);
    }
    width = atoi(argv[2]); printf("width = %d\n", width);
    height = atoi(argv[3]); printf("height = %d\n", height);
    thresh = atoi(argv[5]); printf("thresh = %d\n", thresh);
}

void image_read_char(char *filename, int offset, unsigned char *im){
    FILE *fp;
    if ((fp = fopen(filename, "rb")) == NULL){
        printf("File Open Error Occured!\n");
        exit(-1);
    }
    fseek(fp, offset, 0);
    fread((char *)im, sizeof(char), width*height, fp);
    fclose(fp);
    printf("File Opening...:%s\n", filename);
}

void image_write_char(char *filename, int w, int h, unsigned char *im){
    FILE *fp;
    if ((fp = fopen(filename, "wb")) == NULL){
        printf("File Open Error Occured!\n");
        exit(-1);
    }
    fwrite((char *)im, sizeof(char), w*h, fp);
    fclose(fp);
}

void threshing(unsigned char *a, unsigned char *b, int w, int h, int thresh){
    int i, j;

    for (i = 2; i < h - 2; i++){
        for (j = 2; j < w - 2; j++){
            if (a[i*w + j]) > thresh){
                b[i*w + j] = 255;
            }
            else{
                b[i*w + j] = 0;
            }
        }
    }




}

int main(int argc, char **argv){

    get_args(argc, argv);

    inimg = (unsigned char *)malloc(width*height*sizeof(unsigned char));
    outimg = (unsigned char *)malloc(width*height*sizeof(unsigned char));

    header_size = 0;
    image_read_char(argv[1], header_size, inimg);
    threshing(inimg, outimg, width, height, thresh);
    image_write_char(argv[4], width, height, outimg);

    free(outimg); free(inimg);
    printf("completed.");

    return 0;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yohhoy

    2016/11/26 21:07

    thresh = atoi(argv[4]); は argv[5]では?扱える入出力画像は「8bit/pixel ヘッダなし モノクロ」形式となりますが、データは意図通りですか?

    キャンセル

  • matchdas3333

    2016/11/26 22:44

    argv[5]、ご指摘いただきありがとうございます。はい!意図通りです。

    キャンセル

  • yohhoy

    2016/11/26 23:22 編集

    「処理後の画像の下半分の画素値がすべて0になってしまい」はどのように確認したのでしょう?質問中コードを手元で動かしてみたところ、意図通り2値化処理ができています。

    キャンセル

  • matchdas3333

    2016/11/26 23:36

    Image Jで確認いたしました。ということは私のImage Jの設定ミスでしょうか。わかりました。尽力いただき、誠にありがとうございました。

    キャンセル

回答 1

0

こいつに食わす画像ファイルのフォーマット次第ですね。
どんなフォーマットのを食わせたんです? 
如何なる画像ファイルでも二値化してくれるわけじゃなさそうですよ?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/26 22:46

    これは「.raw」の画像を処理しています。情報不足で申し訳ございません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る