画像の輝度値を操作するプログラムについて

このQ&Aのポイント
  • 画像の輝度値を操作するプログラムをやっているのですが、画像の左半分を黒くした画像を生成する場合は、R、G、Bの値をすべて0にすれば良いのでしょうか?
  • 画像の輝度値を操作するプログラムを使用して、画像の左半分を黒くした画像を生成する方法について教えてください。
  • 画像の輝度値を操作するプログラムにおいて、画像の左半分を黒くするためには、どのような条件式を使用すれば良いのでしょうか?また、上半分ではなく、左半分が黒くなるようにする方法を教えてください。
回答を見る
  • ベストアンサー

画像の輝度値のプログラムについて・・・・・・

プログラムをPCでやる前にある程度、何かに書いてからやっているのですが、画像の1部分の色を変えたいのですが、例えば画像の左半分を黒くした画像を生成したい場合は,(一般的には,輝度値は0~255までの整数(8ビット)か,または0~65535までの整数(16ビット)により表される) *printfとscanfを使用するためにインクルードする*/ #include<stdio.h> /*ビットマップ画像を扱うためのヘッダ*/ #include<Dll_BMP_C.h> //画像ファイル名最大長(バイト) #define NAME_SIZE 101 int main(void) { int j,k; /* nWidth:画像の幅、nHeight:画像の高さ、nVal:輝度値*/ int nWidth,nHeight; /*pcFileName:画像ファイル名を保存する配列*/ char pcFileName[NAME_SIZE]; /*pBmpOrig:読み込んだ画像へのポインタ pBmpCopy:複製した画像へのポインタ*/ DllBmp*pBmpOrig,*pBmpCopy; /*読み込む画像のファイル名を指定する*/ printf(“読み込む画像”); scanf(“%s”,pcFileName); /*画像を読み込みメモリに保存する 読み込みに失敗したら実行を中止する*/ pBmpOrig=DllBmpReadImage(pcFileName); if(pBmpOrig==NULL) { printf(“画像の読み込みに失敗! 実行を中止します\n”); exit(1); } /*読み込んだ画像のヘッダ情報を表示する*/ DllBmpShowHeader(pBmpOrig); /*読み込んだ画像の大きさを得る*/ nWidth=DllBmpGetWidth(pBmpOrig); nHeight= DllBmpGetHeight (pBmpOrig); /* 画像を生成する */  for(j = 0; j < nHeight; j++)   for(k = 0; k < nWidth; k++)    {     DllBmpSetPixelValueR(pBmpOrig, j, k, 255);     DllBmpSetPixelValueG(pBmpOrig, j, k, 255);     DllBmpSetPixelValueB(pBmpOrig, j, k, 255);    } /*保存する画像のファイル名を指定する*/ printf(“保存する画像”); scanf(“%s”,pcFileName); /*画像を保存する 保存に失敗したら実行を中止する*/ if(!DllBmpWriteImage(pcFileName,pBmpOrig)); { printf(“画像の保存に失敗! 実行に中止します”); exit(1); } /*画像をメモリから消去する*/ DllBmpDleteImage(pBmpOrig); return 0; } 画像の輝度値を操作するプログラムをやっているのですが、画像の左半分を黒くした画像を生成する場合は、 DllBmpSetPixelValueR(pBmpOrig, j, k, 255); DllBmpSetPixelValueG(pBmpOrig, j, k, 255); DllBmpSetPixelValueB(pBmpOrig, j, k, 255); の部分のRが赤、Gが緑、Bが青なんですが、その値をすべて0にすればいいんでしょうか?もしくはあらたに条件式を作るべきなのでしょうか??そして画像の左半分を黒くしたい場合は、 for(j = 0; j < nHeight; j++)   for(k = 0; k < nWidth; k++) の部分のj < nHeightをj < nHeight/2にしたらなるでしょうか?? この場合だと上半分になってしまうでしょうか?? PCがまだ使えないのでルーズリーフにいろいろ試行錯誤して書いてるのですが、他に何かヒントがあればよろしくお願いします。。。。。 すみませんがお願いします。

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

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

