なぜかopencvでアルファブレンドをしようとした時に奇妙な挙動になったので質問させて頂きます。
今まではiplImageのImageDataにある各画素に、アルファブレンド後の数値を直接char型にキャストして代入していたのですが、これでは整数レベルでしか変動させられないため、一旦double型の変数に格納して変数に手を加えた後にImageDataに格納しようと考えました。
しかし、その結果できたアルファブレンド画像は酷いノイズが入っており、とても望んでいたブレンド画像では有りませんでした。
恐らく格納する間に何かあることは検討がつくのですがそれが何なのかは全くわかりません。
どうか検証をお願いします。
#define BLUE 0
#define GREEN 1
#define RED 2
IplImage *IplAlphaBlend(IplImage *ImageA,IplImage *ImageB,int framecount)//doubleに格納
{
IplImage *BlendImage = cvCloneImage(ImageA);
double alpha=0;
double colorstk[3]={0};
#pragma omp parallel for
for(int y = 0 ; y < ImageA->height ; y++)
{
for(int x = 0 ; x < ImageA->width ; x++)
{
alpha = ((double)ImageRGBMax(ImageA,x,y))/255;//座標(x,y)において一番明るい色の数値をunsigned charで返し、255で割ることで0<=alpha<=1となるalphaを取得する。
//alpha = 0.1;
if(alpha>1)alpha=1;
else if(alpha<0.05)alpha=0.0001;
/*ここから
BlendImage->imageData[y*BlendImage->widthStep + x*3+BLUE] = (char)(alpha * (unsigned char)(ImageA->imageData[y*ImageA->widthStep + x*3+BLUE]) + (1.0-alpha) * (unsigned char)(ImageB->imageData[y*ImageB->widthStep + x*3+BLUE]));
BlendImage->imageData[y*BlendImage->widthStep + x*3+GREEN] = (char)(alpha * (unsigned char)(ImageA->imageData[y*ImageA->widthStep + x*3+GREEN]) + (1.0-alpha) * (unsigned char)(ImageB->imageData[y*ImageB->widthStep + x*3+GREEN]));
BlendImage->imageData[y*BlendImage->widthStep + x*3+RED] = (char)(alpha * (unsigned char)(ImageA->imageData[y*ImageA->widthStep + x*3+RED]) + (1.0-alpha) * (unsigned char)(ImageB->imageData[y*ImageB->widthStep + x*3+RED]));
ここまでがアルファブレンド画像の画素値を直接代入する。現在はコメントアウト中*/
//ここから
colorstk[BLUE] = (double)(alpha * (unsigned char)(ImageA->imageData[y*ImageA->widthStep + x*3+BLUE]) + (1.0-alpha) * (unsigned char)(ImageB->imageData[y*ImageB->widthStep + x*3+BLUE]));
colorstk[GREEN] = (double)(alpha * (unsigned char)(ImageA->imageData[y*ImageA->widthStep + x*3+GREEN]) + (1.0-alpha) * (unsigned char)(ImageB->imageData[y*ImageB->widthStep + x*3+GREEN]));
colorstk[RED] = (double)(alpha * (unsigned char)(ImageA->imageData[y*ImageA->widthStep + x*3+RED]) + (1.0-alpha) * (unsigned char)(ImageB->imageData[y*ImageB->widthStep + x*3+RED]));
BlendImage->imageData[y*BlendImage->widthStep + x*3+BLUE] = (char)(colorstk[BLUE]);
BlendImage->imageData[y*BlendImage->widthStep + x*3+GREEN] = (char)(colorstk[GREEN]);
BlendImage->imageData[y*BlendImage->widthStep + x*3+RED] = (char)(colorstk[RED]);
//ここまでがdoubleに代入後charにキャストする
}
}
return BlendImage;
}