• 締切済み

アルファ値を持つ画素同士の合成

アルファ(透明値)をもつピクセル同士を重ねる方法についての質問です。 たとえば 前景RGBA=(255,0,255,0) 背景RGBA=(255,255,255,255) のように背景が完全不透明であるなら FR = (FR * FA + BR * (255 - FA)) / 255 (FRは前景のR値、BRは背景のR値、FAは前景のアルファ値) のように単純な演算で合成後の画素値を算出できますが、 前景RGBA=(255,0,255,64) 背景RGBA=(255,255,255,128) のように両方ともアルファ値を持つ画素同士であれば、どういったアルゴリズムで合成すればよいでしょうか。 ちなみにイメージする結果は、Photoshopなどのペイントツールで、完全透明レイヤーに半透明のブラシを色違いで重ねたような感じです。

みんなの回答

  • nitscape
  • ベストアンサー率30% (275/909)
回答No.1

>両方ともアルファ値を持つ画素同士であれば、どういったアルゴリズムで合成すればよいでしょうか。 アルゴリズム(計算式)は合成処理の用途などに応じて自由に決めていいものだと思います(つまりコレを使うべき、というものはないと思います)。例えばPhotoshopでも合成処理は何種類か用意されていてそれを選択できるようになっています。 1番単純なものでしたら r=(r1*a + r2*(255-a)) / (2*255) ような感じでいいのではないでしょうか?

Tank2005
質問者

補足

お教えいただいた演算方法だと背景部分の透過情報が無視されるため、いびつな画像になるようです。 参考: http://blogimg.goo.ne.jp/user_image/72/74/ddd54d03438150fd100f1409f9d23956.png 両方のアルファ値を考慮した計算方法はありますでしょうか イメージしている演算例(参考): http://blogimg.goo.ne.jp/user_image/67/78/27f9e4233e6604fdb0659f51133e53a9.png

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

