Opencv PNG抠图
我們平時接觸的最多的圖片格式除了jpg,還有一種就是帶透明通道的png圖。png這種帶透明通道的圖像因為有透明度,因此,它可以方便的和背景圖像進(jìn)行疊加和組合。
彩色的jpg圖像是RGB三通道,而png是ARGB四通道(A就是Alpha,圖像處理這塊叫透明度)。在opencv中,png也是點陣數(shù)據(jù),每個位置在內(nèi)存中排列為BGRA。
比如下面一張png圖像,位深是32,也就是說每個位置是4個字節(jié)。我們這個圖像雖然是png的,但是現(xiàn)在它的透明通道都是255,所以我們可以清楚看到背景不是空的,而是白色。讓我們通過代碼把它的白色背景扣掉吧。
代碼其實比較簡單了,因為這個圖顏色比較純。就是遍歷每個位置,然后判斷這個位置如果RGB值都是255,就是白色,我們就把這個位置的Alpha通道設(shè)置為0,就是全透明了。
需要注意的是opencv讀取圖像默認(rèn)會變成RGB圖,所以imread函數(shù)第二個參數(shù)需要傳值IMREAD_UNCHANGED,讓它讀圖時保持原有圖像的類型(同理加載單通道灰度圖也得設(shè)置)。
處理保存后我們可以看到,是不是背景透明了。
Alpha通道是有透明度的,所以我們可以再設(shè)置下這個圖的紅色部分,讓它變成半透明。
把前面的代碼略加改造,多一個紅色區(qū)域的判斷,然后把對應(yīng)位置的Alpha通道設(shè)置成125(256的一半,所以是半透明,也就是透明度50%)。
之前文章我也用過這個圖。。因為紅色不夠紅,所以它這塊大部分紅色通道值是254,不是255。。。。
整完后效果就是這樣了:
這個放在這里圖比較小,對比不夠真切,我們可以用Photoshop打開對比看的更清楚。
把3.png作為上面圖層,疊加到另外一個圖像,就是那種經(jīng)常說的圖像合成了。
當(dāng)然這個原圖因為顏色不純。我這個是寫代碼單純判斷一個顏色,都沒有做閾值范圍,所以摳圖稀爛。。。我就是從代碼技術(shù)分析下原理,大家不要在意這個圖放上去的細(xì)節(jié)。。。
總結(jié)
以上是生活随笔為你收集整理的Opencv PNG抠图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一种通过配方功能实现简单高效控制的方法
- 下一篇: 用户案例:网络设备厂商选择Vdoo平台强