<圖像處理進(jìn)階>基于OpenCV的圖像的腐蝕與膨脹

圖像處理進(jìn)階(一)——圖像的腐蝕膨脹

作者:Cabin_V

作為學(xué)習(xí)圖像處理的學(xué)生,需要不斷學(xué)習(xí)相關(guān)知識茸习,我在課余時間將一些分析總結(jié)和學(xué)習(xí)的筆記寫成博客來記錄自己的學(xué)習(xí)過程,也希望能與大家一起交流。

關(guān)于圖像處理入門和進(jìn)階分類問題倾鲫,我根據(jù)《數(shù)字圖像處理》這本書(本科期間上課使用)尤蒿,將出現(xiàn)的內(nèi)容劃分為入門郑气,其他常用的知識劃分為進(jìn)階。

轉(zhuǎn)載務(wù)必說明出處腰池!

圖像腐蝕與膨脹

OpenCV為進(jìn)行圖像的形態(tài)學(xué)變換提供了快捷尾组、方便的函數(shù)。最基本的形態(tài)學(xué)操作有兩種示弓,分別是:腐蝕(erode)與膨脹(dilate)讳侨。

腐蝕算法視頻演示
膨脹算法視頻演示

區(qū)別

腐蝕和膨脹是對白色部分而言的。膨脹是對圖像中高亮的部分進(jìn)行膨脹避乏,處理后的圖片高亮區(qū)域擴(kuò)大爷耀;而腐蝕是對高亮部分進(jìn)行腐蝕,處理后的圖片高亮區(qū)域減少拍皮。

膨脹就是求局部最大值的操作歹叮。膨脹與膨脹操作就是將圖像與核進(jìn)行卷積。

作用

膨脹與腐蝕配合使用能實現(xiàn)各種各樣的功能铆帽,主要如下:

  • 消除噪聲

  • 分割出獨立的圖像元素贵试,在圖像中連接相鄰的元素

  • 尋找圖像中明顯的極大值區(qū)域或極小值區(qū)域

  • 求出圖像梯度

API說明

如果想進(jìn)一步了解各個參數(shù)對圖像最終結(jié)果的影響,可以跳到文章最下方代碼

我們先來看下簡單的圖像腐蝕膨脹的代碼

#include <opencv2/opencv.cpp>
using namespace cv;

int main()
{
    Mat srcImage = imread("1.jpg");
    imshow("原圖",srcImage);
    
    //返回指定形狀和尺寸的結(jié)構(gòu)元素
    Mat element = getStructuringElement(MORPH_CROSS,Size(3,3));  
    Mat eroImage, dilImage;
    
    //圖像腐蝕
    erode(srcImage, eroImage, element);                           
    imshow("腐蝕", eroImage);
    //圖像膨脹
    dilate(srcImage, dilImage, element);                          
    imshow("膨脹", dilImage);
    
    waitKey(0);
    return 0;
}

首先看一下程序運行結(jié)果

原圖
腐蝕和膨脹

可以看到經(jīng)過原圖經(jīng)過腐蝕后蘑险,中間的白框不見了纵搁,而經(jīng)過膨脹處理,原圖中白框明顯變厚愧驱。

大家可以將代碼拷貝慰技,在自己的電腦運行一下,通過調(diào)整核大小形狀以及形態(tài)學(xué)操作组砚,觀察效果

注意吻商!圖片要放在.cpp文件相同路徑下!

以上程序分別用到了getStructuringElement()erode()dilate()函數(shù)糟红。

getStructuringElement()介紹

cv::Mat cv::getStructuringElement(int shape,Size ksize,Point anchor = cv::Point(-1,-1));

用法:可用于構(gòu)造一個特定大小和形狀的結(jié)構(gòu)元素艾帐,用于圖像形態(tài)學(xué)處理。

參數(shù)說明:

  • shape:結(jié)構(gòu)元素的形狀(MorphShapes的其中一種)

    • MORPH_RECT——矩形
    • MORPH_CROSS——交叉形
    • MORPH_ELLIPSE——橢圓形
  • ksize:結(jié)構(gòu)元素的大小

  • anchor:錨點盆偿,表示結(jié)構(gòu)元素中的一個點柒爸,默認(rèn)值Point(-1,-1)表示位于結(jié)構(gòu)元素中心,只有交錯形狀的(MORPH_CROSS)元素依賴錨點位置事扭,對于其它形狀的元素捎稚,錨點規(guī)定了形態(tài)學(xué)處理結(jié)果的偏移量。

erode()、dilate()介紹

void cv::erode( InputArray src, OutputArray dst, InputArray kernel,
                Point anchor, int iterations,
                int borderType, const Scalar& borderValue );

用法:實現(xiàn)圖像腐蝕功能的函數(shù)阳藻。

void cv::dilate( InputArray src, OutputArray dst, InputArray kernel,
                 Point anchor, int iterations,
                 int borderType, const Scalar& borderValue );

用法:實現(xiàn)圖像膨脹功能的函數(shù)晰奖。

兩個函數(shù)的參數(shù)個數(shù)和名稱是一模一樣的,不同的只是函數(shù)功能腥泥,所以參數(shù)方面一起介紹匾南。

