教えて!goo限定 1000名様に電子コミック1000円分が当たる!!

グレースケール画像を量子化する問題で、量子化レベル数を8階調(N=8)と設定して画像h=(Ih,Ih,Ih)を生成し、その輝度ヒストグラムを生成せよという問題なのですが。
printf("量子レベル数Nを入力してください");
scanf("%d",&n);
dn=256/n;

for(j=0;j<nHeight;j++)
for(k=0;k<nWidth;k++){
rVal=DllBmpGetPixelValueR(pBmpOrig, j, k);
for(i=0;i<n;i++){
if(dn*i<=rVal&&dn*(i+1)>rVal){
f1=dn*i;
}
DllBmpSetPixelValueR(pBmpCopy1, j, k, f1);
DllBmpSetPixelValueG(pBmpCopy1, j, k, f1);
DllBmpSetPixelValueB(pBmpCopy1, j, k, f1);


※nHeight:高さ
nWidth:幅
rVal=DllBmpGetPixelValueR(pBmpOrig, j, k):赤色成分の輝度値を得る

量子化の公式ΔN=256/N
I(x,y)=n*ΔN ifn*ΔN≦I(x,y)<(n+1)*ΔN for∀n={0,N-1}
をif文以下で表現しました。
ここまでやってみましたがあとがよくわかりません。
教えてください。
どうかよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

「ある個数の0~N-1の整数の中から、それぞれがいくつあるか数えて、その度数を表示する」


というのは作れますか?

>f1=dn*i;

とありますが、このiの注目すれば0~N-1ですよね?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q画素値取得について

質問ですがCやC++で画素値を取得するにはどうしたらいいでしょうか

Aベストアンサー

それ以外ってどのOSでしょうか。
C/C++は標準で画像を扱うライブラリなんてありませんよ?
OSに依存します。

bmpやjpegのファイルならフォーマットが決まっているので
ファイルをバイナリでオープンしてデータを取得します。

参考URL:http://www.kk.iij4u.or.jp/~kondo/bmp/

Q【画像処理】4連結の連結数について

【画像処理】4連結の連結数について
現在、画像処理を勉強しているのですが、
4連結の時の連結数で質問があります。

★・・・自ピクセル

□■■
□★■
□■□

8連結の場合、連結数は「2」であると分かるのですが、
4連結の場合はどうなのでしょうか?
単純に上下左右のピクセルだけ見て「3」なのでしょうか?

Aベストアンサー

>8連結の場合、連結数は「2」であると分かる
いいえ、1です。
4連結では2です。

連結数の分かりやすい定義は
「境界線追跡をしたとき,その画素を通過する回数」
です。
http://mikilab.doshisha.ac.jp/dia/research/person/shuto/research/0605/renketsu.html
ここにありました。

Q画像の拡大・縮小

読み込んだ画像を1.5倍に拡大、2/3倍に縮小したいのですが、C言語でそのようなことは可能なのですか?また、できるとしたら、どのように行えばいいのでしょうか?教えてくださいm(_ _)m

Aベストアンサー

座標系だけでしたら処理は単純です。
単に倍率をかけてあげればよいだけです。

具体的な計算式は、
(1.5倍の例)
 Image( x*1.5, y*1.5 ) = Image( x, y )
ということです。

これだけでは多分わからないですね^_^;
以下にプログラムを書きます。

----------------------------------------------------------------

void main()
{
 unsinged char Image[ 16 ][ 16 ]; // 読み込んだ画像の格納場所
 unsinged char Image2[ 24 ][ 24 ]; // 拡大した画像の格納場所
 double zoom = 1.5;
 int x, y;
 int i, j;

/*
  画像の読み込み処理
*/

 for(x=0; x<16; x++)
 {
  for(y=0; y<16; y++)
  {
   // 拡大した時に隙間が空くので、その箇所を補完する
   for(i=0; (double)i<zoom; i++)
   {
    for(j=0; (double)j<zoom; j++)
    {
     Image2[ (int)(x*zoom)+i ][ (int)(y*zoom)+j ] = Image[ x ][ y ];
    }
   }
  }
 }
}

----------------------------------------------------------------

これでImage2に1.5倍した画像が格納されるはずです。
(注:Image2の配列のサイズは任意に決めています)

理解できたでしょうか。

画像の拡大縮小に関しては、まだ多くの手法が存在しますので、
調べてみると面白いかもしれませんよ(^_^)

座標系だけでしたら処理は単純です。
単に倍率をかけてあげればよいだけです。

具体的な計算式は、
(1.5倍の例)
 Image( x*1.5, y*1.5 ) = Image( x, y )
ということです。

これだけでは多分わからないですね^_^;
以下にプログラムを書きます。

----------------------------------------------------------------

void main()
{
 unsinged char Image[ 16 ][ 16 ]; // 読み込んだ画像の格納場所
 unsinged char Image2[ 24 ][ 24 ]; // 拡大した画像の格納場所
 double zoom = 1.5...続きを読む

QC言語でクロマキー合成をする方法

input.bmpとbackground.bmpとoutput.bmpを作りで好きな絵を用意して、input.bmpというビットマップファイル(色数は24ビット)とbackground.bmpというファイルを開き,クロマキー合成をし,ビットマップファイルoutput.bmpに出力させる。
上記の物をC言語でするにはどうすればいいのでしょうか?
下記のものは自分でやったのですがやり方が分かりません。どなたか知恵を貸してください。
(ほとんど間違っていると思いますが・・・)

#include<stdio.h>
int main()
{
FILE *fp;
int i;
char data[2];
short s;
fp1=fopen("input.bmp","rb");
fp2=fopen("background.bmp","rb");
fp3=fopen("output.bmp","wb")

int k;
for(k=0;k<10000;k++){
fputc(0,fp);
fputc(0,fp);
fputc(0,fp);
}
fclose(fp);

fread(&data[0],1,2,fp1);
fread(&data[0],1,2,fp2);
fwrite(&data[0],1,2,fp3);

int fs;
fread(&fs,f1);
fread(&fs,f2);
fwrite(&fs,f3);

fp=fopen("aka.bmp","wb");
fread(moji,1,2,fp);
i=30054;
fread(&i,4,1,fp);
i=0;
fread(&i,4,1,fp);
i=54;
fread(&i,4,1,fp);
i=40;
fread(&i,4,1,fp);
i=100;
fread(&i,4,1,fp);
i=100;
fread(&i,4,1,fp);
s=1;
fread(&s,2,1,fp);
s=24;
fread(&s,2,1,fp);
i=0;
fread(&i,4,1,fp);
i=30000;
fread(&i,4,1,fp);
i=120;
fread(&i,4,1,fp);
i=120;
fread(&i,4,1,fp);
i=0;
fread(&i,4,1,fp);
i=0;
fread(&i,4,1,fp);


for(k=0;k<10000;k++){
fputc(0,fp);
fputc(0,fp);
fputc(70,fp);
}
fclose(fp);

fp=fopen("midori.bmp","wb");
fread(moji,1,2,fp);
i=30054;
fread(&i,4,1,fp);
i=0;
fread(&i,4,1,fp);
i=54;
fread(&i,4,1,fp);
i=40;
fread(&i,4,1,fp);
i=100;
fread(&i,4,1,fp);
i=100;
fread(&i,4,1,fp);
s=1;
fread(&s,2,1,fp);
s=24;
fread(&s,2,1,fp);
i=0;
fread(&i,4,1,fp);
i=30000;
fread(&i,4,1,fp);
i=120;
fread(&i,4,1,fp);
i=120;
fread(&i,4,1,fp);
i=0;
fread(&i,4,1,fp);
i=0;
fread(&i,4,1,fp);



for(k=0;k<10000;k++){
fputc(0,fp);
fputc(150,fp);
fputc(0,fp);
}
fclose(fp);
fp=fopen("ao.bmp","wb");
fread(moji,1,2,fp);
i=30054;
fread(&i,4,1,fp);
i=0;
fread(&i,4,1,fp);
i=54;
fread(&i,4,1,fp);
i=40;
fread(&i,4,1,fp);
i=100;
fread(&i,4,1,fp);
i=100;
fread(&i,4,1,fp);
s=1;
fread(&s,2,1,fp);
s=24;
fread(&s,2,1,fp);
i=0;
fread(&i,4,1,fp);
i=30000;
fread(&i,4,1,fp);
i=120;
fread(&i,4,1,fp);
i=120;
fread(&i,4,1,fp);
i=0;
fread(&i,4,1,fp);
i=0;
fread(&i,4,1,fp);


for(k=0;k<10000;k++){
fputc(255,fp);
fputc(0,fp);
fputc(0,fp);
}
fclose(fp);
return(0);
}

input.bmpとbackground.bmpとoutput.bmpを作りで好きな絵を用意して、input.bmpというビットマップファイル(色数は24ビット)とbackground.bmpというファイルを開き,クロマキー合成をし,ビットマップファイルoutput.bmpに出力させる。
上記の物をC言語でするにはどうすればいいのでしょうか?
下記のものは自分でやったのですがやり方が分かりません。どなたか知恵を貸してください。
(ほとんど間違っていると思いますが・・・)

#include<stdio.h>
int main()
{
FILE *fp;
int i;
ch...続きを読む

Aベストアンサー

No2です。
応答がないので、追加回答です。

>下記のものは自分でやったのですがやり方が分かりません。どなたか知恵を貸してください。

1画素あたりの色データを定義して、
1画素のデータを読み込む関数 bool getRGB(color24 *c, FILE *fp)、
書き出す関数 void putRGB(color24 c, FILE *fp)、
クロマキー処理として背景画像を使うかどうかを判断する関数 bool transparency(color24 c),
を作ればいいのでは?
具体的には、以下にプログラムの骨子を書きましたので参考にしてください。

このプログラムの肝は、最後の関数transparency()です。
単純には24ビットのすべての色について、背景画像を使うのか使わないのかを書いたテーブルを用意して判断するのが完璧ですが、24ビットの表、つまり16,000,000色分の表を用意する必要があり現実的ではありません。ここは質問者さんの腕の見せ所ですが、単純に、RGBの各成分の値の大小で判断すると、思ったような結果が得られませんよ(経験者談)。
もし回答者が作るとしたら、24ビットの色を256色程度に分類して、
 背景画像を使う色--値:0
 背景画像は使わない色--値:1
 どちらともいえない色--値:より詳細なレベルの表の番号
といったテーブルをつくり、多段階で判断すると思います。


/* 24bit カラーの型を定義 */
struct color24 {
BYTE r,g,b;
} forground, background;

void main()
{
FILE *fpfg,*fpbg,*fpout;
/* ファイルをオープンして */
fpfg = fopen("input.bmp","rb");
fpbg = fopen("background.bmp","rb");
fpout= fopen("output.bmp","wb")

/* 画素が正常に読み込める間、つまりすべての画素についてクロマキー処理をして */
while( getRGB(&forground,fpfg) && getRGB(&background,fpbg) ) {
  if(transparency(forground)) putRGB(background,fpout);
  else putRGB(forground, fpout);
}

/* ファイルをクローズしてプログラムを終了する */
fclose(fpfg);
fclose(fpbg);
fclose(fpout);
}

No2です。
応答がないので、追加回答です。

>下記のものは自分でやったのですがやり方が分かりません。どなたか知恵を貸してください。

1画素あたりの色データを定義して、
1画素のデータを読み込む関数 bool getRGB(color24 *c, FILE *fp)、
書き出す関数 void putRGB(color24 c, FILE *fp)、
クロマキー処理として背景画像を使うかどうかを判断する関数 bool transparency(color24 c),
を作ればいいのでは?
具体的には、以下にプログラムの骨子を書きましたので参考にしてください。

このプロ...続きを読む

Qグレースケール画像の画素値を得る

OpenCVを使わずにC言語で、グレースケール画像を読み込んで、各画素をそれに対応する配列に格納するプログラムを作りたいと思っています。
しかし、C言語で画像を読み込む方法や、各画素の画素値を得る方法がわかりません。どなたかご存知の方がいらしたら、教えてください。宜しくお願いします。

Aベストアンサー

グレースケール画像と言っても、フォーマット(内部のデータ形式)が
なんなのかわからないと、読み込みアルゴリズムが考えられません。


jpegの様な、圧縮が入っているフォーマットだと、非常に面倒です。
http://www14.ocn.ne.jp/~setsuki/ext/jpg.htm

逆に、pgmのように画素値をそのままバイナリかアスキーで
書き込んでいるだけなら、freadして配列に格納していくだけです。
画素値が知りたい場合は、配列の場所を指定してfprintでもすればよいでしょう。
http://www.not-enough.org/abe/manual/command/netpbm/pgm.html


方針としては、以下の二つが考えられます。

1.プログラムが対応する画像フォーマット種類を決め、
  そのフォーマットを調べ、対応アルゴリズムを構築する

2.pgmフォーマット読み込みプログラムを作成する。
  別途、画像変換ソフトを用意し、どんな画像でもpgmに変換してから
  プログラムで使用する。

画像変換ソフト例:IrfanView
http://www.forest.impress.co.jp/lib/pic/piccam/picviewer/irfanviewjp.html
画像を読み込んで、名前を付けて保存->pgmで保存


以上、参考になれば幸いです。

グレースケール画像と言っても、フォーマット(内部のデータ形式)が
なんなのかわからないと、読み込みアルゴリズムが考えられません。


jpegの様な、圧縮が入っているフォーマットだと、非常に面倒です。
http://www14.ocn.ne.jp/~setsuki/ext/jpg.htm

逆に、pgmのように画素値をそのままバイナリかアスキーで
書き込んでいるだけなら、freadして配列に格納していくだけです。
画素値が知りたい場合は、配列の場所を指定してfprintでもすればよいでしょう。
http://www.not-enough.org/abe/manual/com...続きを読む

Q整数かどうかチェックする

テキストボックスに数字を入力させてボタンを押した時、
その数字が1桁の整数(0から9)でなければエラーメッセージを出すようにしたいのですが、何か簡単なコードはありますか?
(5.6などの小数や、"a"や"あ"など数字ではない文字が入力された場合も同様にエラーを出したい)

1つずつ0から9までifでチェックしなければいけないのでしょうか。

Aベストアンサー

 こんにちは。

>>Visual C++を用いたフォームアプリケーションを作っています。
 C++CLIでしょうか。
 でしたら、KeyPressを処理するのが手っ取り早いです。テキストボックスのイベントプロパティにKeyPressを追加して、以下の様にします。
 尚、TextChanged内での処理はお勧め出来ません。

System::Void Form1::KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
{
using namespace System::Windows::Forms;

//数値なので引き返す
if(wchar_t::IsDigit(e->KeyChar))
return;

//不正入力を表示する
MessageBox::Show(e->KeyChar + " は受け付けません", "不正入植です", MessageBoxButtons::OK);

//ココにtrueを代入するとテキストボックスへの入力を拒絶できる
e->Handled = true;
}

 こんにちは。

>>Visual C++を用いたフォームアプリケーションを作っています。
 C++CLIでしょうか。
 でしたら、KeyPressを処理するのが手っ取り早いです。テキストボックスのイベントプロパティにKeyPressを追加して、以下の様にします。
 尚、TextChanged内での処理はお勧め出来ません。

System::Void Form1::KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
{
using namespace System::Windows::Forms;

//数値なので引き返す
if(wchar_t::IsDigit(e->Ke...続きを読む

Qはしご型抵抗回路の問題についての質問です。

はしご型抵抗回路の問題についての質問です。

以下の問題について、自分なりに調べて解いてみましたが、よくわかりませんでした。
どなたかできるだけ詳しくご教授お願いします。

問題
図1.1のようなn段のはしご型回路がある。これをABから見た場合の合成抵抗をRnとしたとき、以下の問いに答えよ。
(図1.1は、コの字型で、上と右側に抵抗Rがあるもので、それが右にn個繋がっているものです。右端もコの字で、上と右側に抵抗Rがあります。また、最初のコの字の上の端がA,下の端がBです。)

(1)n=3のときのAB間の合成回路、すなわちR3を求めよ。
(2)無限にはしごが続いた場合の合成抵抗R∞を求めよ。
(3)図1.1においてR=2[Ω]とした場合のR∞と等価な抵抗をR’とする。
このとき図1.2のような回路のDE間の合成抵抗RDEの値を求めよ。

問題は以上です。

(1)は、右側から合成していくと、13R/8となりましたが、自信が無いです。

(2)は、次のサイトを参考にしましたが、若干回路が違うみたいなので、そのまま信じていいのかよくわかりませんでした。
http://www.suzuka-ct.ac.jp/info/lab/akira/zyugyou/denkidensi/H14/inf_ladder.pdf

(3)もよくわかりませんでした。

よろしくお願いします。

はしご型抵抗回路の問題についての質問です。

以下の問題について、自分なりに調べて解いてみましたが、よくわかりませんでした。
どなたかできるだけ詳しくご教授お願いします。

問題
図1.1のようなn段のはしご型回路がある。これをABから見た場合の合成抵抗をRnとしたとき、以下の問いに答えよ。
(図1.1は、コの字型で、上と右側に抵抗Rがあるもので、それが右にn個繋がっているものです。右端もコの字で、上と右側に抵抗Rがあります。また、最初のコの字の上の端がA,下の端がBです。)

(...続きを読む

Aベストアンサー

(3) だけ: 回路の対称性から, 中央の R' を 2本の R'/2 の直列に直すと簡単になる.


人気Q&Aランキング