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

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

新規登録して質問してみよう
ただいま回答率
85.51%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

4408閲覧

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

matchdas3333

総合スコア12

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/11/26 11:44

編集2022/01/12 10:55

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

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

###該当のソースコード

C++

1#include<stdio.h> 2#include<stdlib.h> 3#include<math.h> 4 5#define USAGE "usage:proc.exe input-filename width height output-filename thresh \n" 6 7#pragma warning(disable:4996) 8 9 10void get_args(int argc, char **argv); 11void image_read_char(char *filename, int offset, unsigned char *im); 12void image_write_char(char *filename, int w, int h, unsigned char *im); 13void threshing(unsigned char *a, unsigned char *b, int w, int h,int thresh); 14 15int width, height, header_size, thresh; 16unsigned char *inimg, *outimg; 17 18void get_args(int argc, char **argv){ 19 if (argc != 6){ 20 fprintf(stderr, USAGE); 21 exit(1); 22 } 23 width = atoi(argv[2]); printf("width = %d\n", width); 24 height = atoi(argv[3]); printf("height = %d\n", height); 25 thresh = atoi(argv[5]); printf("thresh = %d\n", thresh); 26} 27 28void image_read_char(char *filename, int offset, unsigned char *im){ 29 FILE *fp; 30 if ((fp = fopen(filename, "rb")) == NULL){ 31 printf("File Open Error Occured!\n"); 32 exit(-1); 33 } 34 fseek(fp, offset, 0); 35 fread((char *)im, sizeof(char), width*height, fp); 36 fclose(fp); 37 printf("File Opening...:%s\n", filename); 38} 39 40void image_write_char(char *filename, int w, int h, unsigned char *im){ 41 FILE *fp; 42 if ((fp = fopen(filename, "wb")) == NULL){ 43 printf("File Open Error Occured!\n"); 44 exit(-1); 45 } 46 fwrite((char *)im, sizeof(char), w*h, fp); 47 fclose(fp); 48} 49 50void threshing(unsigned char *a, unsigned char *b, int w, int h, int thresh){ 51 int i, j; 52 53 for (i = 2; i < h - 2; i++){ 54 for (j = 2; j < w - 2; j++){ 55 if (a[i*w + j]) > thresh){ 56 b[i*w + j] = 255; 57 } 58 else{ 59 b[i*w + j] = 0; 60 } 61 } 62 } 63 64 65 66 67} 68 69int main(int argc, char **argv){ 70 71 get_args(argc, argv); 72 73 inimg = (unsigned char *)malloc(width*height*sizeof(unsigned char)); 74 outimg = (unsigned char *)malloc(width*height*sizeof(unsigned char)); 75 76 header_size = 0; 77 image_read_char(argv[1], header_size, inimg); 78 threshing(inimg, outimg, width, height, thresh); 79 image_write_char(argv[4], width, height, outimg); 80 81 free(outimg); free(inimg); 82 printf("completed."); 83 84 return 0; 85}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2016/11/26 12:07

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

2016/11/26 13:44

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

2016/11/26 14:24 編集

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

2016/11/26 14:36

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

回答1

0

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

投稿2016/11/26 12:10

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matchdas3333

2016/11/26 13:46

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問