関連するQ&A

  • 画像の合成

    動画でいうクロマキー、グリーンバック合成みたいなことを、 画像(写真)できませんか? 例えば、 Wordの画面に 2枚の写真を貼り付けて 前景にした写真のバック色だけを消して、背景にした写真と一体化させる。 みたいな感じ。 (ペイントというソフトが苦手なもんで、できれば上のような操作で。)

  • フォトショップ・合成方法「加算」について

    フォトショップ・レイヤー合成方法「加算」について悩んでいます。天体写真を始めたのですが画像処理でご親切な方が以下の方法を教えて下さいました。 ・ノーマルで撮影した画像(Aとする)とSc64+LPS-P2で撮影した画像(Bとする)を両方読み込む。 ・(A)と(B)のそれぞれのチェンネルを分割する(「チャンネル」ウィンドウのオプションメニューから「チャンネル分割」を選ぶ  これで、R,G,Bが3枚のグレースケールの画像に分かれます。 ・(B)のR画像を全範囲選択し、コピー&ペーストで(A)のR画像に貼り付けます。これでレイヤー状態になります。 ・レイヤーの合成方法を「加算」にします。 ・レイヤーメニューから「レイヤーを結合」を選び、1枚にまとめます ・(A)のR,G,Bの画像を「チャンネルを結合」を用いて再びカラー画像に戻します。・・・以上の中で【レイヤーの合成方法を「加算」にします。】がどうやっても分かりません。演算で加算してもアルファチャンネルが出来どうやってもチャンネル加算合成の仕方が分かりません(平均加算合成方法は分かります)ご存じの方はどうか詳しく教えてください。

  • 半透明ブラシ重ね塗りのアルゴリズム

    オリジナルのグラフィックツールを開発しようと思っているのですが、透過レイヤー上で半透明のブラシで重ね塗りしたときの画素値を算出する計算方法がわからず、悩んでいます。 たとえば、市販ペイントツールのPaint Shop Proであるならば CA = (192, 63) [Cは明度(0で黒)、Aはアルファ値(0で完全透明)] の画素値をもつピクセルに CA = (64, 191) の画素値をもつブラシで重ね塗りをすると、その部分は CA = (74, 207) の値になります。 重ね塗り後の画素におけるアルファ値の計算方法は a = (a1 + a2) - a1 * a2 / 255; [上のパターンであれば (191 + 63) - 191 * 63 / 255 = 207 となる] であることまではわかったのですが、アルファ値の重みを考慮した、重ね塗り後の明度部分の算出方法(例えば[192]と[64]で、どのように計算すれば[74]が求まるのか)をご存じの方はいませんでしょうか。 Paint Shop Proでほかのブラシによる演算結果も参考に記述しておきます (既存のレイヤー上にある画素値[C, A], 重ね塗りするブラシの画素値 -> 塗りつぶし結果) (64, 63), (192, 192) -> (182, 207) (128, 63), (63, 191) -> (69, 207) (255, 127), (0, 255) -> (0, 255) (0, 127), (255, 63) -> (101, 159)

  • フォト・ショップエレメンツ2の使い方で・・・・

    詳しい方ならわかると思いますが、ある人物を撮った普通の画像なんですが中央の被写体以外の背景をボカシ、中央の被写体を強調しようとしたいと思ってエレメンツ2のソフトでの使用です。被写体をブラシツールで囲いそれをレイヤー1にコピーしその後背景をぼかしてその2点を合体させるやり方でやろうと思ってます。ブラシで被写体を囲って レイヤー→新規→選択範囲をコピーした新規レイヤー の順にやってるのですが、うまくできません、その際レイヤー1を新たにつくりコピーされるとおもうのですが、レイヤー1はできてるのですがその囲った部分が表示されてなく縞模様だけがレイヤー1に表示されます。たまに「選択範囲で新しいレイヤーを作成できません ピクセルが選択されていません」となります。エレメンツ2の教科書を見ながらやってるのですが、その通り順を追ってやってるのですが、できません。よろしくお願いします。

  • OpenCV での画素値の比較について

    サイズが同じ2枚のbmp画像(img1とimg2)の色をピクセルごとに比較し、同じ色ならそのピクセルを白、違う色なら黒にして、3枚目(img3)の画像を生成するコードを書いています。 imgとimg2は同じ画像ですが、img2にのみ「あ」という文字が書いてあります。うまくいけばimg3には、白い背景に「あ」と黒く表示されるはずです。 ところが、結果に「あ」と表示されません。ピクセル単位で比較していますが、白い背景に、まだらなな黒色と、2~3ミリ四方の同じ大きさの黒い四角形もたくさん(規則的にではなく、ランダムに)表示されます。 img1と2と3が、それぞれ違うピクセルを参照しているのだろうかと、自分なりに調べていますが、どこがまずいのかわからず困っています。どなたかおわかりになれば、ぜひアドバイスをいただけると助かります。 どうぞ宜しくお願い致します。 === int main (int argc, char :: argv) { int x, y, i; uchar p1[3], p2[3]; IplImage *img1, img2, img3; img1 = cvLoadImage ("D:\\...\\ichimaime.bmp", CV_LOAD_IMAGE_COLOR); img2 = cvLoadImage ("D:\\...\\nimaime.bmp", CV_LOAD_IMAGE_COLOR); img3 = cvCreateImage(cvSize (100, 100), IPL_DEPTH_8U, 3); cvZero (img3); for (y = 0 ; y < img1->height; y++) { for (x = 0 ; x < img1->width, x++) { //一枚目の画素値 p1[0] = img1->imageData[img->widthStep * y + x * 3]; // B p1[1] = img1->imageData[img->widthStep * y + x * 3 + 1]; // G p1[2] = img1->imageData[img->widthStep * y + x * 3 + 2]; // R //二枚目の画素値 p2[0] = img2->imageData[img->widthStep * y + x * 3]; // B p2[1] = img2->imageData[img->widthStep * y + x * 3 + 1]; // G p2[2] = img2->imageData[img->widthStep * y + x * 3 + 2]; // R if ( p1[0]!=p2[0] || p1[1]!=p2[1] || p1[2]!=p2[2] ) { /*もし違う色なら黒にする*/ img3-> imageData[img3->widthStep * y + x * 3] = 0; img3-> imageData[img3->widthStep * y + x * 3 +1] = 0; img3-> imageData[img3->widthStep * y + x * 3 +2] = 0; }else{ /*もし同じ色なら白にする*/ img3-> imageData[img3->widthStep * y + x * 3] = 255; img3-> imageData[img3->widthStep * y + x * 3 +1] = 255; img3-> imageData[img3->widthStep * y + x * 3 +2] = 255; } } } cvNmaedWindow(“Image”, CV_WINDOW_AUTOSIZE); CVsHOWiMAGE (“Image”, img3); cvWaitKey(0); cvDestroyWindow(“Image”); cvReleaseImage (&img1); cvReleaseImage (&img2); cvReleaseImage (&img3); return 0; } ===

  • 動画,静止画の編集&加工に詳しい方に質問です。

    動画,静止画の編集&加工に詳しい方に質問です。 今、アニメのOP曲をペイントソフトにて手描きのカットを描き、 それを動画編集ソフトで合成したいと思っています。 『 装甲騎兵ボトムズ 』ってアニメがあるのですが‥ それを手描き動画で作ろう、、、という魂胆ですw OP序盤の‥キリコが荒廃した廃墟のような街を歩いてて、手前にヘルメットの残骸がスクロールしていくシーンです。 あれは…キリコが動いてて、背景が左スクロール,手前ヘルメットとガレキが右スクロールしています。 これを pixiaという描画ペイントソフトで、、、、 人物,手前のヘルメット&残骸,背景… と3種類別々に描きました。 これを別々にBMP形式で保存しました。 ちなみに人物カットと手前のヘルメット&残骸カットは、描画した部分以外は 何も書いてない為、白い表示になっています。 これを『 SUZUKA 』という 動画編集ソフトで合成しようとしたんですが、、、、 背景の手前にキャラを重ねたら、キャラの周りの描画してない領域(画像サイズ分)が白く重なってしまい、バックの背景が隠れてしまいました;汗 pixiaは BMPやJPEGなどのファイル保存では、レイヤー情報が保存されないとあるのですが、、、 この現象は BMP保存した人物ファイルのキャラ以外の部分が透明では無く、白扱いになってるということなんでしょうか? だとすると‥ 描いた人物だけトリミングするなんて 出来ませんし、人物,背景x2系統の合成って どうやったら出来ますでしょうか? ちなみにSuzukaは、レイヤー機能付きのソフトなので動画合成ソフトとしては 問題ないと思いますが。 手描きの素材カットの段階で 問題あるのでしょうか? 合成や編集に詳しい方、解決策をよろしくお願いします。

  • photoshopのぼかしの階調

    お世話になります。 PhotoshopCS2で、コントラストの差がある色のレイヤーを重ね、 上層を「硬さを0%にした消しゴムツール・500ピクセル程度」で穴を開けるように消したとします。 上層は、例えば乗算や比較(暗)で重ねます。 同じ位置でクリックし続け、穴をより大きくすると、ぼかしが効いていた境界線部分だけの階調が低くなった様になってしまいます。 A3サイズで350dpiなどの重いファイルで顕著です。 クリックし続けなくても、暗い色のレイヤーだと ディザ合成ほどではないにしろ、ぼかしたい部分がマダラっぽく なります。 200%以上拡大すると目立ちます。 レイヤーモードを普通やスクリーン等、明るくなる様にした時は目立ちません。 こういうのは仕方がないのでしょうか? なにか設定で変えられるでしょうか? 最初、タブレット使用時に気づいたのですが、 マウスで標準的なソフト円ブラシ(シェイプ等、筆圧が関係ない)を 選択した場合でもなります。 適当な選択範囲を作り、境界線を100ピクセル程度ぼかして 消去しても同様でした。 2年ほど前に購入したiMacですが、 別のマシン(Windows)でも試してみたところ、 似た様な現象は起き、「仕様なのか」とも思ったのですが、 程度の差があるので気になってしまいます。 iMacはメモリ1ギガですが、最近、上記の程度の作業でも 消しゴムがモタモタと適用されていく感じです。

  • プログラミングの課題です。

    input.bmpというビットマップファイル(色数は24ビット)とbackground.bmpというファイルを開き,クロマキー合成をし,ビットマップファイルoutput.bmpに出力させる。ただしimput.bmpが、青:100以上 緑:150以下 赤:70以下なら背景とみなしてよい。 #include <stdio.h> int main() { FILE *fp1,*fp2,*fp3; char pixeldata[54]; int width,height; int i,j; fp1=fopen("input.bmp","rb"); if(fp1==NULL) return(1); //fp1のヘッダー情報の読み込み fp2=fopen("background.bmp","rb"); if(fp2==NULL) return(1); //fp2のヘッダー情報の読み込み fp3=fopen("output.bmp","wb"); if(fp3==NULL) return(1); //fp3のヘッダー情報の書き込み fread(pixeldata,1,54,fp1); fread(pixeldata,1,54,fp2); fwrite(pixeldata,1,54,fp3); printf("input.bmpの縦は何ピクセルですか?"); scanf("%d",&height); printf("input.bmpの横は何ピクセルですか?"); scanf("%d",&width); for(i=0;i<height*width*3;i++){ //画素情報の読み込み(画像サイズ分繰返し) fgetc(fp1); //1画素分のRGBの情報をfp1から読み込み fgetc(fp2); //1画素分のRGBの情報をfp2から読み込み if(){ //fp1から読み込んだ画素が青い fputc(,fp3); //fp3へfp2で読み込んだ1画素分の情報を書き込み } else{//fp1から読み込んだ画素が青くない fputc(,fp3); //fp3へfp1で読み込んだ1画素分の情報を書き込み } } fclose(fp1);fclose(fp2);fclose(fp3); return(0); } みたいな感じで作りましたが、後半がどうやったらいいかわかりません。 どうしたらいいかアドバイスや解説お願いします。

  • c言語を用いて画像の透明度をあげる方法を教えてください。

    c言語を用いて画像の透明度をあげる方法を教えてください。 下プログラムの画像処理ができません。 #include <stdio.h> #include <stdlib.h> #include <memory.h> #include "mybmpi.h" /*メイン関数*/ int main(void) { int width, height; int x, y; BYTE *buffer_f; /*入力画像(前景)用メモリのポインタ*/ BYTE *buffer_b; /*入力画像(背景)用メモリのポインタ*/ BYTE *Rbuffer_f, *Gbuffer_f, *Bbuffer_f; /*入力(前景)用*/ BYTE *Rbuffer_b, *Gbuffer_b, *Bbuffer_b; /*入力(背景)用*/ BYTE *Rbuffer2, *Gbuffer2, *Bbuffer2; /*出力用*/ double tmp_pix; double ratio=0.5; /*どの割合で混ぜるか ratio : 1-ratio */ /*前景画像ファイルを開く*/ buffer_f = LoadBitmap("front.bmp", &width, &height); if(buffer_f==NULL) { /*ファイルが開けなかったので終了*/ return 0; } /*背景画像ファイルを開く*/ buffer_b = LoadBitmap("back.bmp", &width, &height); if(buffer_b==NULL) { /*ファイルが開けなかったので終了*/ return 0; } /*RGBを色平面に分解*/ Rbuffer_f = (BYTE*)malloc( width*height ); /*メモリ確保*/ Gbuffer_f = (BYTE*)malloc( width*height ); Bbuffer_f = (BYTE*)malloc( width*height ); RGB2Plane(buffer_f, Rbuffer_f, Gbuffer_f, Bbuffer_f, width, height); Rbuffer_b = (BYTE*)malloc( width*height ); /*メモリ確保*/ Gbuffer_b = (BYTE*)malloc( width*height ); Bbuffer_b = (BYTE*)malloc( width*height ); RGB2Plane(buffer_b, Rbuffer_b, Gbuffer_b, Bbuffer_b, width, height); /*出力用*/ Rbuffer2 = (BYTE*)malloc( width*height ); /*メモリ確保*/ Gbuffer2 = (BYTE*)malloc( width*height ); Bbuffer2 = (BYTE*)malloc( width*height ); /*****************画像処理をここで行う********************/ for(y=0; y<height; y++){ for(x=0; x<width; x++){ /*この部分がわかりません*/ /*前景画像と背景画像を ratio : 1-ratio で合成する方法?*/ /*R,G,Bそれぞれについて同じ処理をする*/ } } /*******************ここまで******************************/ /*書き込み処理*/ Plane2RGB(buffer_f, Rbuffer2, Gbuffer2, Bbuffer2, width, height); /*bufferは入力のものを転用する*/ SaveBitmap("result.bmp", buffer_f, width, height); /*メモリを解放する*/ free( buffer_f ); free( buffer_b ); free( Rbuffe

  • 315万画素?504万画素?

    とあるサイトで激安のデジカメがのっていて ほしいなぁと思ってみていたのですが そこの宣伝には504万画素!!とでかでかと載っています でも画素数の説明を見ると  約315万画素・CMOSイメージセンサー 静止画記録画素数:2592×1944ピクセル(約504万画素) と載っています これはどういうことなのでしょうか? 値段からして大体は315万画素程度と見るのがよいのでしょうか? 1万円程度でした 500万画素なら欲しいなぁと思いますが デジカメに詳しい方教えてください お願いします