• ベストアンサー

6x6ぼかしマスクをかけるプログラムを作りたい。画像処理の専門書に「6

6x6ぼかしマスクをかけるプログラムを作りたい。画像処理の専門書に「62x62ピクセルの2値画像(内四方2ピクセルは余白領域)があり、それに6x6ドットのぼかしマスクを2ドットずつオーバーラップさせることで、15x15ピクセルの標本化パターンを作成する」との記述がありました。 3x3ドットによる画像のフィルタリングプログラム例は探せば見つかるのですが、偶数倍フィルターにおいてはどのように実装すればよいかがピンときません。プログラムの参考例を教えて欲しいです。

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

  • ベストアンサー
回答No.2

> 62ピクセルだと6や15で割り切れないので、どうやったら帳尻を合わせることができるでしょうか。  「2ドットずつオーバーラップさせる」とありますね。  最初に(0,0)を左上とする6×6の領域を処理し、次は4ドット右に移動させた(4,0)を左上とする6×6の領域を処理します。こうやって4ドットずつ移動させると前回の処理とは2ドットずつオーパーラップしていきます。15回目には(56,0)を左上とする6×6の領域を処理しますが、これの右端は62x62ピクセルの画像の右端と重なります。  こうやって右端まで行くと、今度は左端に戻って4ドット下に移動させた(0,4)を左上とする6×6の領域から同様に右に向かって処理していきます。これもひとつ前(上)の処理とは2ドットずつオーバーラップします。こうやって4ドットずつ下に移動して処理していくと、やはり15回目には(0,56)を左上とする6×6の領域から処理を始めることになり、この領域の下端は62x62ピクセルの画像の下端と重なります。  こうやって15×15回の処理をして15x15ピクセルの標本化パターンを作成するのです。

Tank2005
質問者

補足

「2ドットのオーバーラップ」の意味がようやく理解できました。丁寧な解説をありがとうございます。

その他の回答 (1)

回答No.1

別に奇数でも偶数でも変わりません。 要はマス目の数を一辺 m とした時、各画素の重みが 1/m^2 になるようにすればよいだけです。 ぼかしマスクを掛けるということは、つまり6×6の画素範囲を平均化して標本化するということですから、この6×6の範囲の各画素の値に重み 1/36 を掛けたものを36画素分合計して、これを標本値(15×15のうちの1ピクセル)とするということです。

Tank2005
質問者

補足

62ピクセルだと6や15で割り切れないので、どうやったら帳尻を合わせることができるでしょうか。

