OpenCV中的Alpha通道

5

OpenCV是否支持alpha通道?或者有没有办法处理透明的png图像?我需要合并两张图片,其中第一张是背景图片,第二张是通过cvWarpAffine旋转后的图片。我可以逐个像素地合并这两张图片,并忽略一些值,在cvScalar中设置cvWarpAffine。然而,我认为这不是一个理想的解决方案。 感谢建议。


这是关于该主题的最古老的问题之一,仍然吸引着许多访问者。如果您正在寻找一些代码,这里有一个更近期的答案 - karlphillip
2个回答

8
更新的答案:使用CV_LOAD_IMAGE_UNCHANGED标志从图像中加载所有四个通道(包括Alpha)。然后,使用mixChannels()和/或split()将alpha通道与其他通道分离,并对其进行阈值处理,如下所述。 非常旧的回答: OpenCV不支持Alpha通道,仅支持蒙版。如果要读取带有Alpha通道的PNG,请先使用imagemagick提取Alpha通道。
convert input.png -channel Alpha -negate -separate input-mask.png

然后在OpenCV中,你可以像这样做:

Mat_<float> mask = imread("input-mask.png", 0);
threshold(mask, mask, 254., 1., THRESH_BINARY);

...要获得一个真实的掩模(可用作OpenCV操作中的掩模矩阵)。或者,您可以在自己的操作中使用它,而无需进行阈值处理。为了应用掩模,将其扩展到三个通道可能也是一个好主意:

std::vector<Mat> marr(3, mask);
Mat_<Vec<float, 3> > maskRGB;
merge(marr, maskRGB);

之后你可以像这样测试:

imshow("Target", target);
imshow("Mask", mask*255);
imshow("Applied", target.mul(maskRGB));
waitKey();

注意: 这是OpenCV 2.0的代码。


2

这里有一个bash脚本,可以对目录中的所有png文件执行ypnos给出的ImageMagick转换。您可以通过将第三行中的*替换为find命令来使其递归。

#!/bin/bash

for file in *
do
    if [[ $file =~ (.+)-mask\.png ]]; then
        echo "Ignoring mask $file"
    elif [[ $file =~ (.+)\.png ]]; then
        echo "Generating mask for $file"
        basefn=${BASH_REMATCH[1]}
        convert "$basefn.png" -channel Alpha -negate -separate "$basefn-mask.png"
    fi
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接