OpenCV学习笔记之掩码操作
一、掩碼操作
? ? ? ? ?矩陣的掩碼操作很簡單。其思想是:根據掩碼矩陣(也稱作核)重新計算圖像中每個像素的值。掩碼矩陣中的值表示近鄰像素值(包括該像素自身的值)對新像素值有多大影響。從數學觀點看,我們用自己設置的權值,對像素鄰域內的值做了個加權平均。
二、操作實踐
2.1?基于像素鄰域的掩碼操作
/*!* \brief myMaskFun* \param srcImage* \return*/ Mat myMaskFun(Mat srcImage) {const int nChannels = srcImage.channels();Mat resultImage(srcImage.size(), srcImage.type());for (int j = 1; j < srcImage.rows - 1; j++){const uchar* previous = srcImage.ptr<uchar>(j - 1);const uchar* current = srcImage.ptr<uchar>(j);const uchar* next = srcImage.ptr<uchar>(j + 1);uchar * output = resultImage.ptr<uchar>(j);for (int i = nChannels; i < nChannels*(srcImage.cols - 1); ++i){*output++ = saturate_cast<uchar>(current[i - nChannels] + current[i + nChannels]+ previous[i] + next[i]) / 4;}}//! 進行邊界處理resultImage.row(0).setTo(Scalar(0));resultImage.row(resultImage.rows - 1).setTo(Scalar(0));resultImage.col(0).setTo(Scalar(0));resultImage.col(resultImage.cols - 1).setTo(Scalar(0));return resultImage; }2.2?系統函數方式
/*!* \brief systemMaskFun* \param srcImage* \return*/ Mat systemMaskFun(Mat srcImage) {Mat resultImage(srcImage.size(), srcImage.type());//! 構造核函數因子Mat kern = (Mat_<float>(3, 3) << 0, 1, 0,1, 0, 1,0, 1, 0) / (float)(4);filter2D(srcImage, resultImage, srcImage.depth(), kern);return resultImage; }?filter2D函數詳見附錄1。
代碼詳見《OpenCV掩碼操作練習》
參考資料:
- 【OpenCV圖像處理】八、圖像的掩碼操作
- ?矩陣的掩碼操作
附錄1:filter2D函數
在OpenCV中提供了filter2D函數用來專門應用于計算圖像卷積的操作,首先簡單介紹一下這個函數:
void filter2D( InputArray src, OutputArray dst, int ddepth,InputArray kernel,Point anchor=Point(-1,-1),double delta=0, int borderType=BORDER_DEFAULT );?
這個函數基本上是用來實現圖像的卷積操作,前兩個參數分別表示輸入圖像和輸出圖像,第三個參數ddepth表示的是圖像的深度,如果這個值設置為負數,則這個圖像的深度與輸入的源圖像的深度相同,否則就需要根據源圖像的深度進行相關的設置
例如,若src.depth()=CV_8U,則ddepth=-1 / CV_16S / CV_32F / CV_64F,若src.depth() = CV_16U/CV_16S,則ddepth = -1 / CV_32F / CV_64F,若src.depth() =CV_32F,則ddepth= -1 / CV_32F / CV_64F,若src.depth() = CV_64F,則ddepth = -1 / CV_64F.
第四個參數kernel是卷積核算子,為單通道浮點矩陣,如果對多通道應用不同的卷子核算子計算,需要首先分離成為單通道后在進行單通道上的操作。參數anchor是卷積核錨點,默認值是(-1,-1)表示的是卷積核中心。參數delta是平滑系數,目標圖像生成前可已通過設定這個值用于目標圖像的平滑操作。最后一個參數表示的是邊界類型,有默認值BORDER_DEFAULT)
需要說明的是,這個函數常常應用于線性濾波技術中,當使用卷積核算子計算的圖像目標點在圖像外部時,需要對指定邊界進行插值運算。這個函數實際上計算的是圖像的相關性,而非卷積操作,它的計算公式如下:
其中0<= x' < kernel.cols,0<= y' < kernel.rows
附錄? 2:顏色空間轉換cvtColor()
void cvtColor(InputArray src, OutputArray dst,?int code,?int dstCn=0 );
參數解釋:?
. InputArray src: 輸入圖像即要進行顏色空間變換的原圖像,可以是Mat類?
. OutputArray dst: 輸出圖像即進行顏色空間變換后存儲圖像,也可以Mat類?
. int code: 轉換的代碼或標識,即在此確定將什么制式的圖片轉換成什么制式的圖片,后面會詳細將?
. int dstCn = 0: 目標圖像通道數,如果取值為0,則由src和code決定?
總結
以上是生活随笔為你收集整理的OpenCV学习笔记之掩码操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV学习笔记之扫描图像
- 下一篇: OpenCV学习笔记之图像融合