入力画像は、アルファチャンネルあり、なしBGR、グレースケールの3種類に対応した。 アルファチャンネルは8bitの4チャンネルの4つ目で、0-255で与える。0の場合は完全に透過する。 今回は、BGRの輝度値が真っ白付近(245-255)を透過する条件とした。
変換前(左)と変換後(右)

TEST(TestOpenCV, TestAlphaChannel) {
cv::Mat src = cv::imread("alpha_src.png", 1);
cv::Mat alpha_img(src.size(), CV_8UC4);
cv::Mat img;
if (src.type() == CV_8UC4) {
cv::cvtColor(src, img, CV_BGRA2BGR);
std::cout << "CV_BGRA2BGR" << std::endl;
}
else if (src.type() == CV_8UC1) {
std::cout << "CV_GRAY2BGR" << std::endl;
cv::cvtColor(src, img, CV_GRAY2BGR);
}
else if (src.type() == CV_8UC3) {
img = src;
}
else {
throw std::exception();
}
//メインの実装
for (int y = 0; y < img.rows; y++) {
for (int x = 0; x < img.cols; x++) {
cv::Vec3b p = img.at<cv::Vec3b>(cv::Point(x, y));
if (p[0] + p[1] + p[2] > (255 * 3 - 30)) {//好きな条件
alpha_img.at<cv::Vec4b>(cv::Point(x, y))
= cv::Vec4b(p[0], p[1], p[2], 0); //透過
}
else {
alpha_img.at<cv::Vec4b>(cv::Point(x, y))
= cv::Vec4b(p[0], p[1], p[2], 255); //不透過
}
}
}
cv::imwrite("alpha_dst.png", alpha_img);
}