參數(shù)說明:一般只需使用前三個參數(shù),后四個參數(shù)都有默認(rèn)值蛔外。

  • srcInputArray類型蛆楞,輸入圖像,Mat類型的待處理圖像夹厌。圖像通道的數(shù)量可以是任意的豹爹,但圖像深度應(yīng)為CV_8U、CV_16U矛纹、CV_16S臂聋、CV_32F或CV_64F其中之一。

  • dstOutputArray類型或南,目標(biāo)圖像孩等,和輸入圖像有一樣的尺寸和類型。

  • kerneInputArray類型采够,形態(tài)學(xué)運算的內(nèi)核肄方。當(dāng)為NULL時,表示的是使用參考點位于中心3x3的核蹬癌。一般配合getStructuringElement()函數(shù)使用权她。

  • anchorPoint類型,錨的位置逝薪。有默認(rèn)值(-1,-1)隅要,表示錨位于單位的中心。一般設(shè)置為默認(rèn)值董济。

  • iterationint類型步清,迭代使用erode()函數(shù)的次數(shù),默認(rèn)值為1感局。

  • borderTypeint類型,用于推斷圖像外部像素的某種邊界模式暂衡。默認(rèn)值為BORDER_DEFAULT询微。

  • borderValueconst Scalar&類型,當(dāng)邊界為常數(shù)時的邊界值狂巢。默認(rèn)值為morphologyDefaultBorderValue()撑毛,一般設(shè)置為默認(rèn)值。

綜合代碼

這個程序在前面代碼基礎(chǔ)上加入了滑動條的功能

可以選擇“腐蝕/膨脹”、內(nèi)核形狀藻雌、內(nèi)核尺寸雌续。

運行界面如下:

運行界面
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

//全局變量聲明
Mat g_srcImage, g_dstImage;
//Trackbar接收的參數(shù)
int g_nTrackbarNumer = 0;               //0-腐蝕,1-膨脹
int g_nStructElementShape = MORPH_RECT; //結(jié)構(gòu)元素的形狀 0-rect 1-cross 2-ellipse
int g_nStructElementSize = 0;           //結(jié)構(gòu)元素的尺寸


//函數(shù)聲明
void Process();
void on_ElementShapeChange(int, void *);
void on_TrackbarNumChange(int, void *);
void on_ElementSizeChange(int, void *);

int main()
{
    g_srcImage = imread("1.jpg");
    if (!g_srcImage.data)
    {
        printf("error!\n");
        return false;
    }

    namedWindow("Erode/Dilate");
    imshow("Erode/Dilate",g_srcImage);

    //創(chuàng)建滑動條
    createTrackbar("Ero/Dil", "Erode/Dilate", &g_nTrackbarNumer, 1, on_TrackbarNumChange);
    createTrackbar("shape", "Erode/Dilate", &g_nStructElementShape, 2, on_ElementShapeChange);
    createTrackbar("size", "Erode/Dilate", &g_nStructElementSize, 11, on_ElementSizeChange);

    //按q退出程序
    if (waitKey(0) != 'q')
    {
    }

    return 0;
}

void Process()
{
    //根據(jù)g_nStructElementShape和g_nStructElementSize自定義核
    Mat element = getStructuringElement(g_nStructElementShape, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1), Point(g_nStructElementSize, g_nStructElementSize));

    //選擇腐蝕或膨脹操作
    if (g_nTrackbarNumer == 0)
    {
        erode(g_srcImage, g_dstImage, element);
    }
    else
    {
        dilate(g_srcImage, g_dstImage, element);
    }

    imshow("Erode/Dilate", g_dstImage);
}

//Trackbar-shape響應(yīng)函數(shù)
void on_ElementShapeChange(int, void *)
{
    //g_nStructElementShape數(shù)值已改變
    Process();
}

//Trackbar-erode/dilate響應(yīng)函數(shù)
void on_TrackbarNumChange(int, void *)
{
    //g_nTrackbarNumer數(shù)值已改變
    Process();
}

//Trackbar-size響應(yīng)函數(shù)
void on_ElementSizeChange(int, void *)
{
    //g_nStructElementSize數(shù)值已改變
    Process();
}

本篇文章對你們有用的話胯杭,點個贊再走~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驯杜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子做个,更是在濱河造成了極大的恐慌鸽心,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件居暖,死亡現(xiàn)場離奇詭異顽频,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)太闺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門糯景,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人省骂,你說我怎么就攤上這事蟀淮。” “怎么了冀宴?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵灭贷,是天一觀的道長。 經(jīng)常有香客問我略贮,道長甚疟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任逃延,我火速辦了婚禮览妖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揽祥。我一直安慰自己讽膏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布拄丰。 她就那樣靜靜地躺著府树,像睡著了一般。 火紅的嫁衣襯著肌膚如雪料按。 梳的紋絲不亂的頭發(fā)上奄侠,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音载矿,去河邊找鬼垄潮。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弯洗。 我是一名探鬼主播旅急,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牡整!你這毒婦竟也來了藐吮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤果正,失蹤者是張志新(化名)和其女友劉穎炎码,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秋泳,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡潦闲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迫皱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歉闰。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卓起,靈堂內(nèi)的尸體忽然破棺而出和敬,到底是詐尸還是另有隱情,我是刑警寧澤戏阅,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布昼弟,位于F島的核電站,受9級特大地震影響奕筐,放射性物質(zhì)發(fā)生泄漏舱痘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一离赫、第九天 我趴在偏房一處隱蔽的房頂上張望芭逝。 院中可真熱鬧,春花似錦渊胸、人聲如沸旬盯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胖翰。三九已至,卻和暖如春切厘,著一層夾襖步出監(jiān)牢的瞬間萨咳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工迂卢, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留某弦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓而克,卻偏偏與公主長得像靶壮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子员萍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354