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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

5161閲覧

【画像処理】ZNCCをC言語で実装したい

moririn4449

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/02/04 08:03

編集2020/02/04 08:40

前提・実現したいこと

C言語とGCCを使っています。
ZNCC(テンプレートマッチング)を使い類似度の一番高い一番最初の画素の特定を輝度情報をもとに実装したいのですが、コンパイルは通るものの探索がある一定の位置でプログラムが強制終了してしまいます。

画像のピクセルの位置は一次元の配列になっています。
imgは元の大きい画像をtempはテンプレート画像を表しています。
NCC関数内で元画像の(x,y)を起点とする類似度を求め、templatematching関数で類似度が一番高かった座標を求めています。

私はプログラミング初心者でつたないコードしか書けませんがよろしくお願いいたします。

ZNCCの実装にあたって参考にしたサイトです
テンプレートマッチングについて理解する
パターンマッチング(正規化相関など)

該当のソースコード

C言語

1typedef struct{ 2 unsigned int width; 3 unsigned int height; 4 Rgb *rgb; 5 Hsv *hsv; 6}Image; 7 8int templatematching(Image *img, Image *temp) 9{ 10 int i, j, k, x, y, index; 11 double ncc=-1.0, n, mu=0; 12 13 for(k=0; k<temp->height*temp->width; k++){ 14 mu += temp->hsv[k].v; 15 } 16 mu = mu / k; 17 18 for(i=0; i<img->height; i++){ 19 for(j=0; j<img->width; j++){ 20 21 if(ncc < (n = NCC(img, temp, j, i, mu))) 22 { 23 ncc = n; 24 y = i; 25 x = j; 26 } 27 } 28 } 29 30 index = y*img->width + x; 31 return index; 32 33} 34 35 36double NCC(Image *img, Image *temp, int x, int y, double mu) 37{ 38 int i, j, k=0, index; 39 double bunsi=0, bunbo1=0, bunbo2=0; 40 double ncc, mi=0; 41 42 index = y * img->width + x; 43 44 45 for(i=0; i<temp->height-1; i++){ 46 for(j=0; j<temp->width-1; j++){ 47 48 mi += (img->hsv[index + i * img->width + j].v); 49 k++; 50 } 51 } 52 53 mi = mi / k; 54 55 56 for(i=0; i<temp->height-1; i++){ 57 for(j=0; j<temp->width-1; j++){ 58 if((y + i * img->width > img->height) || (x + j > img->width) ) break; 59 bunsi += (img->hsv[index + i * img->width + j].v-mi) * (temp->hsv[i*temp->width+j].v-mu); 60 bunbo1 += sqrt((img->hsv[index + i * img->width + j].v -mi)* (img->hsv[index + i * img->width + j].v -mi)); 61 bunbo2 += sqrt((temp->hsv[i*temp->width+j].v- mu) * (temp->hsv[i*temp->width+j].v- mu)); 62 63 } 64 } 65 66 ncc = bunsi / (bunbo1 * bunbo2); 67 68 return ncc; 69} 70

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

templatematchingではx, yを画像の幅と高さの範囲で回し、NCCでさらにテンプレート画像の幅とサイズの走査をしているため画像端部でのNCC処理で参照する部位が画像をはみ出しているものと思われますが如何でしょうか?

投稿2020/02/04 08:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

moririn4449

2020/02/04 09:14

回答ありがとうございます! miの値を求める際のforループで範囲外を指定していたみたいです。 一歩前進できました!ありがとうございます!
退会済みユーザー

退会済みユーザー

2020/02/04 09:44 編集

ところで他にも気になっていることがあるのですが 1. for文の終了条件の-1の意図は? 2. breakの条件の y + i * img->width > img->height おかしいのでは? あと間違いではないのですがテンプレートの分散(bunbo2)も事前計算できると思いますし、bunsiとbunbo1も分散と共分散の式を変形し、2乗平均ー平均の自乗、積和の平均ー平均の積を計算する形に持って行けば事前に平均を計算せずとも並行して計算できるので高速になると思います。 (8bitの常識的なサイズであればオーバーフローしない) 頑張って下さい!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問