日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【OpenCV3】如何给图像添加(不)透明度通道

發布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenCV3】如何给图像添加(不)透明度通道 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

透明度通道,又叫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格式。

結果如下:


參考:1、https://baike.baidu.com/item/alpha%E9%80%9A%E9%81%93/3163191?fr=aladdin

2018.05.03

總結

以上是生活随笔為你收集整理的【OpenCV3】如何给图像添加(不)透明度通道的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。