修士の研究でIplImageにアルファ値を付与し、それを元にopenglでアルファブレンドをしようとしています。
ですが、どうにもうまくいきません。
具体的には、単純に色の暗い部分のアルファ値を低く、色の明るい部分のアルファ値を高くすることで、一般的なアルファ画像を作ろうとしていました。
明るさはその座標におけるRGBの最大値をそのまま転用しています。
しかし繰り返し部分でどこか妙なエラーでもあるのか、縦線ノイズのような透過まで発生してしまって困っています。
このノイズが出現しないようにする方法はないか、また私が何か見逃していないかチェックお願いします。
OSはVista VisualStudio2008を使用、言語はc++、GLUTとopencv2.2を使っています。
//IplImageの透過値設定
IplImage *IplAlpha_Set(IplImage *inputImage,int alphaflag,char *savename)
{
IplImage *alpha_image= cvCreateImage( cvSize( inputImage->width , inputImage->height ) , inputImage->depth , 4 );
cvCreateImage( cvSize( inputImage->width , inputImage->height ) , inputImage->depth , 4 );
for( int y = 0 ; y < inputImage->height ; y++ ){
for( int x = 0 ; x < inputImage->width ; x++ ){
CvScalar c = cvGet2D( inputImage, y , x );
if(alphaflag==0){
c.val[3] = 255;
}
else{
c.val[3] = (double)ImageRGBMax(alpha_image,x,y);
}
cvSet2D(alpha_image, y , x , c );
}
}
//実際のデータ確認
cvSaveImage(savename,alpha_image);
return alpha_image;
}
//1つの座標におけるRGBの最大値の取得
int ImageRGBMax(IplImage *inputImage,int x,int y)
{
int maxvalue=0;
int maxvalue_stack[3]={0,0,0};
for(int color = BLUE;color <= RED;color++){
maxvalue_stack[color]=(unsigned char)inputImage->imageData[inputImage->widthStep * y + x * 3 + color];
}
if(maxvalue_stack[BLUE]>=maxvalue_stack[GREEN]&&maxvalue_stack[BLUE]>=maxvalue_stack[RED])maxvalue=maxvalue_stack[BLUE];
if(maxvalue_stack[GREEN]>=maxvalue_stack[BLUE]&&maxvalue_stack[GREEN]>=maxvalue_stack[RED])maxvalue=maxvalue_stack[GREEN];
if(maxvalue_stack[RED]>=maxvalue_stack[GREEN]&&maxvalue_stack[RED]>=maxvalue_stack[BLUE])maxvalue=maxvalue_stack[RED];
//printf("maxvalue = %d\n",maxvalue);
return maxvalue;
}