<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
原理:腐蝕用來收縮或細化二值影象中的前景,藉此實現去噪聲、元素分割等功能。和所有形態學濾波器一樣,腐蝕和膨脹這兩個濾波器的作用範圍是由結構元素定義的畫素集。在某個畫素上應用結構元素時,結構元素的錨點與該畫素對齊,所有與結構元素相交的畫素就包含在當前集合中。腐蝕就是把當前畫素替換成所定義畫素集合中的最小畫素值;膨脹是腐蝕的反運算,它把當前畫素替換成所定義畫素集合中的最大畫素值。由於輸入的二值影象只包含黑色(值為0)和白色(值為255)畫素,因此每個畫素都會被替換成白色或黑色畫素。
要形象地理解這兩種運算的作用,可考慮背景(黑色)和前景(白色)的物體。腐蝕時,如果結構元素放到某個畫素位置時碰到了背景(即交集中有一個畫素是黑色的),那麼這個畫素就變為背景;膨脹時,如果結構元素放到某個背景畫素位置時碰到了前景物體,那麼這個畫素就被標為白色。正因如此,影象腐蝕後物體尺寸會縮小(形狀被腐蝕),而影象膨脹後物體會擴大。在腐蝕影象中,有些面積較小的物體(可看作背景中的“噪聲”畫素)會徹底消失。與之類似,膨脹後的物體會變大.而物體中一些“空隙”會被填滿。OpenCV預設使用3×3正方形結構元素。在呼叫函數時,就能得到預設的結構元素。你也可以通過提供一個矩陣來指定結構元素的大小(以及形狀),矩陣中的非零元素將構成結構元素。
作用:去除影象中的某些部分以及會縮小細化目標
CV_EXPORTS_W 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 輸入影象;通道的數量可以是任意的,但是深度值應該是以下之一: CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. dst 和源影象同樣大小和型別的輸出影象。 kernel 用於腐蝕的結構元素;如果element=Mat(),是一個3 x 3的矩形結構元素. Kernel 可以通過使用getStructuringElement來建立。 anchor 素中的錨點的位置,預設是值(-1,-1),也就是說錨點在元素的中心位置。 iterations 腐蝕的迭代次數。 borderType畫素外推方法。參見#BorderTypes, BORDER_WRAP不支援。 borderValue 固定邊緣的情況下的邊緣值。 參考 dilate,morphologyEx,getStructuringElement
Mat cv::getStructuringElement( int shape, Size ksize, Point anchor = Point(-1,-1) ) 引數1:結構元的形狀(0:矩形結構元;1:十字架結構元;2:橢圓結構元); 引數2:結構元大小(size(m, n)); 引數3:結構元中心點所在位置(point(x, y))預設為中心點
Mat element = getStructuringElement(0, Size(3, 3)); //構造矩形結構元素 Mat image_erosion; erode(image_bw, image_erosion, element, Point(-1, -1), 3); //執行腐蝕操作 imshow("image_erosion", image_erosion);
原圖
二值圖
CV腐蝕
void erode_my(Mat &src,Mat &dst,int size) { for (int i = 0; i < src.rows; ++i) { for (int j = 0; j < src.cols; ++j) { uchar minV = 255; //uchar maxV = 0; //遍歷周圍最小畫素值 for (int yi = i - size / 2; yi <= i + size / 2; yi++) { for (int xi = j - size / 2; xi <= j + size / 2; xi++) { if (xi < 0 || xi >= src.cols || yi < 0 || yi >= src.rows) { continue; } minV = (std::min<uchar>)(minV, src.at<uchar>(yi, xi)); //maxV = (std::max<uchar>)(maxV, src.at<uchar>(yi, xi)); } } dst.at<uchar>(i, j) = minV; } } }
自定義腐蝕
erode_my(image_bw, image_erosion_my,9); 當腐蝕結構擴大到9×9時效果基本與cv自帶函數一致。
原理:腐蝕用來收縮或細化二值影象中的前景,藉此實現去噪聲、元素分割等功能。腐蝕過程:用結構元來逐個畫素掃描被腐蝕影象,並根據結構元和被腐蝕影象的關係確定腐蝕結果。
注意,腐蝕操作等形態學操作,是逐個畫素地來確定值的,每次判定的點都與結構元中心點所對應,如果結構元完全處於前景影象中,就將結構元中心點所對應的腐蝕結果影象中的畫素點處理為前景色(如1)。如果結構元不完全處於前景影象中,就將結構元中心點所對應的腐蝕結果影象中的畫素點處理為背景色(如0)。(結構元也被稱為核)
作用:增大影象中的目標,或者填充、連線某些目標。
CV_EXPORTS_W 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 輸入影象;通道的數量可以是任意的,但是深度值應該是以下之一:CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. dst 和源影象同樣大小和型別的輸出影象。 kernel 膨脹核元素,如果elemenat=Mat(), 是一個3 x 3的矩形核元素,核可以使用getStructuringElement來建立。 anchor 元素中的錨點的位置,預設是值(-1,-1),也就是說錨點在元素的中心位置。 iterations 膨脹的迭代次數。 borderType 畫素外推方法。參見#BorderTypes, BORDER_WRAP不支援。 borderValue 固定邊緣的情況下的邊緣值。 參考:erode,morphologyEx,getStructuringElement
//膨脹 Mat element = getStructuringElement(0, Size(3, 3)); //構造矩形結構元素 Mat image_dilate; dilate(image_bw, image_dilate, element, Point(-1, -1), 9); //執行膨脹操作 imshow("image_dilate", image_dilate);
二值圖
CV膨脹
void dilate_my(Mat& src, Mat& dst, int size) { for (int i = 0; i < src.rows; ++i) { for (int j = 0; j < src.cols; ++j) { //uchar minV = 255; uchar maxV = 0; //遍歷周圍最大畫素值 for (int yi = i - size / 2; yi <= i + size / 2; yi++) { for (int xi = j - size / 2; xi <= j + size / 2; xi++) { if (xi < 0 || xi >= src.cols || yi < 0 || yi >= src.rows) { continue; } //minV = (std::min<uchar>)(minV, src.at<uchar>(yi, xi)); maxV = (std::max<uchar>)(maxV, src.at<uchar>(yi, xi)); } } dst.at<uchar>(i, j) = maxV; } } }
自定義膨脹
dilate_my(image_bw, image_dilate_my, 9); 當膨脹結構擴大到9×9時效果基本與cv自帶函數一致。
腐蝕影象相當於對其反色影象膨脹後再取反色;
膨脹影象相當於對其反色影象腐蝕後再取反色。
原理:先腐蝕,再膨脹。
作用:平滑物體輪廓、斷開狹窄的狹頸、消除細長的突出和物體。可以去掉影象上一些小的物件。(假設影象前景色是白色,背景色是黑色)
原圖
//先腐蝕後膨脹 Mat open_image; Mat element = getStructuringElement(0, Size(3, 3)); //構造矩形結構元素 erode(image_bw, image_erosion, element, Point(-1, -1), 3); //執行腐蝕操作 dilate(image_erosion, open_image, element, Point(-1, -1), 3); //執行膨脹操作 imshow("open", open_image);
morphologyEx(image_bw, open_image, MORPH_OPEN, element); imshow("open2", open_image);
原理:先膨脹,再腐蝕。
作用:閉運算可以填充小洞,填充小的噪點。
Mat close_image; Mat element = getStructuringElement(0, Size(3, 3)); //構造矩形結構元素 dilate(image_bw, image_dilate, element, Point(-1, -1), 3); //執行膨脹操作 erode(image_dilate, close_image, element, Point(-1, -1), 3); //執行腐蝕操作 imshow("close", close_image);
morphologyEx(image_bw, close_image, MORPH_CLOSE, element); imshow("close2", close_image);
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() ); (1)引數1:InputArray src 輸入影象,影象資料型別必須為CV_8U, CV_16U, CV_16S, CV_32F or CV_64F中的一種。 (2)引數2:OutputArray dst 輸出影象,資料型別與大小和輸入影象一樣。 (3)引數3:int op 形態學處理的型別: MORPH_ERODE = 0:腐蝕處理 MORPH_DILATE = 1:膨脹處理 MORPH_OPEN = 2:開運算處理 MORPH_CLOSE = 3:閉運算處理 MORPH_GRADIENT = 4:形態學梯度 MORPH_TOPHAT = 5:頂帽變換 MORPH_BLACKHAT = 6:黑帽變換 MORPH_HITMISS = 7 :擊中-擊不中變換 (4)引數4:InputArray kernel結構元矩陣 (5)引數5:Point anchor = Point(-1,-1) 結構元中心點, 預設值Point(-1,-1), 表示正中心 (6)引數6:int iterations = 1 腐蝕膨脹處理的次數,預設值為1; 如果是開運算閉運算,次數表示先腐蝕或者膨脹幾次,再膨脹腐蝕幾次,而不是開運算閉運算幾次: 如開運算且次數為2:erode -> erode -> dilate -> dilate (7)引數7:int borderType = BORDER_CONSTANT 影象邊框插值型別,預設型別為固定值填充 BORDER_CONSTANT = 0:固定值 i 填充:iiiiii | abcdefgh | iiiiiii BORDER_REPLICATE = 1:兩端複製:aaaaaa | abcdefgh | hhhhhhh BORDER_REFLECT = 2:映象複製:fedcba | abcdefgh | hgfedcb BORDER_WRAP = 3:去除一端的值然後複製: cdefgh | abcdefgh | abcdefg BORDER_REFLECT_101 = 4:去除一端的值然後映象複製: gfedcb|abcdefgh|gfedcba BORDER_TRANSPARENT = 5:推導賦值 uvwxyz | abcdefgh | ijklmno BORDER_REFLECT101 = BORDER_REFLECT_101: same as BORDER_REFLECT_101 BORDER_DEFAULT = BORDER_REFLECT_101: same as BORDER_REFLECT_101 BORDER_ISOLATED = 16:< do not look outside of ROI (8)引數8:const Scalar& borderValue = morphologyDefaultBorderValue() 檔案中說明:param borderValue Border value in case of a constant border. The default value has a special meaning.
原理:頂帽(或禮帽)運算是原始影象減去影象開運算的結果。
頂帽運算:原始影象 — 影象開運算
作用:得到影象的噪聲。如下圖所示:
//構造結構元 Mat kernel = getStructuringElement(0, Size(5, 5)); Mat image_lm; //頂帽變換(禮帽變換) morphologyEx(image_bw, image_lm, 5, kernel); cv::imshow("image_lm", image_lm);
Mat image_lm2; //**頂帽運算:原始影象 — 影象開運算** //dst=img1-img2;//這兩個減法效果相同 若dst<0,則dst=0 subtract(image_bw,open_image2, image_lm2);//注意:要求被處理圖片尺寸一致 cv::imshow("image_lm2",image_lm2);
Mat image_lm2; absdiff(image_bw, open_image2, image_lm2);//若dst<0,則dst=|dst|>=0 用於檢測兩幅相似影象的不同點,效果比上面的兩種減法好 cv::imshow("image_lm2", image_lm2);
原理:黑帽運算是影象閉運算操作減去原始影象的結果。
黑帽運算:閉運算 — 原始影象
作用:得到影象內部的小孔,或者前景色中的小黑點。如下圖所示:
//構造結構元 Mat kernel = getStructuringElement(0, Size(5, 5)); //底帽變換(黑帽變換) Mat image_hm; morphologyEx(image_bw, image_hm, 6, kernel); cv::imshow("image_hm", image_hm);
Mat image_hm2; subtract(image_bw, close_image2, image_hm2);//注意:要求被處理圖片尺寸一致 cv::imshow("image_hm2", image_hm2);
Mat image_hm2; absdiff(image_bw, close_image2, image_hm2);//若dst<0,則dst=|dst|>=0 用於檢測兩幅相似影象的不同點,效果比上面的兩種減法好 cv::imshow("image_hm2", image_hm2);
原理:膨脹圖與腐蝕圖之差;
作用:對二值圖進行這一操作可以得到影象中白色區域的邊界,因此可以用形態學梯度來保留物體的邊界輪廓。
//構造結構元 Mat kernel = getStructuringElement(0, Size(5, 5)); Mat image_lm; //形態學梯度 morphologyEx(image_bw, image_td, 4, kernel); cv::imshow("image_td", image_td);
Mat image_tw2; subtract(image_dilate, image_erosion, image_tw2);//注意:要求被處理圖片尺寸一致 cv::imshow("image_tw2", image_tw2);
Mat image_tw2; absdiff(image_dilate, image_erosion, image_tw2);//若dst<0,則dst=|dst|>=0 用於檢測兩幅相似影象的不同點,效果比上面的兩種減法好 cv::imshow("image_tw2", image_tw2);
部分參考來自:數位影像處理(c++ opencv)–持續更新 - 知乎 (zhihu.com)
到此這篇關於OpenCV數位影像處理基於C++之影象形態學處理的文章就介紹到這了,更多相關OpenCV數位影像處理基於C++內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45