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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OpenCV学习笔记之掩码操作

發布時間:2024/9/21 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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決定?

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的OpenCV学习笔记之掩码操作的全部內容,希望文章能夠幫你解決所遇到的問題。

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