OpenCVはバイナリマスクのみをサポートしていることを私は知っています。
しかし、オーバーレイの透明度を指定するグレースケールマスクがあるオーバーレイを実行する必要があります。
例えば。マスク内のピクセルが50%白色の場合cv::addWeighted
、alpha = beta = 0.5、gamma=0.0のそのピクセルの操作を意味するはずです。
さて、opencvライブラリ関数がない場合、最も効率的なアルゴリズムとしてどのアルゴリズムを提案しますか?
OpenCVはバイナリマスクのみをサポートしていることを私は知っています。
しかし、オーバーレイの透明度を指定するグレースケールマスクがあるオーバーレイを実行する必要があります。
例えば。マスク内のピクセルが50%白色の場合cv::addWeighted
、alpha = beta = 0.5、gamma=0.0のそのピクセルの操作を意味するはずです。
さて、opencvライブラリ関数がない場合、最も効率的なアルゴリズムとしてどのアルゴリズムを提案しますか?
私は修正のためにこのようなことをしました。
typedef double Mask_value_t;
typedef Mat_<Mask_value_t> Mask;
void cv::addMasked(const Mat& src1, const Mat& src2, const Mask& mask, Mat& dst)
{
MatConstIterator_<Vec3b> it1 = src1.begin<Vec3b>(), it1_end = src1.end<Vec3b>();
MatConstIterator_<Vec3b> it2 = src2.begin<Vec3b>();
MatConstIterator_<Mask_value_t> mask_it = mask.begin();
MatIterator_<Vec3b> dst_it = dst.begin<Vec3b>();
for(; it1 != it1_end; ++it1, ++it2, ++mask_it, ++dst_it)
*dst_it = (*it1) * (1.0-*mask_it) + (*it2) * (*mask_it);
}
私はまだこのコードをアサーションで最適化も安全化もしていません。
作業上の前提:すべてのマットとマスクは同じサイズであり、マットは通常の3チャンネルカラー画像です。
同様の問題があり、透明度のあるpngを適用したいと思いました。私の解決策はマット式を使用することでした:
void AlphaBlend(const Mat& imgFore, Mat& imgDst, const Mat& alpha)
{
vector<Mat> vAlpha;
Mat imgAlpha3;
for(int i = 0; i < 3; i++) vAlpha.push_back(alpha);
merge(vAlpha,imgAlpha3)
Mat blend = imgFore.mul(imgAlpha3,1.0/255) +
imgDst.mul(Scalar::all(255)-imgAlpha3,1.0/255);
blend.copyTo(imgDst);
}
mixchannels
OpenCVは、またはを使用して作成できるRGBA画像をサポートし、画像をグレースケールマスクsplit
とmerge
組み合わせる機能を備えています。これがあなたが探しているものであることを願っています!
この方法を使用すると、次のようにグレースケールマスクを画像と組み合わせることができます。
cv::Mat gray_image, mask, rgba_image;
std::vector<cv::Mat> result;
cv::Mat image = cv::imread(image_path);
cv::split(image, result);
cv::cvtColor(image, gray_image, CV_BGR2GRAY);
cv::threshold(gray_image, mask, 128, 255, CV_THRESH_BINARY);
result.push_back(mask);
cv::merge(result, rgba_image);
imwrite("rgba.png", rgba_image);
read-rgba-image-opencvでcv::imshow
説明されているように使用してRGBA画像を表示することはできず、画像をjpegとして保存することはできません。これは、その形式が透明性をサポートしていないためです。opencv-2-3-convert-mat-to-rgba-pixel-arrayに示すように、を使用してチャネルを組み合わせることができるようです。cv::cvtcolor