OpenCV:九沼头、形態(tài)學(xué)操作(膨脹與腐蝕)

前言

在上一章中描述了如何進(jìn)行圖像模糊曙蒸,詳細(xì)描述可點擊查看(http://www.reibang.com/writer#/notebooks/47386368/notes/77175002)

目標(biāo)

本章中瓷们,將學(xué)習(xí)如何:

  • 什么是膨脹與腐蝕
  • 形態(tài)學(xué)處理——膨脹
  • 形態(tài)學(xué)處理——腐蝕
  • 動態(tài)調(diào)整結(jié)構(gòu)元素大小
  • 代碼演示

什么是膨脹與腐蝕

  • 膨脹與腐蝕屬于形態(tài)學(xué)范疇孝治,具體的含義根據(jù)字面意思來理解即可胞谈。用更形象的話就是“增肥”與“減肥”填具。他們的運用廣泛:消除噪聲;分割(isolate)獨立的圖像元素艰额、澄港、連接(join)相鄰的元素以及尋找圖像中明顯的極大值區(qū)域或極小值區(qū)域。

形態(tài)學(xué)處理——膨脹

  • 相關(guān)AIP:
    void dilate( InputArray src, OutputArray dst, InputArray kernel,
    Point anchor = Point(-1,-1), int iterations = 1,
    int borderType = BORDER_CONSTANT,
    const Scalar& borderValue = morphologyDefaultBorderValue() );


    數(shù)學(xué)公式.png
  • 跟卷積操作類似柄沮,假設(shè)有圖像A和結(jié)構(gòu)元素B回梧,結(jié)構(gòu)元素B在A上面移動,其中B定義其中心為錨點祖搓,計算B覆蓋下A的最大像素值用來替換錨點的像素狱意,其中B作為結(jié)構(gòu)體可以是任意形狀。形態(tài)學(xué)操作——膨脹(感官上圖像黑色部分變細(xì))


    膨脹處理效果圖.png

形態(tài)學(xué)處理——腐蝕

  • 相關(guān)AIP:
    void erode( InputArray src, OutputArray dst, InputArray kernel,
    Point anchor = Point(-1,-1), int iterations = 1,
    int borderType = BORDER_CONSTANT,
    const Scalar& borderValue = morphologyDefaultBorderValue() );


    數(shù)學(xué)公式.png
  • 腐蝕跟膨脹操作的過程類似拯欧,唯一不同的是以最小值替換錨點重疊下圖像的像素值详囤。形態(tài)學(xué)處理——腐蝕(感官上圖像黑色部分變粗)


    腐蝕處理效果圖.png

動態(tài)調(diào)整結(jié)構(gòu)元素大小

TrackBar - createTrackbar(const String & trackbarname, const String winName, int* value, int count, Trackbarcallback func, void* userdata=0)
其中最中要的是 callback 函數(shù)功能。如果設(shè)置為NULL就是說只有值update镐作,但是不會調(diào)用callback的函數(shù)藏姐。

代碼演示

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>

using namespace cv;
using namespace std;

Mat src, erode_dst, dilate_dst;
char dilate_Win[] = "Dilation windows", erode_Win[] = "Erosion windows";
int dilat_element = 0, erode_element = 0;
int dilate_size = 0, erode_size = 0;
int const MAX_ELEMENT = 2;
int const MAX_KERNEL_SIZE = 21;

void dilation(int, void*);
void erosion(int, void*);

int main(int argc, char* argv[])
{
    //  1、加載圖像滑肉,可以是BGR或者灰度圖像
    src = imread("D:/瀏覽器下載/谷歌下載/lena512color.tiff");
    if (!src.data) {
        printf("could not load image...\n");
        return -1;
    }
    char input_win[] = "input image";
    namedWindow(input_win, WINDOW_AUTOSIZE);
    imshow(input_win, src);
    // 2包各、創(chuàng)建兩個窗口(一個用于膨脹dilation摘仅,另一個用于erosion)
    // 每次移動任何滑塊時靶庙,都會調(diào)用dilation或erosion函數(shù),它將根據(jù)當(dāng)前的trackbar值更新輸出圖像
    namedWindow(dilate_Win, WINDOW_AUTOSIZE);
    namedWindow(erode_Win, WINDOW_AUTOSIZE);
        // 3娃属、為每個操作創(chuàng)建兩組滑塊
    // 3.1 第一個滑塊返回dilat_element或erode_element
    createTrackbar("卷積核類型:", dilate_Win, &dilat_element, MAX_ELEMENT, dilation);
    // 3.2 第二個滑塊返回dilate_size或erode_size
    createTrackbar("卷積核大小:", dilate_Win, &dilate_size, MAX_KERNEL_SIZE, dilation);
    createTrackbar("卷積核類型:", erode_Win, &erode_element, MAX_ELEMENT, erosion);
    createTrackbar("卷積核大小:", erode_Win, &erode_size, MAX_KERNEL_SIZE, erosion);
    dilation(0, 0);
    erosion(0, 0);
    waitKey(0);
    return 0;
}
// 膨脹
void dilation(int, void*)
{
    int dilate_type;    // 內(nèi)核選擇三中形狀中的任何一種
    if (0 == dilat_element){ dilate_type = MORPH_RECT; }
    else if (1 == dilat_element){ dilate_type = MORPH_CROSS; }
    else if (2 == dilat_element){ dilate_type = MORPH_ELLIPSE; }
    int s = dilate_size * 2 + 1;
    Mat kernel = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));  // 獲取結(jié)構(gòu)元素
    dilate(src, dilate_dst, kernel, Point(-1, -1), dilate_type);
    imshow(dilate_Win, dilate_dst);
    return;
}

