テンプレートマッチングの一致度を求める問題です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
utcnii
記事: 5
登録日時: 7年前

テンプレートマッチングの一致度を求める問題です

#1

投稿記事 by utcnii » 7年前

C言語のプログラミングについての質問です。テンプレートマッチングについて
テンプレートデータTと入力データDの一致度Cを計算するプログラムを作成しろという問題です。

C=(1/i・j)×ΣTij・Dij

で与えられています。Tijはテンプレートの画素(i,j)の値でDijは入力データ画素(i,j)の値です。画像データが2値画像で、黒を1、白を-1とします。画像は3×3の大きさです。

テンプレートデータTは
-1 1 -1
-1 1 -1
-1 1 -1

で与えられています。
入力データDは実行時に入力するします。Cを求めるプログラムを作成しろというのが問題です。
このプログラムでは答えが一致しません。どこが間違えているのでしょうか?よろしくお願いします。

コード:

#include <stdio.h>

int main(void)
{
int T[3][3]={
	{-1,1,-1},
	{-1,1,-1},
	{-1,1,-1}
};

int a,b,c,d,e,f,g,h,i;

int D[3][3]={
	{a,b,c},
	{d,e,f},
	{g,h,i}
};

printf("aを入力");
scanf("%d",&a);
printf("bを入力");
scanf("%d",&b);
printf("cを入力");
scanf("%d",&c);
printf("dを入力");
scanf("%d",&d);
printf("eを入力");
scanf("%d",&e);
printf("fを入力");
scanf("%d",&f);
printf("gを入力");
scanf("%d",&g);
printf("hを入力");
scanf("%d",&h);
printf("iを入力");
scanf("%d",&i);

int x,y;
int sum=0;
double C;

for(x=0;x<3;x++){
	for(y=0;y<3;y++){
		sum+=T[x][y]*D[x][y];
	}
}
C=(1.0/(x*y))*sum;

printf("C=%.2f\n",C);

return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: テンプレートマッチングの一致度を求める問題です

#2

投稿記事 by みけCAT » 7年前

Dの要素にa~iの不定の値を代入し、そのまま計算しているので未定義動作になります。
他にミスがあるかはチェックしていませんが、とりあえずDの宣言(兼初期化)をa~iを読んだ後にしましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#3

投稿記事 by C6b14 » 7年前

C = (1 / i・j)×ΣTij・Dij
最初はこれだったのでこの通り行列でやればいいのでは?

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#4

投稿記事 by C6b14 » 7年前

入力部分はこんな形にして、画像一致判定は引き算して0でよいのでは。

コード:

	int D[3][3];

	int i, j, value, result, sum=0;
	double C;
	//C = (1 / i・j)×ΣTij・Dij
	for (i = 0; i<3; i++) {
		for (j = 0; j<3; j++) {
			printf("D[%d][%d]=",i,j);
			scanf("%d", &value);
			D[i][j] = value;
		}
	}

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#5

投稿記事 by C6b14 » 7年前

C言語ではこんな判定文は許されているのでしょうか。(一応動くみたいではあります)

コード:

	for (i = 0; i<3; i++) {
		for (j = 0; j<3; j++) {
			result = T[i][j] - D[i][j];
			if (!result) sum++;
		}
	}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: テンプレートマッチングの一致度を求める問題です

#6

投稿記事 by みけCAT » 7年前

C6b14 さんが書きました:C言語ではこんな判定文は許されているのでしょうか。
!演算子は0か1のint型の値を返し、if文の判定は0と等しいとみなせるかそうでないかで行われるので、許されます。

N1570 6.5.3.3 Unary arithmetic operatorsの5より引用
The result of the logical negation operator ! is 0 if the value of its operand compares
unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int.
The expression !E is equivalent to (0==E).
N1570 6.8.4.1 The if statementの2より引用
In both forms, the first substatement is executed if the expression compares unequal to 0.
In the else form, the second substatement is executed if the expression compares equal
to 0. If the first substatement is reached via a label, the second substatement is not
executed.
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#7

投稿記事 by C6b14 » 7年前

つぎの型変換についてもよく分からないのですがいいのでしょうか。(書式を%2.2fにしてます)

コード:

	C = (1.0f / 3.0f * 3.0f)*(double)sum;

	printf("C=%2.2f\n", C);

	return 0;

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#8

投稿記事 by C6b14 » 7年前

一応暫定版としてアップします。

コード:

#include <stdio.h>
int main(void) {

	int T[3][3] = {
		{ -1,1,-1 },
		{ -1,1,-1 },
		{ -1,1,-1 }
	};

	int D[3][3];

	int i, j, value, result, sum=0;
	double C;
	//C = (1 / i・j)×ΣTij・Dij
	for (i = 0; i<3; i++) {
		for (j = 0; j<3; j++) {
			printf("D[%d][%d]=",i,j);
			scanf("%d", &value);
			D[i][j] = value;
		}
	}
	for (i = 0; i<3; i++) {
		for (j = 0; j<3; j++) {
			result = T[i][j] - D[i][j];
			if (!result) sum++;
		}
	}

	C = (1.0f / 3.0f * 3.0f)*(double)sum;

	printf("C=%2.2f\n", C);

	return 0;
}

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#9

投稿記事 by C6b14 » 7年前

質問した方は画像処理を専門とされているとおもいますが(DxLibとかOpenCVでよくにみける)行列なので多分習われたとおもいます。C言語は型が難しいので(とくに論理型=ブール型)にはお気を付けください。

アバター
usao
記事: 1889
登録日時: 11年前

Re: テンプレートマッチングの一致度を求める問題です

#10

投稿記事 by usao » 7年前

>この通り行列でやればいいのでは?

と自身で言いつつ,
なぜ わざわざ 問題で与えられた式とは全く異なる内容の計算(しかもSADですらない謎の計算)を行うプログラムを書いているでしょうか?

テンプレートサイズのみで正規化された内積を求めろという話なのだからそれを求むべきではないのか?
そして,その演算処理自体に関しては質問者の提示コードで既に存在しているのだが,
そこをあえて題意から外れた形に改悪する意図は何か?
オフトピック
質問内容とは微塵も関係のない 型変換だのブールがどうの とかいう唐突な話とかも何なの?

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#11

投稿記事 by C6b14 » 7年前

自分は完全には思考に自信がなくなくもし間違ってたら直してください。(からだにダメージを受け言っていることが違う可能性が大きいです。自分では正しいと思っても違うことがあるのです。)

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#12

投稿記事 by C6b14 » 7年前

(まえにも言ったように問題があり脳神経クリニックで見てもらっているのです。いつおかしくなっても不思議はないのです。間違いだすと問題なのです。でひ直してください。自分が正しいとはいってないはず。ただしい思われる解が自分も知りたいです。十分をあけた(時間があったので)はずと思ったのですが、ぜひお願いします。)

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#13

投稿記事 by C6b14 » 7年前

ここで言われていることと関連すると思いますが。(自分が正しいとかはないので指摘して頂いて感謝申し上げます。)


C6b14

Re: テンプレートマッチングの一致度を求める問題です

#15

投稿記事 by C6b14 » 7年前

>なぜ わざわざ 問題で与えられた式とは全く異なる内容の計算(しかもSADですらない謎の計算)を行うプログラムを書いているでしょうか?

>テンプレートサイズのみで正規化された内積を求めろという話なのだからそれを求むべきではないのか?
>そして,その演算処理自体に関しては質問者の提示コードで既に存在しているのだが,
>そこをあえて題意から外れた形に改悪する意図は何か?
まさか まだ本気で いってるのでありませよね。一番重要なブール型がわからないとは思わないけれども。


アバター
usao
記事: 1889
登録日時: 11年前

Re: テンプレートマッチングの一致度を求める問題です

#17

投稿記事 by usao » 7年前

>まさか まだ本気で いってるのでありませよね。一番重要なブール型がわからないとは思わないけれども。

全く言ってる意味がわからない.
繰り返しにしかならんけど,こちらの疑問をまとめますか?

(疑問1)
あなたが勝手に一番重要とか言ってる話とやらが
【いかなる理由により このトピックの中に唐突に出てきたの?】

(疑問2)
計算すべき内容は
>C=(1/i・j)×ΣTij・Dij
として規定されているわけですが,
【そのことを無視して全く関係のない計算をするプログラムをわざわざ提示する理由とは何なのですか?】


内容が正しいか正しくないか というよりも,
何故そのような話になっているのか? という点がわからないのですよ.

アバター
usao
記事: 1889
登録日時: 11年前

Re: テンプレートマッチングの一致度を求める問題です

#18

投稿記事 by usao » 7年前

念のため,
テンプレートマッチングの一致度を計算するという目的に関しての指摘もしておきますが,

画像D[][]が,例えば

1 -1 -1
1 -1 -1
1 -1 -1

であったとき,あなたの方法では,
計算結果が,
テンプレートT[][]と画像D[][]とが完全一致した場合 と全く同じ値になってしまうのです.

C6B14

Re: テンプレートマッチングの一致度を求める問題です

#19

投稿記事 by C6B14 » 7年前

正式版

コード:


#include <stdio.h>
int main(void) {
 
    int T[3][3] = {
        { -1,1,-1 },
        { -1,1,-1 },
        { -1,1,-1 }
    };
 
    int D[3][3];
 
    int i, j, value, result, sum=0;
    double C;
    //C = (1 / i・j)×ΣTij・Dij
    for (i = 0; i<3; i++) {
        for (j = 0; j<3; j++) {
            printf("D[%d][%d]=",i,j);
            scanf("%d", &value);
            D[i][j] = value;
        }
    }
    for (i = 0; i<3; i++) {
        for (j = 0; j<3; j++) {
            result = T[i][j] - D[i][j];
            if (!result) sum++;
        }
    }
 
    C = (1.0f / ((3.0f * 3.0f)))*(double)sum;//( )が抜けていました

    printf("C=%2.2f\n", C);
 
    return 0;
}
「訂正前の物を載せていました」正式にはこれで正解が出ます。(質問者さんにはすぐ分かったはず:sumの値がdoubleに型変換されて表示されます)

C614b

Re: テンプレートマッチングの一致度を求める問題です

#20

投稿記事 by C614b » 7年前

まだ分かりませんか。
"テンプレートデータTと入力データDの一致度Cを計算するプログラムを作成しろという"という事なので”テンプレートデータTと入力データD”の引き算をすると一致は0不一致は-2 は +2 で 0 を判定すればよい。それは次の通り。

コード:

if (!result) sum++;
この書き方がC言語で許されるのは他の方の英文書から明らかです。
ブーリアン演算の説明よりも明らかです。
もう1つ重要点は質問者さんは "int型を(double)型”に型変換してない事ですが。計算出来る訳がないですよね。

C614b

Re: テンプレートマッチングの一致度を求める問題です

#21

投稿記事 by C614b » 7年前

()を2重にしたの強調しただけでもちろん一組でいいですよ。他の方との話のながれからわかりそうなものと思うけど。わたしが”60FPSを理解してなっかた”話とはかなり違う問題と思うけど...。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: テンプレートマッチングの一致度を求める問題です

#22

投稿記事 by みけCAT » 7年前

C614b さんが書きました:もう1つ重要点は質問者さんは "int型を(double)型”に型変換してない事ですが。計算出来る訳がないですよね。
いいえ。
質問者さんの
utcnii さんが書きました:

コード:

C=(1.0/(x*y))*sum;
という部分では、x,yは掛け算してもint型でオーバーフローしない程度に小さく(int型は少なくとも±32767まで格納できる)、
まず1.0/(x*y)の計算で(x*y)が自動でdouble型に変換されて割り算の結果もdouble型になり、
(1.0/(x*y))*sumの計算も同様にdouble型で行われます。
質問者さんが型変換しなくても、コンパイラがやってくれるので問題ありません。
ここの計算でループ変数x, yを使っているのは不自然ですが、この形式のループの後ではx=3, y=3 (ループをやめた時の値) になってるはずなので、不都合は起きないでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#23

投稿記事 by C6b14 » 7年前

あ、なるほど1.0があるからいいのか。失礼しました。C言語の型は難しいです。


C6b14

Re: テンプレートマッチングの一致度を求める問題です

#25

投稿記事 by C6b14 » 7年前

このときsumには何が入るのでしょう?。内積、外積はよくしりませんが。

アバター
usao
記事: 1889
登録日時: 11年前

Re: テンプレートマッチングの一致度を求める問題です

#26

投稿記事 by usao » 7年前

>"テンプレートデータTと入力データDの一致度Cを計算するプログラムを作成しろという"という事なので”テンプレートデータTと入力データD”の引き算をすると一致は0不一致は-2 は +2 で 0 を判定すればよい。

あえて(与えられた式を無視して,別の方法として) マッチングスコア計算を画像差分に基づいて行う という話の上でも
あなたのコードには問題がある,ということを指摘しているわけですが.(書き込みNo.18のことですよ)

(この手の計算を行う際に,SADなりSSDが使われる理由について,少し考えてみてはいかがでしょうか.)


あと,
>if (!result) sum++;
この行が必要な理由をご教授願いたい.

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#27

投稿記事 by C6b14 » 7年前

>あえて(与えられた式を無視して,別の方法として) マッチングスコア計算を画像差分に基づいて行う という話の上でも
>あなたのコードには問題がある,ということを指摘しているわけですが.(書き込みNo.18のことですよ)

>(この手の計算を行う際に,SADなりSSDが使われる理由について,少し考えてみてはいかがでしょうか.)
この件については理解不可能なので、コードをご提示されてはと思います。

>あと,
>if (!result) sum++;
>この行が必要な理由をご教授願いたい.
上に書いた通りです。白、白の場合も黒、黒の場合も引き算すれば0と思っただけです。
(まさか()がぬけてるとは思わなかったし式を提示して見てもらって指摘がなくそのままで気がつかなかったのです。大変申し訳ございません。わたしのミスです。指摘がなっかたら分かりませんでした。自分でも不安です。自分のPCでは正常値がでてたのにすみません。)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: テンプレートマッチングの一致度を求める問題です

#28

投稿記事 by みけCAT » 7年前

コード:

result = T[i][j] - D[i][j];
if (!result) sum++;
はわかりづらく感じます。
いくらブール代数が重要だとしても、むやみやたらにどこでも使えばいいわけではないでしょう。
単純に値が同じ要素を数えるなら、素直に

コード:

if (T[i][j] == D[i][j]) sum++;
と書けばいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#29

投稿記事 by C6b14 » 7年前

あ、それに全くきずかなかった。質問者の方には重荷でした。

C6b14

Re: テンプレートマッチングの一致度を求める問題です

#30

投稿記事 by C6b14 » 7年前

”プログラムは誰がみてもすぐわかる”が鉄則でした。ごめんなさい。

たいちう
記事: 418
登録日時: 13年前

Re: テンプレートマッチングの一致度を求める問題です

#31

投稿記事 by たいちう » 7年前

オフトピック
milfeulleさんに、「短いコメントを連投するのもあまりよい行為とは言えないので、
推敲した上で書き込んだ方がよいと思います。」とも指摘されていましたよね。

C614bさんに書き込む義務はないのですよ。元の質問者の迷惑になりませんか?
私も他の人もC614bさんを排斥したいわけではありません。
ただ、「質問を見かけて、自分も気になったことがある」のなら、
別スレを立てて好きにしたらどうでしょうか。

アバター
usao
記事: 1889
登録日時: 11年前

Re: テンプレートマッチングの一致度を求める問題です

#32

投稿記事 by usao » 7年前

>まだ分かりませんか。
やっとわかりました.
私はやっとのことで自分自身の愚かさに気づきました.

固定観念ゆえに,C6b14さんのコードを 勝手に見間違えておりました.
具体的には,

コード:

    for (i = 0; i<3; i++) {
        for (j = 0; j<3; j++) {
            result = T[i][j] - D[i][j];
            //if (!result) sum++;
            if (!result) sum+=result;  //←
        }
    }
と書いてるものと勘違いしておりました.
よって,私の書き込みのうち,No.18, No.26 に関しては,全くの誤りであり,妄言でありました.
申し訳ありませんでした.

画素ごとの差分値による評価関数なのではなくて,
もっと素朴な「完全一致する画素の個数カウント」なのですね.
確かに,2値画像の場合においては,この方法は一致度の判定方法としてあり得る方法です.
勉強になりました.

閉鎖

“C言語何でも質問掲示板” へ戻る