矩阵 计算机应用,《计算机视觉算法:基于OpenCV的计算机应用开发》 —3.3 元素级矩阵操作...
3.3 元素級矩陣操作
基于元素的(元素級)矩陣操作是計算機視覺中的一類數學函數和算法,它處理矩陣的各個元素,或者說,圖像中的每個像素。注意基于元素的操作可以并行化,因此矩陣元素的處理順序不重要。這個特點是本節函數和算法與本章的后續小節中的函數和算法的重要區別。
3.3.1 基本操作
OpenCV提供了所有必要的函數和重載操作符來進行兩個矩陣之間或矩陣和標量之間的加減乘除操作。
3.3.1.1 加法操作
函數add和運算符+可用于兩個矩陣間元素相加或一個矩陣的元素與一個標量相加,如下例所示:
可以使用以下代碼替換前面代碼中的最后一行:
下圖顯示了兩個圖像相加后的結果:
如果你想給Mat對象的每個元素都加上一個標量值,可以用類似如下代碼:
如果在灰度圖像上執行上述代碼,結果將比源圖像有更高的亮度。請注意,如果圖像有三個通道,則必須使用包含三個元素的向量而不是單個值。例如,為了使RGB圖像更亮,你可以使用如下代碼:
下圖展示了上述代碼執行之后的效果,處理后的圖像亮度比源圖像提高了:
在前面的示例代碼中,僅通過在每個像素上增加一個數值即可獲得更亮的圖像。
3.3.1.2 加權加法
除了簡單將兩個圖像相加,你還可以使用加權加法,加權加法會對每個圖像增加權重之后再相加。這相當于對加法的每個參與者分別設置不透明度級別。要進行加權加法,你可以使用addWeighted函數:
如果使用此代碼來處理上一節中的示例圖片,結果將類似于下圖:
透明文本類似于通常在照片編輯程序使用的水印。你注意到代碼中對alpha、beta和gamma值的注釋了嗎?顯然,如果beta值為1.0則上面的例子就跟普通的圖像疊加函數完全相同,此時疊加文本沒有透明度。
3.3.1.3 減法操作
與兩個Mat對象疊加類似,你也可以使用substract函數或-運算符從一個圖像的所有元素中減去另一個圖像的所有元素。請看下例:
上面代碼中的最后一行也可以替換為:
如果我們使用前面示例中的圖像,則減法操作的結果如下:
從源圖像中減去較高像素值(較亮像素)會生成深色的疊加文本。另外,與加法不同,減法運算結果與其操作數的順序相關。嘗試交換操作數,自己看看會發生什么。
就像圖像加法一樣,也可以讓圖像的所有像素減去一個常數。你可以猜到,從所有像素中減去常量值將生成更暗的圖像(取決于該值的大小),這與加法運算相反。下面展示了通過簡單的減法操作使圖像變得更暗的例子:
如果源圖像是三通道RGB圖像,則需要使用向量作為第二個操作數:
3.3.1.4 乘法和除法操作
與加法和減法類似,你還可以將Mat對象的所有元素與另一個Mat對象的所有元素相乘或相除。同樣,兩個操作都可以使用矩陣和標量。乘法可以使用OpenCV的multiply函數(類似于Mat :: mul函數),而除法可以使用divide函數。
見下例:
前面代碼中的scale是一個附加參數,可以傳給multiply和divide函數來縮放結果中Mat對象的所有元素。你還可以在矩陣乘法或除法中使用標量,如下示例所示:
顯然,前面的代碼將生成兩個圖像,一個是源圖像亮度的5倍(變亮),一個是源圖像亮度的1/5(變暗)。這里要注意的一點是,與加法和減法不同,乘除法得到的圖像不會均勻地變亮或變暗,你應該會注意到較亮的區域變得更亮,反之亦然。其原因顯然是由于乘法和除法運算的效果與加減法不同,經過乘除法操作后,較亮像素的值上升或下降要快得多。有趣的是,在大多數照片編輯應用程序中,就是使用這個技術來使圖像的明亮區域變亮或變暗的。
總結
以上是生活随笔為你收集整理的矩阵 计算机应用,《计算机视觉算法:基于OpenCV的计算机应用开发》 —3.3 元素级矩阵操作...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebBrowser介绍——Javasc
- 下一篇: Windows窗口分析