使用opencv為沒(méi)有透明通道的圖像加入透明通道

1.首先叛薯,是opencv中的cvtColor方法羊始。

C++:void cvtColor(InputArray src, OutputArray dst,int code,int dstCn=0 );

參數(shù)解釋:

. InputArray src: 輸入圖像即要進(jìn)行顏色空間變換的原圖像旱幼,可以是Mat類

. OutputArray dst: 輸出圖像即進(jìn)行顏色空間變換后存儲(chǔ)圖像,也可以Mat類

. int code: 轉(zhuǎn)換的代碼或標(biāo)識(shí)突委,即在此確定將什么制式的圖片轉(zhuǎn)換成什么制式的圖片柏卤,后面會(huì)詳細(xì)將

. int dstCn = 0: 目標(biāo)圖像通道數(shù),如果取值為0匀油,則由src和code決定

我們可以令code參數(shù)為COLOR_BGRABGRA缘缚,將圖像轉(zhuǎn)化為帶透明通道的圖片。這里要注意敌蚜,加上的透明通道忙灼,默認(rèn)值為255,也就是說(shuō)钝侠,默認(rèn)將圖像轉(zhuǎn)換為不透明圖该园。如果需要對(duì)圖像的透明度進(jìn)行調(diào)整,則還需要另寫代碼帅韧。下面是部分代碼里初,來(lái)驗(yàn)證默認(rèn)值確實(shí)為255。


std::string path = "E:/140.jpg";

Mat image = cv::imread(image_path);

std::cout << "原圖像通道數(shù): " << image.channels() << std::endl;

cvtColor(image, image, COLOR_BGR2BGRA);

std::cout << "轉(zhuǎn)換后圖像通道數(shù): " << image.channels() << std::endl;

for (int i = 0; i < image.rows; i++) {

    for (int j = 0; j < image.cols; j++) {

        std::cout<<(int)image.at<Vec4b>(i, j)[3]<<std::endl;

    }

}

得到的輸出為:

image

代碼中忽舟,image.at可以獲取圖像像素值双妨,而中括號(hào)內(nèi),0代表B叮阅,1代表G刁品,2代表R,3代表A浩姥,所以括號(hào)中為3挑随。而強(qiáng)制類型轉(zhuǎn)換為int,則是因?yàn)樵趏pencv中勒叠,單像素的類型為uchar兜挨,如果直接標(biāo)準(zhǔn)輸出,則會(huì)輸出一大堆字符眯分,而不是我們想要的像素值拌汇。如果圖像在讀取的時(shí)候沒(méi)有要求讀取透明通道,或者圖像本身沒(méi)有透明通道弊决,那么圖像的通道數(shù)默認(rèn)為3噪舀,可以簡(jiǎn)單地說(shuō),這個(gè)內(nèi)置方法,就是為圖像的通道數(shù)組多加了一列作為透明通道与倡,這個(gè)數(shù)組類型為Mat類型先改。

2.接下來(lái),是手寫代碼的方法

由上述說(shuō)明可知蒸走,默認(rèn)方法所做的就是給圖像的通道數(shù)組再加上一列仇奶,而這一列所表示的,就是圖像每個(gè)像素的透明度比驻。而這個(gè)透明度數(shù)組该溯,也是一個(gè)Mat類型數(shù)組。

所以别惦,我們可以新建一個(gè)Mat類型數(shù)組狈茉,數(shù)組大小與圖像的分辨率一致。這里掸掸,我們還可以以圖像的灰度圖作為參考氯庆,將圖像的每個(gè)像素以灰度值來(lái)設(shè)置透明度,這樣一來(lái)扰付,就實(shí)現(xiàn)了圖像按像素值自動(dòng)的調(diào)整每一個(gè)像素點(diǎn)的透明度堤撵。創(chuàng)建透明通道的方法如下:


//創(chuàng)建透明通道

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);

    //根據(jù)灰度創(chuàng)建透明度通道

    cv::cvtColor(src, gray, cv::COLOR_RGB2GRAY);

    for (int i = 0; i < src.rows; i++)

    {

        for (int j = 0; j < src.cols; j++)

        {

            //透明度為灰度的兩倍,可自行調(diào)整

            alpha.at<uchar>(i, j) = gray.at<uchar>(i, j) * 2;

           }

    }

    return alpha;

}

這個(gè)alpha羽莺,就是圖像的透明通道实昨。然而,這里的透明通道僅僅是被創(chuàng)建了出來(lái)盐固,并沒(méi)有被加入圖像中荒给。我們可以使用opencv中的split和merge函數(shù)來(lái)添加透明通道。其中刁卜,split函數(shù)作用是分割圖像的通道志电,merge函數(shù)則是合并圖像的各通道。我們可以先把原圖像的各個(gè)通道分開蛔趴,然后再連帶著透明通道合并挑辆,就得到了帶透明通道的圖像。代碼如下:


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;

}

再處理的過(guò)程中夺脾,先調(diào)用createAlpha函數(shù)創(chuàng)建透明通道之拨,再調(diào)用addAlpha函數(shù)加入透明通道即可。下面放一個(gè)測(cè)試結(jié)果咧叭。

原圖:

image

加入透明通道:

image

可以看到,一些像素變成了全透明烁竭,而一些像素是半透明菲茬。如果把這個(gè)圖貼在其他圖上的話,看的更明顯一點(diǎn):

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市婉弹,隨后出現(xiàn)的幾起案子睬魂,更是在濱河造成了極大的恐慌,老刑警劉巖镀赌,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氯哮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡商佛,警方通過(guò)查閱死者的電腦和手機(jī)喉钢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)良姆,“玉大人肠虽,你說(shuō)我怎么就攤上這事÷曜罚” “怎么了税课?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)痊剖。 經(jīng)常有香客問(wèn)我韩玩,道長(zhǎng),這世上最難降的妖魔是什么陆馁? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任啸如,我火速辦了婚禮,結(jié)果婚禮上氮惯,老公的妹妹穿的比我還像新娘叮雳。我一直安慰自己,他們只是感情好妇汗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布帘不。 她就那樣靜靜地躺著,像睡著了一般杨箭。 火紅的嫁衣襯著肌膚如雪寞焙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天互婿,我揣著相機(jī)與錄音捣郊,去河邊找鬼。 笑死慈参,一個(gè)胖子當(dāng)著我的面吹牛呛牲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驮配,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼娘扩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼着茸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起琐旁,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涮阔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后灰殴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敬特,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年牺陶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伟阔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡义图,死狀恐怖减俏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碱工,我是刑警寧澤娃承,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站怕篷,受9級(jí)特大地震影響历筝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜廊谓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一梳猪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒸痹,春花似錦春弥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至榛鼎,卻和暖如春逃呼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背者娱。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工抡笼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人黄鳍。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓推姻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親际起。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拾碌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容