• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:次式のような解像度変換のプログラムを作りたいのですが・・・)

解像度変換のプログラム作成について

このQ&Aのポイント
  • 解像度変換のプログラムを作りたいが正しく実行できない
  • 解像度変換の式に誤りがないか確認してほしい
  • プログラムの一部が間違っている可能性がある

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.2

#1です。 式A: X'{m,n}  =(1/W^2)*ΣΣ    X{[(m+m0)/W]*W+k,[(n+n0)/W]*W+l} でなくて 式B: X'{m,n}  =(1/W^2)*ΣΣ    X{[(m+m0)/W]*W-m0+k,[(n+n0)/W]*W-n0+l} かなあ・・・。 自信アリマセンが・・・。 --- いわれてみれば確かに、式Aは、数式の"外観的"には 式C: X'{m,n}  =(1/W^2)*ΣΣ    X{[m/W]*W+k,[n/W]*W+l} の図形(?)を「単純に(-m0,-n0)だけ平行移動」したものですよね・・・。 (※高校数学うろ覚えですが)

yamada-ke
質問者

お礼

度々ありがとうございます。 回答者様のおっしゃる通り式Bで作り直してみると 成功しました!! 式Aはただ結果画像を平行異動させるだけの式ですよね・・ 何度も適当な値を代入してて計算してみたのですがどう考えても 平行移動させてるだけなのに何故・・・・? と思っていましたがはやりそうでしたね。 式Bのようにすることで原画像の平均値を取る範囲をずらすことで 違った結果が得られるようにできるのですね。 スッキリしました。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.1

>W=10,m0=0,n0=0とした場合の結果と >W=10,m0=10,n0=10とした場合を比べると >単に前者の結果画像が縦横に10画素ずつずれただけ とのことですが、 >m0とn0の値は0~W-1の任意の値で >これを変化させることで同じ解像度で異なる画像が作成できます と質問者さん自身がお書きになってる以上、 (W=10の場合、)m0とn0のとりうる値は「0から9まで」では?

yamada-ke
質問者

補足