// 腐蝕
void erosion(int, void*)
{
    int erosion_type;   // 內(nèi)核選擇三中形狀中的任何一種
    if (0 == erode_element){ erosion_type = MORPH_RECT; }
    else if (1 == erode_element){ erosion_type = MORPH_CROSS; }
    else if (2 == erode_element){ erosion_type = MORPH_ELLIPSE; }
    int s = erode_size * 2 + 1;
    Mat kernel = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));  // 獲取結(jié)構(gòu)元素
    erode(src, erode_dst, kernel, Point(-1, -1), erosion_type);
    imshow(erode_Win, erode_dst);
    return;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末六荒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子矾端,更是在濱河造成了極大的恐慌掏击,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秩铆,死亡現(xiàn)場離奇詭異砚亭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)殴玛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門捅膘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滚粟,你說我怎么就攤上這事寻仗。” “怎么了凡壤?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵署尤,是天一觀的道長耙替。 經(jīng)常有香客問我,道長曹体,這世上最難降的妖魔是什么俗扇? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮混坞,結(jié)果婚禮上狐援,老公的妹妹穿的比我還像新娘。我一直安慰自己究孕,他們只是感情好啥酱,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厨诸,像睡著了一般镶殷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上微酬,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天绘趋,我揣著相機(jī)與錄音,去河邊找鬼颗管。 笑死陷遮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垦江。 我是一名探鬼主播帽馋,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼比吭!你這毒婦竟也來了绽族?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤衩藤,失蹤者是張志新(化名)和其女友劉穎吧慢,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赏表,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡检诗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓢剿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逢慌。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跋选,靈堂內(nèi)的尸體忽然破棺而出涕癣,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布坠韩,位于F島的核電站距潘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏只搁。R本人自食惡果不足惜音比,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氢惋。 院中可真熱鬧洞翩,春花似錦、人聲如沸焰望。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熊赖。三九已至来屠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間震鹉,已是汗流浹背俱笛。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留传趾,地道東北人迎膜。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像浆兰,于是被迫代替她去往敵國和親磕仅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350