関連するQ&A

  • 「ファイルから貼り付け」しても元の画像の大きさに保つためには。。

    Windows XP標準のペイントソフトを使っています。 たとえば100ピクセル四方の大きさの元の画像の上に 500ピクセル四方の大きな画像を 「ファイルから貼り付け」すると 上に乗っかった状態で画像が表示されますが・・ これをスライドして元の画像をみてみると 余計な白無地の余白ができてしまいます! 余白を作らないようにするにはどうすればよいでしょうか? ご教授ください。。

  • WEBバナーの作成【枠の作り方、マスクの方法】

    使用しているのはWindows【フォトショップCS3】です。 【600×600】ピクセルの中に 【280ピクセルの正方形の枠】を【4つ】置きたい それだと余白?できますが そこの【余白はグレー】にしたい。 そしてその【280px枠で画像をマスク】をしたい。 枠のまわりにも1pxの罫線が必要です。 やり方も当然のこと どういう手順で作業していくのが効率がいいのか教えてください。

  • くし形フィルタのプログラム

    論文でくし形フィルタという手法を見つけ内容を理解したのですが プログラミングが苦手で実装できずに困っています。 音高推定を行う対象のデータは揃っているので それを読み込んで実際にフィルタリングを行いたいのですが…。 お勧めの参考書や、実際に書いたプログラムがあれば教えていただけると幸いです。

  • 画像を決まった比率で縮小したい

    製品案内のホームページを作成しています。 製品を選択するためにサムネイルで一覧を作りたいのです。 製品画像はすべて同じ縮小比率になるように作成してあるのですが、 (たとえば、100mm四方のものは100ピクセル四方、 50mm四方のものは50ピクセル四方という感じで製品画像を用意してあります) サムネイル画像をひとつひとつ作成するのは面倒なので、 スタイルシートなどの機能で製品画像を縮小したもので代用しようと思います。 サイズが重要な製品(というより各製品の違いがサイズだけ)なので、 たとえば50×50ピクセル以内の大きさのサムネイル画像を作成したいときに、 小さいものは小さく、表示したいのです。 (上記例では、100mm四方のものを50ピクセル四方、 50mm四方のものは25ピクセル四方という感じに) IEならば、最大サイズの製品を基準にzoomスタイルを使用すればいいのですが、 他のブラウザでどうすればいいのか悩んでいます。 transform:scaleを使用すると、元の画像サイズのスペースが周囲にとられてしまうので 何か他に方法は無いでしょうか?JavaScriptかなにかで画像サイズを取得して 寸法指定するしかないのでしょうか? サムネイル画像を作ればいいだけの話なんですけどね…

    • ベストアンサー
    • HTML
  • 画像縮小で大きさが指定できるソフト

    デコメをつくりたいのですが、画像のタテヨコのドット(ピクセル?)が指定できるソフトを教えてください。 調べて出てくるソフトは、指定の“枠内に収まる”ように縮小するものしか出てきてくれません。 たとえば、240x320の画像を20x20にする、といったことがしたいのです。 デコメ作成には GIAM を使うので。

  • 画像処理

    初歩的な質問なんですが、この下のプログラムは画像全体にモザイクをかけているものですが、画像上の範囲を指定して、その範囲内の領域だけモザイクをかけるにはどうしたらいいでしょうか? void make_cmosaic_image() { int i,j,x,y,k; int bsz; /*ブロックサイズ*/ int bx,by; int bvaIR,bvaIG,bvaIB; /*ブロックの平均値*/ int pels; int X,Y; /*ピクセルの位置*/ printf("カラー画像のモザイク化\n"); pXdim2=pXdim1; pYdim2=pYdim1; printf("ブロックサイズを入力してください(1より大きい値):"); scanf("%d",&bsz); printf("ブロックサイズは%dである。",bsz); if(pXdim1 % bsz ==0) bx= pXdim1 / bsz; else bx=pXdim1 / bsz+1; if(pYdim1 % bsz ==0) by=pYdim1/bsz; else by=pYdim1/bsz+1; /*モザイク化する*/ for(j=0;j<by;j++) for(i=0;i<bx;i++){ /*ブロックごと に 計算する*/ /*各ブロックのピクセル平均値を計算する*/ bvaIR = bvaIG =bvaIB=0; pels=0; /*各ブロックのピクセル値の和を計算する*/ for(y=0;y<bsz;y++) for(x=0;x<bsz;x++){ /*現在のピクセルの位置を計算する*/ X=i*bsz+x; Y=j*bsz+y; /*この位置が有効であれば、和を計算する*/ if(X>=0 && X<pXdim1 && Y>=0 && Y<pYdim1){ pels++; /*和を計算する*/ bvaIR +=pimage1[0][Y][X]; bvaIG +=pimage1[1][Y][X]; bvaIB +=pimage1[2][Y][X]; } } bvaIR /=pels; bvaIG /=pels; bvaIB /=pels; /*計算した平均値を目的画像へ代入する*/ for(y=0;y<bsz;y++) for(x=0;x<bsz;x++){ X=i*bsz+x; Y=j*bsz+y; if(X>=0 && X<pXdim1 && Y>=0 && Y<pYdim1){ else pimage2[0][Y][X]=bvaIR; pimage2[1][Y][X]=bvaIG; pimage2[2][Y][X]=bvaIB; }  }  }  }

  • X=A^(-1)B の計算(逆行列を使った解)

    AX=Bという行列式があり、そこからXの解を求めるのに Aの逆行列A^(-1)をBに書けてXを求めるCプログラムないでしょうか? 例 2 3 4 X11 X12 X13 X14 2 4 6 8 ( 3 4 6 ) ( X21 X22 X23 X24) = 1 5 8 9 -1 2 9 X31 X32 X33 X34 -2 3 1 1 というときにXのマトリックスをだすプログラムがほしいのですが…。

  • ビットマップ画像を読み込むプログラムがうまく行きません。困ってます…。

    こんにちは。大学4年のyu-tinと申します。 現在、大学の研究で使用するためのプログラムとして、以下の機能を持ったプログラム作りに取り込んでいます。 1)ビットマップ画像(グレースケール、縦480×横640pixel)を読み込み、  その画像の1つ1つの画素の輝度値を表示させる 2)読み込んだビットマップ画像を出力させる しかし、作成したプログラムがうまく行きません。以下の3つの問題が発生しています。 a)0行0列~1行383列までの画素値がおかしい。  (0,0,0,0,1,1,1,0,2,2,2,0,3,3,3,0,…,254,0,255,255,255,0 となっている) b)出力した画像の最上部2行程度に、細くて黒い線が表示される。  (読み込んだ画像と全く同じ画像を出力させたい) c)出力した画像が、”ディスクエラー”によりPhotoshopで開けない。  (ペイントでは開ける) その問題のプログラムは、以下の通りです。 しかし、このプログラムは、他人のプログラムに改良を加えて作成したものです。なので、このプログラム自体、私自身が完璧に理解できていない状況です。 私は、プログラミングに関しては初心者に近いので、丁寧に教えて頂けると大変助かります。 研究が先に進まず、大変困っています…。みなさま、本当に、本当によろしくお願い致します。 //ビットマップ画像に関するプログラム。 //画像の表示と輝度値の表示を行う。 #include<stdio.h> #include<windows.h> #include<stdlib.h> #define X_SIZE 640  //画像の横幅(ピクセル数) #define Y_SIZE 480  //画像の縦幅(ピクセル数) #define Z_SIZE 1    //1つの画素に含まれる色の数 void *malloc(size_t size); void main(void) {  int i, j, k;   //ループ用変数 i…縦の画素用, j…横の画素用, k…色数用  int x=0;    //画像の横幅(ピクセル数)*/  int y=0;     //画像の縦幅(ピクセル数)  FILE *fp; /***********元画像データのメモリ確保*********/  BYTE ***mae;  mae=(BYTE ***)malloc(sizeof(BYTE **)*Y_SIZE);  for(i = 0; i < Y_SIZE; i++){   mae[i]=(BYTE **)malloc(sizeof(BYTE *)*X_SIZE);  }  for(i = 0; i < Y_SIZE; i++){   for(j = 0; j < X_SIZE; j++){    mae[i][j]=(BYTE *)malloc(sizeof(BYTE)*Z_SIZE);   }  } /*******画像の読み込み・輝度値の表示*******/  fp=fopen("sample1.bmp","rb");   //画像”sample1”を開く  BITMAPFILEHEADER bmfh;  BITMAPINFOHEADER bmih;  fread(&bmfh,sizeof(bmfh),1,fp);  fread(&bmih,sizeof(bmih),1,fp);  x=bmih.biWidth;  //インフォヘッダに含まれる画像の幅情報をxに代入  y=bmih.biHeight;  //インフォヘッダに含まれる画像の高さ情報をyに代入  for(i = 0; i < y ;i++){   for(j = 0; j < x; j++){    fread(&mae[i][j][0],sizeof(BYTE),1,fp);    if(i<640 && j<480)printf("%d, %d, %d\n",i, j, mae[i][j][0]);   //輝度値を表示   }  }  fclose(fp); /**************画像の表示*************/  //画像”sample1”を”sample2”という名前で出力する  fp = fopen("sample2.bmp" ,"wb");  //ヘッダの書き込み  fwrite(&bmfh,sizeof(bmfh),1,fp);  fwrite(&bmih,sizeof(bmih),1,fp);  for(i = 0; i < bmih.biHeight; i++){   for(j = 0; j < bmih.biWidth; j++){    fwrite(&mae[i][j][0],sizeof(BYTE),1,fp);   }  }  fclose(fp);  //ファイルをクローズ }

  • 画像の合成プログラム

    現在、飛行機の羽の左側と、右側の羽で撮った2枚の航空写真を合成するプログラムを作っています。これらの画像には若干のずれがあり、合成するには、左の写真に写っている場所と対応する同じ点を右側の写真から探索する必要があります。今の段階で作っているプログラムでは全ての点を走査することができず、画像の一部だけしか走査されません。 以下のプログラムをどのように変更したら、画像全体を走査できるかアドバイスください。お願いします。 /*対応点の探索*/ for (x = 0; x < 512; x+=25) { for (y= 0; y < 512; y+=25) { for (i = 0; i < 30; i++) { for (j = 0; j < 30; j++) { block1[i][j] = image1[x - 30 / 2 + i][y - 30 / 2 + j]; } } min = 99999; x1 = x*2; if(x1 > 512){ x1 = 512; } y1 = y*2; if(y1 > 512){ y1 = 512; } for (i = 30 / 2; i < x1 - 30 / 2; i++) { for (j = 30 / 2; j < y1- 30 / 2; j++) { sa = 0; for(k = 0; k < 30; k++) { for(l = 0; l < 30; l++) { sa += abs(block1[k][l] - image2[i - 30 / 2 + k][j - 30 / 2 + l]); } } if (min > sa) { min = sa; min_i = i; min_j = j; } } } if(x-15 < min_i && min_i < x+15){ if(y-15 < min_j && min_j < y+15){ printf("File_1の座標点( %d, %d )の対応点は ( %d, %d ) である。\n",y,x, min_j, min_i); } } } } return 0; }

  • PlgBltで画像の回転

    WINAPI:PlgBltにてビットマップ画像を回転させるソフトを作成中ですが、 画像サイズが大きくなると(5000x5000Pixel)、関数の戻り値自体は成功しているのですが、結果ビットマップ画像を見てみると真っ黒になってしまい、うまくいきません。 原因と対策方法を教えて下さい。 ちなみに、画像サイズが小さいと(100x100Pixel)うまくいきます。 尚、 OS:XP SP2 開発環境:Visial Stadio6.0 です。

専門家に質問してみよう