すいませんミスです。 おっしゃる通りW=10ならm0とn0の範囲は0~9までです。 ただ0~9の値に設定してもやはり0と1~9に設定したときの 結果の違いは平行移動した画像が出来るだけです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • プログラムに詳しい方教えてください!

    #include<stdio.h> void fxl(int x,int y); int main(void) { int a,b,m,n; printf("整数aの値を入力\n"); scanf("%d",&b); printf("整数bの値を入力\n"); scanf("%d",&b); m=a; n=b; fxl(m,n); printf("a=%dとb=%dを加算した値は%d\n",ab,m); printf("a=%dからb=%dを減算した値は%d\n",ab,n); return 0; } void fxl(int x,int y) { int j,k; j=x; k=y; x=j+k; y=j-k; } このプログラムを作ってみたのはいいのですが、参照渡しを使って正常に足し算、引き算をするにはどうすればよいのでしょうか。

  • C言語でmからnまでの合計を求めるプログラム

    これで動かないのですが、何が違っているのか、教えていただけますか。 #include <stdio.h> int main(void) { int m, n, sum, i, w ; printf("mからnまでの合計を求めます\n\n"); printf("m >> "); scanf(" %d", &m); printf("n >> "); scanf(" %d", &n); sum=0; if(m>n){ w=m; m=n; n=w; } sum=0; i=m; while(i<=n){ sum=sum+i; i=i+1; } printf("%d から %d の合計 = %d\n",m,n,sum); return 0; }

  • Greedy Searchのプログラムについて

    現在、Greedy Searchについてプログラムを組み、Linuxで実行をしていますが、セグメントエラーが発生します。 配列数の不足によるものかと思い、配列の数を1000に増やして宣言したりしましたが、結果は同じになります。 何度か見直しても原因が発見できないので、ヒント、アドバイスをいただけたら幸いです。 #define SRC_X_SIZE 352 入力画像縦サイズ  #define SRC_Y_SIZE 288 入力画像横サイズ #define MB_SIZE 16 マクロブロックサイズ #define MB_X_NUM 22 TB number (SRC_X_SIZE/TB_X_SIZE) #define MB_Y_NUM 18 TB number (SRC_Y_SIZE/TB_Y_SIZE) #define SW_SIZE 7 探索窓サイズ #include "includes.h" /*=============================================================== routine : FullSearch return val : int input par : float *premap float *crtmap float *vecy float *vecx function : full search ===============================================================*/ int fullSearch(float *premap, float *crtmap, float *vecy, float *vecx) { double sum; double min[100]; register int i, j, k, m, n, x, y, xx, yy; int ma[100],na[100],check[1000][1000]; for (y = 0, yy = 0; y < SRC_Y_SIZE; y += MB_SIZE, yy++) { for (x = 0, xx = 0; x < SRC_X_SIZE; x += MB_SIZE, xx++) { ma[k],na[k]=0; min[k] = DBL_MAX; k=0; check[m][n]=0; do{ k++; /*探索範囲*/ for (n = -SW_SIZE + 6 + na[k]; n <= SW_SIZE - 6 + na[k]; n += 1) for (m = -SW_SIZE + 6 + ma[k]; m <= SW_SIZE - 6 + ma[k]; m += 1) { /*既にチェックした座標かどうかの確認*/ if(check[m][n]==0) { /*画像端部の処理*/ if ((y + n < 0) || (x + m < 0) || (SRC_Y_SIZE < y + n + MB_SIZE - 1) || (SRC_X_SIZE < x + m + MB_SIZE - 1)) continue; /*誤差の計算*/ sum = 0.0; for (j = 0; j < MB_SIZE; j++) for (i = 0; i < MB_SIZE; i++) { sum += fabs(crtmap[(y + j)*SRC_X_SIZE + (x + i)] - premap[(y + n + j)*SRC_X_SIZE + (x + m + i)]); } /*動きベクトルの更新*/ if (sum < min[k]) { min[k] = sum; na[k] = n; ma[k] = m; } check[m][n] = 1; } } /*前段階の最小値と比較*/ if(min[k-1] <= min[k]){ na[k] = na[k-1]; ma[k] = ma[k-1]; } }while((na[k] != na[k-1]) && (ma[k] != ma[k-1])); /*前段階の座標と一致するまで処 理を繰り返す*/ vecy[yy*MB_X_NUM + xx] = na[k]; vecx[yy*MB_X_NUM + xx] = ma[k]; } } return 0; }

  • C++で2点間の内積と距離を求めるプログラム

    C++で2点間の内積と距離を求めるプログラムを作ったのですが、コンパイルの時点でエラーが6つも出てしまいます>< 何がいけないのでしょうか? #include <iostream> #include <cmath> using namespace std; int main(void){ int x, y, z, w, l, n; cin >> x >> y >> z >> w; n=x*w+y*z;   l=sqrt((x-z)(x-z)+(y-w)(y-w)); cout << "距離は" << l << "で、内積は" << n; return 0; }

  • C言語。どうしてコンパイルできません^^;

    最近プログラミングの勉強をはじめました。 C言語を勉強しています。 /*入力した値の、平均値・最大値・最小値・を出す。*/ #include <stdio.h> int main(void) { int x[5],i,j,w,x,y,z,sum; printf("5つの実数の平均、最大値、最小値を求めます\n"); sum = 0; for(i=0; i<5; i++){ printf("値%d:",i+1); scanf("%d",&x[i]); sum += x[i]; } for(y=0; y<5; y++){ for(j=0; j<4; j++){ w=j+1; if(x[j] < x[w]){ z = x[i]; x[i] = x[w]; x[w] = z; } } } printf("平均値:%f\n最大値:%d\n最小値:%d\n", (double)sum/5, x[0], x[4]); return 0; } Microsoft Visual C++ 2008 Express Edition でコンパイルをしようとしたのですが、 「error C2040: 'x' : 'int' は 'int [5]' と間接操作のレベルが異なります。」 と出てできませんでした^^; 何度も見直したのですが、どうしても間違っている場所がわかりません^^; どこがいけないのでしょうか^^;

  • プログラムのスレッド化について。

    以下の処理をスレッド化しようとしています。 public class FCP{ int N=10 long LOOP_MAX=100 double x[][] = new double[N][4] int g[][] = new int[N][4] boolean y[][] = new boolean[N][4]//出力 boolean A[][] = new boolean[N][10] double T=0.5 Set_Adjacent_Matrix() //A配列にtrueとfalseを代入 Set_initial_value() //y配列に初期値を代入(Math.random()>0.5) g1(int i, int j) //k<4 sum=1 if( y[i][k] == true ) --sum return(double)sum g2(int i, int j) //k<N sum=0 if( y[i][j] == true ) if( y[k][j] == true && A[i][k] == true ) --sum return(double)sum Display_output() //結果表示 if( y[i][j] ) System.out.print("0") else System.out.print(".") public static void main(String args[]) { long loop; int i, j, k; Set_Adjacent_Matrix(); Set_initial_value(); for( loop=0; loop<LOOP_MAX; loop++ ){ for( i=0; i<N; i++ ){ for( j=0; j<4; j++ ){ x[i][j] = g1( i, j ) + g2( i, j ); if( y[i][j] ){ x[i][j] += T; }else{ x[i][j] -= T; } if( x[i][j] > 0.0){ y[i][j] = true; }else{ y[i][j] = false; } } } Display_output(); } } 今回Threadクラスの継承を使ってスレッド化しようと考えました。runメソッドには上のプログラムのmain部分の処理をさせようと思っています。そしてstartメソッドで必要な数(Nの値=10コ)のスレッドを生成しrunメソッドを実行する。 と、ここまではわかったのですが、「生成された各スレッドの番号を保持し、そのスレッドに担当させる処理を決める」という部分をどうすればいいのかわかりません。 「i(1~10)番目のスレッドはN(1~10)列目の処理を担当している」という風にするにはどうしたらいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • プログラムについてですが・・・

    今、画像処理の最小二乗法のプログラムを作成しているのですが、どうも上手く出力されません。以下のプログラムが、メインのプログラムでして、余分な #include は気にしないでください。画像の表示自体のプログラムは特に問題はありませんでしたので省きました。このプログラムにどんな問題があるか、わかりません。どなたか教えてください。 お願いします。 #include <math.h> #include <windows.h> #include <commdlg.h> #include <memory.h> #include <dos.h> #include <time.h> #include <wchar.h> #include <stdio.h> #include <iostream.h> #include "../DibFile.h" #include "ImageSDK.h" int n,n4,n5,n6,n7,n8,n9 ; double n10,n11 ; int n0[1000],n1[1000],n2[1000],n3[1000] ; n = 0 ; for(y = 0 ; y < h ; y++){   for(x = 0 ; x < w ; x++){ i = x+y*w ; if( *(buff1+i) == 0x00 ){                n0[n] = x ;                n1[n] = y ;                n2[n] = x*x ;                n3[n] = x*y ;                ++n ; } } } n5 = 0 ; n6 = 0 ; n7 = 0 ; n8 = 0 ; n9 = 0 ; for(n4 = 0 ; n4 < n ; n4++){ n5 += n2[n4] ; n6 += n0[n4] ; ++n7 ; n8 += n3[n4] ; n9 += n1[n4] ; } if((n6*n6-n7*n5) != 0){  n10 = ((n9*n6)-(n7*n8)) / ((n6*n6)-(n7*n5)) ;  n11 = (n8-(n5*n10)) / n6 ; for(x = 0 ; x < w ; x++){   y = (int) (n10*x+n11) ;    if(y < h && y > 0){  *(buff1+(x+y*w)) = 0x80 ;    } }

  • フーリエ変換のC言語プログラムについて

    正弦波(およびガウス性雑音)をフーリエ変換(離散)→逆フーリエ変換するというプログラムを組みました。正弦波をフーリエ変換すると実部は2回ピークがくるはずなのですが、すべて「0.000000」または「-0.000000」と表示されてしまいます。虚部は正常なようで実装の仕方もさほど違わないので、何が問題なのかわからずにいます。念のためコードはすべて載せますが、該当箇所は関数Fourierの fp = fopen("reX.txt", "w"); //書き込む あたりです。問題点を教えていただけないでしょうか。お願いします。 //gauss.txt, sin.txt:発生させたガウス性雑音&正弦波 //reX, imX:フーリエ変換の実部と虚部 //re-1, im-1:逆フーリエ変換の実部と虚部 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #define PI 3.14159265358979323846 #define N 256 //n:長さ, w:角周波数, p:位相(phase), a:振幅 void SinCurve(int n, double w, double p, double a) { FILE *fp; double x; int t; fp = fopen("sin.txt", "w"); //書き込むので"w" if(fp == NULL) { printf("file open error\n"); } else { for(t = 0; t < n; t++) { x = a * sin( w*(double)t + p ); fprintf(fp, "%f\n", x); } } fclose(fp); } //n:長さ, s:分散, m:平均 void Gauss(int n, double s, double m) { FILE *fp; double x, x1, x2, y1; int t; srand((unsigned) time(NULL)); fp = fopen("gauss.txt", "w"); //書き込むので"w" if(fp == NULL) { printf("file open error\n"); } else { for(t = 0; t < n; t++) { x1 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0); x2 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0); y1 = pow(-2.0*log(x1), 0.5) * cos(2.0*PI*x2); y1 = s * y1 + m; fprintf(fp, "%f\n", y1); } } fclose(fp); } //ファイル名sのデータをフーリエ変換し、実部と虚部をreX, imXに保存 void Fourier(int num, char *s) { FILE *fp; int k, n; double largeX, x[N+100], t; fp = fopen(s, "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { // printf("%s\n", s); for(k = 0; k < num; k++) { fscanf(fp, "%lf", &x[k]); printf("x[%d]=%f\n", k, x[k]); } } fp = fopen("reX.txt", "w"); //書き込む if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { largeX = 0.0; t = 2.0*PI*(double)k / (double)N; for(n = 0; n < num; n++) { largeX += x[n] * cos((double)n*t); // printf("%f\n", largeX); } fprintf(fp, "%f\n", largeX); printf("reX[%d]=%f\n", k, largeX); } } fp = fopen("imX.txt", "w"); //書き込む if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { largeX = 0.0; t = 2.0*PI*k / (double)N; for(n = 0; n < num; n++) { largeX -= x[n] * sin(n*t); } fprintf(fp, "%f\n", largeX); } } fclose(fp); } void InverseFourier(int num) { FILE *fp; int k, n; double a[N+100], b[N+100], x, t; //a:reX, b:imX fp = fopen("reX.txt", "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { fscanf(fp, "%lf", &a[k]); // printf("a[%d]=%f\n", k, a[k]); } } fp = fopen("imX.txt", "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { fscanf(fp, "%lf", &b[k]); // printf("b[%d]=%f\n", k, b[k]); } } fp = fopen("re-1.txt", "w"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(n = 0; n < num; n++) { x = 0.0; t = 2.0*PI*(double)n / (double)N; for(k = 0; k < num; k++) { x +=a[k] *cos(k*t) - b[k] *sin(k*t); } x /= (double)N; fprintf(fp, "%f\n", x); // printf("x[%d]=%f\n", n, x); } } /* fp = fopen("im-1.txt", "w"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(n = 0; n < num; n++) { x = 0.0; for(k = 0; k < num; k++) { t = 2.0*PI*(double)k / (double)N; x = x + a[k] *sin(n*t) + b[k] *cos(n*t); } x /= (double)N; fprintf(fp, "%f\n", x); } } */ fclose(fp); } int main(void) { SinCurve(N, PI/8.0, 0.0, 1.0); // Gauss(N, 1.0, 0.0); Fourier(N, "sin.txt"); // Fourier(N, "gauss.txt"); InverseFourier(N); return 0; }

  • RGBをCMYKに変換するプログラム

    Windows7 VS2008 SP1 RGBからCMYKに変換するプログラムを以下の様に書いている ([詳解]画像処理プログラミング という本に載っている ソースです) のですがうまくいきません。 おそらく型の扱い??だと思うのですが・・ 具体的にどの部分を修正すればいいのかご指摘お願いします。 INPUT:24bpp raw int RawToCMYK(WCHAR *filename,int width,int height) { FILE *fpt; FILE *fpt_C,*fpt_M,*fpt_Y,*fpt_K; unsigned char *layer; unsigned char *C,*M,*Y,*K; int i,j; _wfopen_s(&fpt,filename,L"rb"); if(fpt==0x00) { MessageBox(NULL,L"RawToCMYK Error",L"RawToCMYK Error",MB_OK); return -1; } else { layer=(unsigned char*)malloc(3*width*height); C=(unsigned char *)malloc(width*height); M=(unsigned char *)malloc(width*height); Y=(unsigned char *)malloc(width*height); K=(unsigned char *)malloc(width*height); fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); fclose(fpt); _wfopen_s(&fpt_C,L"RawToC.raw",L"wb"); _wfopen_s(&fpt_M,L"RawToM.raw",L"wb"); _wfopen_s(&fpt_Y,L"RawToY.raw",L"wb"); _wfopen_s(&fpt_K,L"RawToK.raw",L"wb"); for(i=0;i<3*width*height;i+=3*width) { for(j=0;j<3*width;j+=3) { C[i/3+j/3]=255-layer[i+j]; M[i/3+j/3]=255-layer[i+j+1]; Y[i/3+j/3]=255-layer[i+j+2]; K[i/3+j/3]=min3(C[i/3+j/3],M[i/3+j/3],Y[i/3+j/3]); if(K[i/3+j/3]==0xff) { C[i/3+j/3]=0x00; M[i/3+j/3]=0x00; Y[i/3+j/3]=0x00; } else { C[i/3+j/3]=(C[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); M[i/3+j/3]=(M[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); Y[i/3+j/3]=(Y[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); } } } fwrite(&C[0],sizeof(unsigned char),width*height,fpt_C); fwrite(&M[0],sizeof(unsigned char),width*height,fpt_M); fwrite(&Y[0],sizeof(unsigned char),width*height,fpt_Y); fwrite(&K[0],sizeof(unsigned char),width*height,fpt_K); fclose(fpt_C); fclose(fpt_M); fclose(fpt_Y); fclose(fpt_K); free(C); free(M); free(Y); free(K); return 0;

  • K次式の等式の問題がどうしても…

    1/k^!*z^l+1/(k-1)^!*z~k-1*w+1/(k-2)^!*z^k-2*w^2/2^!+… +1/l^1*z^l*1/(k-l)^!*w^k-l+…+1/k^!*w^k =1/k^!*(z+w) この等式が成り立つ理由を教えてください。 お願いします