回答受付が終了しました

ID非公開

2020/8/12 3:00

11回答

プログラミング C言語の問題が分からず困っています。 <問題文>対象画像ファイルとディレクトリ内の全ての画像間の類似度(相関係数)を出力するプログラムを実装せよ。

プログラミング C言語の問題が分からず困っています。 <問題文>対象画像ファイルとディレクトリ内の全ての画像間の類似度(相関係数)を出力するプログラムを実装せよ。 実行例 $ ./cpgm/calc_similarity flag/ 196 flag/jp.ppm flag/ad.ppm: 3.801405e-02 flag/ae.ppm: 4.910417e-01 flag/af.ppm: 7.670797e-02 flag/ag.ppm: 2.137057e-01 flag/al.ppm: 7.882708e-02 flag/am.ppm: 3.531104e-01 : flag/jp.ppm: 1.000000e+0 : flag/za.ppm: 2.427965e-01 flag/zm.ppm: 1.375504e-03 flag/zw.ppm: 4.042585e-01 ⁃ 第1コマンドライン引数:画像ディレクトリ名 ⁃ 第2コマンドライン引数:ファイル数(例:196) ⁃ 第3コマンドライン引数:対象画像ファイル名 全体の流れ get_filelist関数で,指定ディレクトリ内の全画像ファ イルのパスを要素とした配列を構築する. ファイルパスの配列filesに格納された画像ファイルを 1つずつ開き,Image構造体の配列のメンバ変数に値を 設定する.(for文でread_image関数を呼ぶ) Image構造体配列の各要素に対して,ヒストグラムを構築 する.(for文でcalc_hist関数を呼ぶ) 対象画像のImage構造体とヒストグラムを構築する. 対象画像とディレクトリ内の全ての画像間の類似度を 計算する(for文でcalc_similarityを実行する) <途中まで書いたコード> #include <stdio.h> #include <stdlib.h> #include "image_data.h" uchar convolution(Image *img, int y, int x){ int res = 0; for(int j = 0; j < 3; j++){ for(int i = 0; i < 3; i++){ res += filter[j][i] * img->pixel[y+j-1][x+i-1]; } } if(res > img->max_value) return img->max_value; if(res < 0) return 0; return res; } Image laplacian_filter(Image *img1){ Image img2 = {img1->magick_number, img1->width, img1->height, img1->max_value}; img2.pixel = (uchar **) malloc(img2.height*sizeof(uchar *)); for(int y = 0; y < img2.height; y++) img2.pixel[y] = (uchar *) calloc(img2.width, sizeof(uchar)); for(int y = 1; y < img1->height-1; y++) for(int x = 1; x < img1->width-1; x++) img2.pixel[y][x] = convolution(img1, y, x); return img2; } void calc_similarity(int **h1, int **h2, int n){ double r = 0.0; for(int c = 0; c < NUM_OF_COLORS; c++) r += corrcoef(h1[c], h2[c], n); printf("%f\n", r/NUM_OF_COLORS); } double corrcoef(int *h1, int *h2, int n){ int i; double avg, std, crr; double *v1 = (double *) malloc(n*sizeof(double)); for(i = 0, avg = 0.0; i < n; i++) avg += h1[i]; for(i = 0, avg = avg/n; i < n; i++) v1[i] = h1[i]-avg; for(i = 0, std = 0.0; i < n; i++) std += v1[i]*v1[i]; for(i = 0, std = 1.0/sqrt(std); i < n; i++) v1[i] *= std; double *v2 = (double *) malloc(n*sizeof(double)); for(i = 0, avg = 0.0; i < n; i++) avg += h2[i]; for(i = 0, avg = avg/n; i < n; i++) v2[i] = h2[i]-avg; for(i = 0, std = 0.0; i < n; i++) std += v2[i]*v2[i]; for(i = 0, std = 1.0/sqrt(std); i < n; i++) v2[i] *= std; for(i = 0, crr = 0.0; i < n; i++) crr += v1[i]*v2[i]; free(v1); free(v2); return crr; } void get_filelist(char *dir, char **files); FILE *gp = popen(sprintf, "r"); fgets(tmp, 128, gp); int main(int argc, char *argv[]){ Image image1, image2; read_image(argv[1], &image1); read_image(argv[2], &image2); int **hist1 = calc_hist(&image1); int **hist2 = calc_hist(&image2); calc_similarity(hist1, hist2, image1.max_value+1); }

C言語関連36閲覧xmlns="http://www.w3.org/2000/svg">100

回答(1件)

0

わけがわからずにあちこちのソースをまぜこぜにしている感が...なんでラプラシアンフィルターが出てくるのかしら? 課題はちょっと棚上げして、ディレクトリ内のファイル一覧を表示してみるところから始めてはいかがでしょう。 'linux c言語 ディレクトリ ファイル一覧' あたりをキーにして検索すればいくつもの例が見つかると思います。