【OpenCV3】如何給影象新增(不)透明度通道
阿新 • • 發佈:2019-01-01
透明度通道,又叫alpha通道,做用於記錄影象的透明度資訊。具體參照【百度百科】“alpha通道”中的介紹。透明度確切的說應該叫不透明度(Opacity),取最小值0時,表示完全透明;取最大值255時,表示完全不透明;取值越大表示越不透明。通常遇到的影象如bmp影象、jpg影象都是單通道(灰度圖)、RGB三通道(彩色)影象,而沒有透明度通道,那麼如何使用opencv給沒有透明度通道的影象新增透明度,形成具有透明度通道(四通道)的影象呢。
這裡封裝了一個簡單的函式,如下:
int addAlpha(cv::Mat& src, cv::Mat& dst, cv::Mat& alpha) { if (src.channels() == 4) { return -1; } else if (src.channels() == 1) { cv::cvtColor(src, src, cv::COLOR_GRAY2RGB); } dst = cv::Mat(src.rows, src.cols, CV_8UC4); std::vector<cv::Mat> srcChannels; std::vector<cv::Mat> dstChannels; //分離通道 cv::split(src, srcChannels); dstChannels.push_back(srcChannels[0]); dstChannels.push_back(srcChannels[1]); dstChannels.push_back(srcChannels[2]); //新增透明度通道 dstChannels.push_back(alpha); //合併通道 cv::merge(dstChannels, dst); return 0; }
另一個問題就是如何生成透明度,這個可根據實際的需要來定,為了方便起見,這裡將透明度和灰度關聯,灰度階越高,約透明(alpha值越小)。程式碼如下:
cv::Mat createAlpha(cv::Mat& src) { cv::Mat alpha = cv::Mat::zeros(src.rows, src.cols, CV_8UC1); cv::Mat gray = cv::Mat::zeros(src.rows, src.cols, CV_8UC1); cv::cvtColor(src, gray, cv::COLOR_RGB2GRAY); for (int i = 0; i < src.rows; i++) { for (int j = 0; j < src.cols; j++) { alpha.at<uchar>(i, j) = 255 - gray.at<uchar>(i, j); } } return alpha; }
最後是測試程式碼:
int main()
{
cv::Mat src = cv::imread("car.jpg", 1);
cv::Mat dst;
cv::Mat alpha = createAlpha(src);
addAlpha(src, dst, alpha);
cv::imshow("src", src);
cv::imshow("dst", dst);
cv::imwrite("car.png", dst);
cv::waitKey(0);
return 0;
}
注:儲存具有透明度的影象,一般採用png格式。
結果如下:
2018.05.03