?? 文章首發(fā)于我的個人博客:歡迎大佬們來逛逛
?? OpenCV項目地址及源代碼:點擊這里
膨脹與腐蝕
膨脹與腐蝕是數(shù)學形態(tài)學在圖像處理中最基礎的操作。
膨脹操作是取每個位置領域內最大值,所以膨脹后輸出圖像的總體亮度的平均值比起原圖會有所升高,圖像中比較亮的區(qū)域的面積會變大,而較暗物體的尺寸會減小甚至消失。(增加高亮部分)
void dilate( InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
/*******************************************************************
* src: 輸入圖像
* dst: 輸出圖像
* kernel: 膨脹操作的核
* 參數(shù)為0:中心3*3的核
* anchor: 錨點
* (-1,-1):表示位于中心
* iterations: 迭代的次數(shù)
* borderType: 圖像外部像素的某種邊界模式
* borderValue: 邊界值,一般不管
*********************************************************************/
腐蝕是相反的操作,所以腐蝕就是求局部最小值的操作。(減少高亮部分)
void erode( InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
/*******************************************************************
* src: 輸入圖像
* dst: 輸出圖像
* kernel: 腐蝕操作的核
* 參數(shù)為0:中心3*3的核
* anchor: 錨點
* (-1,-1):表示位于中心
* iterations: 迭代的次數(shù)
* borderType: 斷圖像外部像素的某種邊界模式
* borderValue: 邊界值,一般不管
*********************************************************************/
getStructuringElement函數(shù)可用于構造一個特定大小和形狀的結構元素,用于圖像形態(tài)學處理
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
/*******************************************************************
* shape: 形狀類型
* ksize: 大小
* anchor: 錨點
* (-1,-1):表示位于中心
*********************************************************************/
//shape取值
enum MorphShapes {
MORPH_RECT = 0, //矩形
MORPH_CROSS = 1, //十字交叉
MORPH_ELLIPSE = 2 //橢圓
};
void testDilate() {
cv::Mat kernel = cv::getStructuringElement(cv::MorphShapes::MORPH_RECT, cv::Size(5, 5));
cv::dilate(mt, saves["膨脹"], kernel);
}
void testErode() {
cv::Mat kernel = cv::getStructuringElement(cv::MorphShapes::MORPH_RECT, cv::Size(5, 5));
cv::erode(mt, saves["腐蝕"], kernel);
}
簡單總結:
- 膨脹:增加高亮,減少陰暗
- 腐蝕:增加陰暗,減少高亮
形態(tài)學基礎
處理類型 | 操作 | 作用 |
---|---|---|
開運算 | 先腐蝕再膨脹 | 可在纖細點出分離物體。有助于消除噪音 |
閉運算 | 先膨脹后腐蝕 | 用于排除前景對象中的小孔或對象上的小黑點 |
形態(tài)學梯度 | 膨脹圖與腐蝕圖之差 | 用于保留目標物體的邊緣輪廓 |
頂帽 | 原圖與開運算圖之差 | 分離比鄰近點亮的斑塊,用于突出原圖像中比周圍亮的區(qū)域 |
黑帽 | 閉運算圖與原圖差 | 分離比鄰近點暗的斑塊,突出原圖像中比周圍暗的區(qū)域 |
函數(shù)API:morphologyEx
void morphologyEx( InputArray src, OutputArray dst,int op, InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
/*******************************************************************
* src: 輸入圖像
* dst: 輸出圖像
* op: 操作類型
* kernel: 操作的核
* 參數(shù)為0:中心3*3的核
* anchor: 錨點
* (-1,-1):表示位于中心
* iterations: 迭代的次數(shù)
* borderType: 圖像外部像素的某種邊界模式
* borderValue: 邊界值,一般不管
*********************************************************************/
//操作類型
enum MorphTypes{
MORPH_ERODE = 0, //腐蝕
MORPH_DILATE = 1, //膨脹
MORPH_OPEN = 2, //開操作
MORPH_CLOSE = 3, //閉操作
MORPH_GRADIENT = 4, //梯度操作
MORPH_TOPHAT = 5, //頂帽操作
MORPH_BLACKHAT = 6, //黑帽操作
MORPH_HITMISS = 7 //隨機操作,只支持CV_8UC1模式
}
void testMorphology() {
cv::Mat kernel = cv::getStructuringElement(cv::MorphShapes::MORPH_RECT, cv::Size(5, 5));
cv::morphologyEx(mt, saves["膨脹"],cv::MorphTypes::MORPH_DILATE, kernel);
cv::morphologyEx(mt, saves["腐蝕"], cv::MorphTypes::MORPH_ERODE, kernel);
cv::morphologyEx(mt, saves["開運算"], cv::MorphTypes::MORPH_OPEN, kernel);
cv::morphologyEx(mt, saves["閉運算"], cv::MorphTypes::MORPH_CLOSE, kernel);
cv::morphologyEx(mt, saves["梯度"], cv::MorphTypes::MORPH_GRADIENT, kernel);
cv::morphologyEx(mt, saves["頂帽"], cv::MorphTypes::MORPH_TOPHAT, kernel);
cv::morphologyEx(mt, saves["黑帽"], cv::MorphTypes::MORPH_BLACKHAT, kernel);
}
參考:文章來源:http://www.zghlxwxcb.cn/news/detail-603007.html
OpenCV圖像腐蝕與膨脹(13)_qq63e46f74301f3的技術博客_51CTO博客文章來源地址http://www.zghlxwxcb.cn/news/detail-603007.html
到了這里,關于C++OpenCV(7):圖像形態(tài)學基礎操作的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!