>>j < nHeightをj < nHeight/2にしたらなるでしょうか??  この場合だと上半分になってしまうでしょうか??  はい。左半分の場合はnWidth/2のハズです 一応参考と言う事で(過信してはいけません)。 /*幅の半分を計算しておく*/ const int nHalf = nWidth / 2; /*輝度用の変数*/ int nKido = 0; for(j = 0; j < nHeight; j++)   for(k = 0; k < nWidth; k++)    { /*kはnWidthの半分以下なら輝度は0、それ以上なら輝度は255*/ nKido = (nHalf <= k) ? 0 : 255; /*着色?*/     DllBmpSetPixelValueR(pBmpOrig, j, k, nKido);     DllBmpSetPixelValueG(pBmpOrig, j, k, nKido);     DllBmpSetPixelValueB(pBmpOrig, j, k, nKido);    }

fantazical
質問者

お礼

本当にありがとうございました。

関連するQ&A

  • プログラムをやっているのですが・・・・・

    C言語についての質問です。 画像の左半分を黒くした画像を生成したいのですが・・・・・・・ /*printfとscanfを使用するためにインクルードする*/ #include<stdio.h> /*ビットマップ画像を扱うためのヘッダ*/ #include<Dll_BMP_C.h> //画像ファイル名最大長(バイト) #define NAME_SIZE 101 int main(void) { int j,k; /* nWidth:画像の幅、nHeight:画像の高さ、nVal:輝度値*/ int nWidth,nHeight; /*pcFileName:画像ファイル名を保存する配列*/ char pcFileName[NAME_SIZE]; /*pBmpOrig:読み込んだ画像へのポインタ pBmpCopy:複製した画像へのポインタ*/ DllBmp*pBmpOrig,*pBmpCopy; /*読み込む画像のファイル名を指定する*/ printf(“読み込む画像”); scanf(“%s”,pcFileName); /*画像を読み込みメモリに保存する 読み込みに失敗したら実行を中止する*/ pBmpOrig=DllBmpReadImage(pcFileName); if(pBmpOrig==NULL) { printf(“画像の読み込みに失敗! 実行を中止します\n”); exit(1); } /*読み込んだ画像のヘッダ情報を表示する*/ DllBmpShowHeader(pBmpOrig); /*読み込んだ画像の大きさを得る*/ nWidth=DllBmpGetWidth(pBmpOrig); nHeight= DllBmpGetHeight (pBmpOrig); /* 画像を生成する */ for(j = 0; j < nHeight; j++) for(k = 0; k < nWidth; k++) { DllBmpSetPixelValueR(pBmpOrig, j, k, 255); DllBmpSetPixelValueG(pBmpOrig, j, k, 255); DllBmpSetPixelValueB(pBmpOrig, j, k, 255); } /*保存する画像のファイル名を指定する*/ printf(“保存する画像”); scanf(“%s”,pcFileName); /*画像を保存する 保存に失敗したら実行を中止する*/ if(!DllBmpWriteImage(pcFileName,pBmpOrig)); { printf(“画像の保存に失敗! 実行に中止します”); exit(1); } /*画像をメモリから消去する*/ DllBmpDleteImage(pBmpOrig); return 0; } 画像の輝度値を操作するプログラムをやっているのですが、画像の左半分を黒くした画像を生成する場合は、 DllBmpSetPixelValueR(pBmpOrig, j, k, 255); DllBmpSetPixelValueG(pBmpOrig, j, k, 255); DllBmpSetPixelValueB(pBmpOrig, j, k, 255); の部分のRが赤、Gが緑、Bが青なんですが、その値をすべて0にすればいいんでしょうか?もしくはあらたに定義したり、条件式を作るべきなのでしょうか?? 左半分を変色したい場合はnWidth/2と変えれば大丈夫だと思います。 すみませんがお願いします。 わかる方は、教えてください。よろしくお願いします。

  • 条件式について・・・・・・・・・・・・

    画像の左下隅と右上隅を結んだ線分を考え、この線分よりも下の三角形の領域をネズミ色(RGB成分の輝度値が128)にした画像を生成するプログラムをやっているのですが、左下隅と右上隅を結んだ線分を考え、この線分よりも下の三角形の領域の色を変えたい場合は、 まず、for(k = 0; k < nWidth; k++) を変えるべきだと思うのですが・・・・・・・四角の画像の右下から上に徐々に色を変えてくかんじだと思うのですが、三角形の公式みたいなのって関係ありますか? /* nWidth:画像の幅、nHeight:画像の高さ、nVal:輝度値*/ int nWidth,nHeight; /* 画像を生成する */ for(j = 0; j < nHeight; j++) for(k = 0; k < nWidth; k++) { DllBmpSetPixelValueR(pBmpOrig, j, k, 255); DllBmpSetPixelValueG(pBmpOrig, j, k, 255); DllBmpSetPixelValueB(pBmpOrig, j, k, 255); } わかる方は、教えてください。よろしくお願いします。

  • プログラミングでの画像の生成について・・・・・・・・

    任意の画像をfと呼び,座標(x,y)における画像fの輝度値を(R(x,y),G(x,y),B(x,y))と呼ぶことにします。 以下の処理を行うプログラムを作成してください。 1,画像fの明るさがm分の1になった画像h1(x,y)=(R(x,y)/m,G(x,y)/m,B(x,y)/m)を生成する。 ここで,mは0<m<10の範囲にある任意の整数である. 2,画像fから法256の画像h2(x,y)=((n×R(x,y))mod(256),(n×G(x,y))mod(256),(n×B(x,y))mod(256))を生成する。 ここで,nは任意の正の整数である. *printfとscanfを使用するためにインクルードする*/ #include<stdio.h> /*ビットマップ画像を扱うためのヘッダ*/ #include<Dll_BMP_C.h> //画像ファイル名最大長(バイト) #define NAME_SIZE 101 int main(void) { int j,k; /* nWidth:画像の幅、nHeight:画像の高さ、nVal:輝度値*/ int nWidth,nHeight; /*pcFileName:画像ファイル名を保存する配列*/ char pcFileName[NAME_SIZE]; /*pBmpOrig:読み込んだ画像へのポインタ pBmpCopy:複製した画像へのポインタ*/ DllBmp*pBmpOrig,*pBmpCopy; /*読み込む画像のファイル名を指定する*/ printf(“読み込む画像”); scanf(“%s”,pcFileName); /*画像を読み込みメモリに保存する 読み込みに失敗したら実行を中止する*/ pBmpOrig=DllBmpReadImage(pcFileName); if(pBmpOrig==NULL) { printf(“画像の読み込みに失敗! 実行を中止します\n”); exit(1); } /*読み込んだ画像のヘッダ情報を表示する*/ DllBmpShowHeader(pBmpOrig); /*読み込んだ画像の大きさを得る*/ nWidth=DllBmpGetWidth(pBmpOrig); nHeight= DllBmpGetHeight (pBmpOrig); /* 画像を生成する */ for(j = 0; j < nHeight; j++) for(k = 0; k < nWidth; k++) { DllBmpSetPixelValueR(pBmpOrig, j, k, 255); DllBmpSetPixelValueG(pBmpOrig, j, k, 255); DllBmpSetPixelValueB(pBmpOrig, j, k, 255); } /*保存する画像のファイル名を指定する*/ printf(“保存する画像”); scanf(“%s”,pcFileName); /*画像を保存する 保存に失敗したら実行を中止する*/ if(!DllBmpWriteImage(pcFileName,pBmpOrig)); { printf(“画像の保存に失敗! 実行に中止します”); exit(1); } /*画像をメモリから消去する*/ DllBmpDleteImage(pBmpOrig); return 0; } 剰余は%演算子を使って求めることができると思うのですが・・・。。 処理内容を選択できて、mとnの値を指定できるように作りたいのですが・・・・・ 何かアドバイス的なものをすみませんがよろしくお願いします。

  • プログラムを紙に書いていろいろやっているのですがで分からないところがあります・・・・・・・・・・・・・・

    /*printfとscanfを使用するためにインクルードする*/ #include<stdio.h> /*ビットマップ画像を扱うためのヘッダ*/ #include<Dll_BMP_C.h> //画像ファイル名最大長(バイト) #define NAME_SIZE 101 int main(void) { int j,k; /* nWidth:画像の幅、nHeight:画像の高さ、nVal:輝度値*/ int nWidth,nHeight; /*pcFileName:画像ファイル名を保存する配列*/ char pcFileName[NAME_SIZE]; /*pBmpOrig:読み込んだ画像へのポインタ pBmpCopy:複製した画像へのポインタ*/ DllBmp*pBmpOrig,*pBmpCopy; /*読み込む画像のファイル名を指定する*/ printf(“読み込む画像”); scanf(“%s”,pcFileName); /*画像を読み込みメモリに保存する 読み込みに失敗したら実行を中止する*/ pBmpOrig=DllBmpReadImage(pcFileName); if(pBmpOrig==NULL) { printf(“画像の読み込みに失敗! 実行を中止します\n”); exit(1); } /*読み込んだ画像のヘッダ情報を表示する*/ DllBmpShowHeader(pBmpOrig); /*読み込んだ画像の大きさを得る*/ nWidth=DllBmpGetWidth(pBmpOrig); nHeight= DllBmpGetHeight (pBmpOrig); /* x座標とy座標の値を足すと奇数になるすべてのピクセルを白(RGB成分の輝度値が255)にする画像を生成する */  for(j = 0; j < nHeight; j++)   for(k = 0; k < nWidth; k++)   if(j+k%2==1)     {     DllBmpSetPixelValueR(pBmpOrig, j, k, 255);     DllBmpSetPixelValueG(pBmpOrig, j, k, 255);     DllBmpSetPixelValueB(pBmpOrig, j, k, 255);    } /*保存する画像のファイル名を指定する*/ printf(“保存する画像”); scanf(“%s”,pcFileName); /*画像を保存する 保存に失敗したら実行を中止する*/ if(!DllBmpWriteImage(pcFileName,pBmpOrig)); { printf(“画像の保存に失敗! 実行に中止します”); exit(1); } /*画像をメモリから消去する*/ DllBmpDleteImage(pBmpOrig); return 0; } 画像の輝度値を操作するプログラムをやっているのですが、x座標とy座標の値を足すと奇数になるすべてのピクセルを白(RGB成分の輝度値が255)にする画像を生成したいのですが、こんな感じで作ってみたんですが、条件式はif(j+k%2==1) で作ってみたんですが、これだとj+kよりk%2の方がやっぱり先に行いますでしょうか??他に何かいい奇数の判断ってあるでしょうか??ルーズリーフにいろいろ試行錯誤して書いてるのですが、他に何かヒントがあればよろしくお願いします。。。。。 すみませんがお願いします。

  • グレースケール画像を量子化する問題で、量子化レベル数を8階調(N=8)

    グレースケール画像を量子化する問題で、量子化レベル数を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文以下で表現しました。 ここまでやってみましたがあとがよくわかりません。 教えてください。 どうかよろしくお願いします。

  • 奇数の判断について・・・・・・・・

    y座標が16で割ると余り1になるようなすべてのピクセルを白(RGB成分の輝度値が255)にした画像を生成したい場合・・・・・・・・・ /* nWidth:画像の幅、nHeight:画像の高さ*/ /* x座標とy座標の値を足すと奇数になるすべてのピクセルを白(RGB成分の輝度値が255)にする画像を生成する */  for(j = 0; j < nHeight; j++)   for(k = 0; k < nWidth; k++)   if(k%16==1)     {     DllBmpSetPixelValueR(pBmpOrig, j, k, 255);     DllBmpSetPixelValueG(pBmpOrig, j, k, 255);     DllBmpSetPixelValueB(pBmpOrig, j, k, 255);    } と条件式としましては、if(k%16==1)な感じでも大丈夫でしょうか? すみませんがアドバイスお願いします。。。。。。

  • ピラミッド表示プログラム。

    ピラミッドを表示させるプログラムを考えています。 例えば3段の場合   *  *** ***** っというような表示です。 #include <stdio.h> void spira(int n); main() { int a; printf("段数は:"); scanf("%d",&a); spira(a); } void spira(int n) { int i,j=1,a,b,k; for(a=n;a>0;a--){ for(b=a-1;b<=n;b--){ printf(" "); } k=(j-1)*2+1; for(i=1;i<=k;i++){ printf("*"); } j++; printf("\n"); } } このように考えてみたのですが、無限ループになって表示できません。 どこが悪いでしょうか? 無限ループの原因はどうやったら解消されるでしょうか?

  • カレンダーのプログラム

    指定した開始月と終了月を入力して、それを横に最大3つまで並べて 納まりきらないときは改行するというプログラムを作りたいです。 イメージとしては、2009年の9月から2009年の12月まで指定した場合は… 2009 / 9              2009 / 10             2009 / 11 1 2 3 4 5 6 7          1 2 3 4 5 6 7           1 2 3 4 5 6 7 8 9 10 11 12 13 14      8 9 10 11 12 13 14       8 9 10 11 12 13 14 15 16 17 18 19 20 21    15 16 17 18 19 20 21    15 16 17 18 19 20 21 21 22 23 24 25 26 27    21 22 23 24 25 26 27    21 22 23 24 25 26 27 28 29 30           28 29 30 31           28 29 30   2009 / 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 21 22 23 24 25 26 27 28 29 30 31 (最初の日数などは適当ですし、ちょっとずれてしまっていますがご了承ください。あくまでもイメージなので…) ところが下のプログラムを動作させようとしたところ全く 動きません。何がおかしいために動作しないのでしょうか? よろしくお願いします。 #include<stdio.h> #include<string.h> int getyoubi(int year,int month,int day) { if(month==1 || month==2 ) { year--; month +=12; } return ((year+year/4-year/100+year/400+(13*month+8)/5 + day)%7); } int main(void) { int nen1,tuki1,nen2,tuki2,tukiho,nenho,tukih,w,i,j; char sbuf[3][7][22]; int tuki[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int k; char tmp[4]; printf("カレンダーを表示します。\n"); printf("開始年月を入力せよ。\n"); printf("年:"); scanf("%d",&nen1); printf("月:"); scanf("%d",&tuki1); printf("終了年月を入力せよ。\n"); printf("年:"); scanf("%d",&nen2); printf("月:"); scanf("%d",&tuki2); do{ /*3つのカレンダー分の格納する*/ for(i=0;i<3;i++) { w=getyoubi(nen1,tuki1,1); sprintf(sbuf[i][0],"%10d /%3d ",nen1,tuki1); for(k=1;j<7;k++) { sbuf[i][k][0]='\0'; } sprintf(sbuf[i][1],"%*s",3*w,""); k=1; for(j=1;j<tuki[tuki1];j++) { sprintf(tmp,"%3d",j); strcat(sbuf[i][k],tmp); if(j%7==6) { k++; } } do{ if(j%7==6) { sprintf(sbuf[i][k],"%21s",""); } else { do{ strcat(sbuf[i][k]," "); j++; }while(j%7!=6); k++; } }while(k!=7); tuki1++; if(tuki1==13) { tuki1=1; nen1++; } if(nen1>nen2 || nen1==nen2 && tuki1>tuki2) { break; } } /*3つためたカレンダーを出力する。*/ for(i=0;i<3;i++) { printf("%s",sbuf[i][0]); } printf("\n"); for(i=0;i<3;i++) { printf(" 日 月 火 水 木 金 土 "); } printf("\n"); for(i=0;i<3;i++) { printf("----------------------"); } printf("\n"); for(i=1;i<7;i++) { for(j=0;j<3;j++) { printf("%s",sbuf[j][i]); } } /*指定した年の月になるまでループ*/ }while(nen1<nen2 || nen1==nen2 && tuki1<=tuki2); return 0; }

  • ネイピア数(e)のプログラム

    テイラー展開によってネイピア数の近似値を求める プログラミングが全くわかりません。 e = 2.71828 18284 59045 23536 02874 71352 … を計算したいのですが。 #include <stdio.h> #include <math.h> int kaijou(int p) { int cnt; int val=1; for(cnt=1 ; cnt<=p ; cnt++){ val=val*cnt; } return(val); } double napier(int p) { printf("eを計算します。E = (1+(1/k))^k\n"); printf("k=いくつまで計算しますか ?\n"); scanf("%d", &n); double E[n]; E[1] = 1; for (j = 1; j <= n; j++){ E[j] = E[j] + 1; } for (k = 1; k <= n; k++) { K = K + 1; A = 1 / K; // printf("A = %e, ",A); B = 1 + A; // printf("B = %e\n",B); for ( i = 1; i<=k; i++){ E[k] = E[k] * B; // printf("E[%3d]= %e\n",k,E[k]); } void main(void) { int n; int cnt; double answer; printf("計算する最大の項nを入力してください:"); scanf("%d",&n); for(cnt=1 ; cnt<=n ; cnt++){ answer=napier(cnt); printf("第%d項までの近似値:%f 真値:%f 差:%f\n",cnt,answer,exp(1),answer-exp(1)); } }

  • 配列プログラムのバグ

    入力した正の整数を読み込み、小さい順に並べ替える配列のプログラムを作りたいのですが、以下のプログラムで結果がくるってしまいます。 色々な数値を入力してみたところ、入力した数字のうち、どれかが0に なってしまうようなのですが、いまいち理解できません。 どこを修正すればいいのでしょうか? #include<stdio.h> int main(void){ int a[255],b,i=0,j,k; while(i<255){ printf("正整数:\n"); scanf("%d",&a[i]); if(a[i]==0) break; else if(a[i]<0){ printf("正の整数ではありません"); return 0; } i++; } for(k=0;k<=i;k++){ for(j=0;j<=i;j++){ if(a[j]>a[j+1]){ b=a[j]; a[j]=a[j+1]; a[j+1]=b; } } } printf("入力された整数は小さい順に"); for(j=0;j<=i;j++){ printf("%d,",a[j]); } printf("です。"); return 0; }

専門家に質問してみよう