6.RV1126-OPENCV 形態學基礎膨脹及腐蝕

一.膨脹

1.膨脹原理

? ? ? ? 膨脹的本質就是通過微積分的轉換,將圖像A和圖形B進行卷積操作合并成一個A+B圖像就是指任意的形狀或者大小的圖形B。例如下圖,將核(也就是圖形B)通過微積分卷積,和圖像A合并成一個圖像A+B。

2.特點

  • 圖像就會更加明亮????
  • 圖像就會更加粗糙

如下圖所示:?

?

?3.膨脹的API

  • 處理圖像膨脹的API:void dilate( InputArray src, OutputArray dst, InputArray kernel, Point anchor, int iterations, int borderType, const Scalar&borderValue )

第一個參數:src 的類型是 InputArray,它指的是輸入圖像,它可以是 Mat 類的數據。圖像的通道數可以是任意數,但是圖像的深度一般是 CV_8U,CV_16U,CV_16S,CV_32F,CV_64F
第二個參數:dst 的類型是 OutputArray,它指的是目標圖像(輸出圖像),值得注意的是輸出圖像的尺寸、類型要和輸入圖像是一致的。
第三個參數:InputArray 類型的 kernel,膨脹操作的核(可以理解為輸入圖形B)。當這個值為 NULL 的時候,表示使用的核參考點默認是 3*3。這個參數通常會配合 getStructingElement 參數的使用(這個參數的使用,下面我會詳細說到)。
第四個參數:Point 類型的 anchor,描點的位置,默認是(-1,-1),表示中心位置。
第五個參數:int 類型的迭代次數,默認是 1
第六個參數:int 類型的 borderType,這個類型用于推斷圖像外部的邊界模式,用的最多的是 BORDER_DEFAULT
下面是常用的幾種邊框模式(這幾種相對比較常用,其他的用的很少)
BORDER_CONSTANT:用指定的像素填充邊框
BORDER_REPLICATE:用已知的邊緣像素來填充邊框
BORDER_WRAP:用另一邊的像素來補償填充
BORDER_DEFAULT:默認模式畫邊框
BORDER_TRANSPANT: 用透明的方式畫框
第七個參數:const Scalar 類型的 borderType,一般不用填寫,因為這個 API 已經有了默認值 morphologyDefaultBorderValue()

  • 獲取核(圖形B)的API: CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

?第一個參數:表示內核的形狀(就是圖形B是以什么形狀放在圖像A上的),這里包括了:矩形(MORPH_RECT)、交叉形(MORPH_CROSS)、橢圓形(MORPH_ELLIPSE),常用的內核形狀是矩形
第二個參數:內核的尺寸
第三個參數:錨點的位置,默認值 Point(-1,-1),表示的是位于中心點

4.?代碼實戰:實現圖像膨脹功能

(1)功能實現的步驟:imread 讀取圖片、使用 cvtColor 對圖片進行灰度操作、使用 getStructingElement 獲取卷積層(也就是獲取圖形B)、使用 dilate 對圖片進行膨脹(將A和B合并)、imwrite 保存圖片。流程圖如下:

(2)代碼如下:

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat testImage = imread("zjl.jpg");//讀取圖片if(testImage.empty()){printf("read testImage failed....\n");}Mat vertical_structure = getStructuringElement(MORPH_CROSS, Size(20,20));//創建一個20*20的十字形結構元素dilate(testImage, testImage, vertical_structure);//膨脹操作,testImage為輸入圖像,testImage為輸出圖像,vertical_structure為核imwrite("zjl1.jpg", testImage);//保存圖片return 0;
}

(3)效果如下:上圖是MORPH_CROSS(十字交叉的核),下圖是MORPH_RECT(矩形核)效果圖。

?二.腐蝕

1.腐蝕原理

? ? ? ? 原理和膨脹一樣,腐蝕就是膨脹的反向操作,膨脹是把圖像圖像變大,而腐蝕就是把圖像變小。

2.特點

  • 圖像更加細小
  • 黑暗背景部分會更加大

3.腐蝕的API

  • ?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 的類型是 InputArray,它指的是輸入圖像,它可以是 Mat 類的數據。圖像的通道數可以是任意數,但是圖像的深度一般是 CV_8U,CV_16U,CV_16S,CV_32F,CV_64F
第二個參數:dst 的類型是 OutputArray,它指的是目標圖像(輸出圖像),值得注意的是輸出圖像的尺寸、類型要和輸入圖像是一致的。
第三個參數:InputArray 類型的 kernel,膨脹操作的核。當這個值為 NULL 的時候,表示使用的核參考點默認是 3*3。這個參數通常會配合 getStructingElement 參數的使用(這個參數的使用,下面我會詳細說到)。
第四個參數:Point 類型的 anchor,描點的位置,默認是(-1,-1),表示中心位置。
第五個參數:int 類型的迭代次數,默認是 1
第六個參數:int 類型的 borderType,這個類型用于推斷圖像外部的邊界模式,它的默認值是 BORDER_DEFAULT
第七個參數:const Scalar 類型的 borderType,一般不用填寫,因為這個 API 已經有了默認值 morphologyDefaultBorderValue()

  • ?CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

第一個參數:表示內核的形狀,這里包括了:矩形(MORPH_RECT)、交叉(MORPH_CROSS)、橢圓形(MORPH_ELLIPSE)
第二個參數:內核的尺寸
第三個參數:錨點的位置,默認值 Point(-1,-1),表示的是位于中心點

?4.代碼實戰:實現圖像腐蝕功能

(1)功能實現的步驟:imread 讀取圖片、使用 cvtColor 對圖片進行灰度操作、使用 getStructingElement 獲取卷積層(也就是獲取圖形B)、使用 erode 對圖片進行腐蝕、imwrite 保存圖片。流程圖如下:?

(2)代碼如下:?

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat testImage = imread("zjl.jpg");//讀取圖片if(testImage.empty()){printf("could not load image.....\n");return -1;}Mat vertical_structure = getStructuringElement(MORPH_RECT, Size(15,15));//獲取核圖形erode(testImage, testImage, vertical_structure);//腐蝕操作imwrite("zjl2.jpg", testImage);//保存圖片return 0;
}

(3)效果如下:上圖是MORPH_CROSS(十字交叉的核),下圖是MORPH_RECT(矩形核)效果圖。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908176.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908176.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908176.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習實戰37-基于情感字典和機器學習的股市輿情分析可視化系統

文章目錄 一、項目背景數字時代情感分析情況二、項目流程1.數據采集與預處理2.復合情感分析模型構建3.輿情分析可視化:三、機器學習算法原理1.支持向量機基礎2.核函數與高維映射3.情感分類特征融合4.模型訓練與優化四、實現代碼五、系統特點與優勢1.復合情感分析模型2.多維度可…

STM32F407VET6學習筆記9:編譯輸出固定大小.bin文件

今日學習如何輸出固定大小的.bin編譯文件 目錄 Keil_V5 fromelf.exe 軟件目錄&#xff1a; 魔棒添加命令輸出bin文件&#xff1a; 輸出固定大小的bin文件&#xff1a; 計算bin文件大小&#xff1a; 安裝 SRecord 工具集&#xff1a; 使用SRecord&#xff1a; 參考文章&#…

【Web應用】若依框架:基礎篇14 源碼閱讀-后端代碼分析

文章目錄 ?前言?一、課程講解?總結 標題詳情作者JosieBook頭銜CSDN博客專家資格、阿里云社區專家博主、軟件設計工程師博客內容開源、框架、軟件工程、全棧&#xff08;,NET/Java/Python/C&#xff09;、數據庫、操作系統、大數據、人工智能、工控、網絡、程序人生口號成為你…

Java 單例模式詳解

目錄 1. 餓漢式&#xff08;Eager Initialization&#xff09; 2. 懶漢式&#xff08;Lazy Initialization&#xff09; 3. 懶漢式 同步鎖&#xff08;線程安全&#xff09; 4. 雙重檢查鎖&#xff08;Double-Checked Locking&#xff09; 5. 靜態內部類&#xff08;推薦…

從 AMQP 到 RabbitMQ:核心組件設計與工作原理(一)

一、引言 ** 在當今分布式系統盛行的時代&#xff0c;消息隊列作為一種關鍵的中間件技術&#xff0c;承擔著系統間異步通信、解耦和削峰填谷的重要職責。AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;作為一種高級消息隊列協議&#xff0c;為消息隊列的實現…

概率單純形(Probability Simplex)

目錄 定義性質在統計學中的應用在機器學習中的應用在信息論中的應用在優化問題中的應用在其他領域的應用 定義 定義&#xff1a;在數學中&#xff0c;概率單純形&#xff08;Probability Simplex&#xff09;是指在 n n n維空間中&#xff0c;所有分量非負且分量之和為1的向量…

項目練習:Vue2中el-button上的@click事件失效

文章目錄 一、問題描述二、解決 一、問題描述 button按鈕上綁定了一個click事件 對應的方法寫在methods中 但是&#xff0c;測試點擊時&#xff0c;無法觸發函數 二、解決 1、問題代碼 <el-buttonclick"changeConfirm(Y)"type"success"plainicon&qu…

十六、【前端強化篇】完善 TestCase 編輯器:支持 API 結構化定義與斷言配置

【前端強化篇】完善 TestCase 編輯器:支持 API 結構化定義與斷言配置 前言準備工作第一步:更新前端 `TestCase` 類型定義第二步:改造 `TestCaseEditView.vue` 表單第三步:修改后端代碼中的TestCase模型和序列化器第四步:測試強化后的用例編輯器總結前言 在之前的后端文章…

HTTP連接管理——短連接,長連接,HTTP 流水線

連接管理是一個 HTTP 的關鍵話題&#xff1a;打開和保持連接在很大程度上影響著網站和 Web 應用程序的性能。在 HTTP/1.x 里有多種模型&#xff1a;短連接、_長連接_和 HTTP 流水線。 下面分別來詳細解釋 短連接 HTTP 協議最初&#xff08;0.9/1.0&#xff09;是個非常簡單的…

MySQL范式和反范式

范式 是用一組規則定義的數據庫設計標準&#xff0c;旨在確保數據庫結構合理&#xff0c;避免數據冗余和異常。 目的 消除數據的重復&#xff0c;提高存儲效率防止數據異常&#xff08;插入、刪除、更新異常&#xff09;提高數據的完整性和一致性 第一范式 定義 所有列&am…

編程技能:格式化打印04,sprintf

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;編程技能&#xff1a;格式化打印03&#xff0c;printf 回到目錄…

JavaScript性能優化實戰:深入探討JavaScript性能瓶頸與優化技巧

引言:為什么JavaScript性能至關重要 在現代Web開發中,JavaScript已成為構建交互式應用程序的核心技術。隨著單頁應用(SPA)和復雜前端架構的普及,JavaScript代碼的性能直接影響用戶體驗、轉化率甚至搜索引擎排名。研究表明,頁面加載時間每增加1秒,轉化率可能下降7%,而性能…

Java數據結構——八大排序

排序 插?排序希爾排序直接選擇排序堆排序冒泡排序快速排序歸并排序計數排序 排序的概念 排序&#xff1a;就是將一串東西&#xff0c;按照要求進行排序&#xff0c;按照遞增或遞減排序起來 穩定性&#xff1a;就是比如排序中有兩個相同的數&#xff0c;如果排序后&#xff0c…

WPF響應式UI的基礎:INotifyPropertyChanged

INotifyPropertyChanged 1 實現基礎接口2 CallerMemberName優化3 數據更新觸發策略4 高級應用技巧4.1 表達式樹優化4.2 性能優化模式4.3 跨平臺兼容實現 5 常見錯誤排查 在WPF的MVVM架構中&#xff0c; INotifyPropertyChanged是實現數據驅動界面的核心機制。本章將深入解析屬…

低空城市場景下的多無人機任務規劃與動態協調!CoordField:無人機任務分配的智能協調場

作者&#xff1a;Tengchao Zhang 1 ^{1} 1 , Yonglin Tian 2 ^{2} 2 , Fei Lin 1 ^{1} 1, Jun Huang 1 ^{1} 1, Patrik P. Sli 3 ^{3} 3, Rui Qin 2 , 4 ^{2,4} 2,4, and Fei-Yue Wang 5 , 1 ^{5,1} 5,1單位&#xff1a; 1 ^{1} 1澳門科技大學創新工程學院工程科學系&#xff0…

解決Java項目NoProviderFoundException報錯

前言 在Java開發中&#xff0c;jakarta.validation.NoProviderFoundException 是一個令人困惑的運行時錯誤&#xff0c;常因校驗框架依賴缺失或版本沖突導致。 問題復現&#xff1a;用戶注冊校驗失敗 業務場景 開發一個用戶注冊功能&#xff0c;要求&#xff1a; 校驗郵箱…

重構跨境收益互換價值鏈:新一代TRS平臺的破局之道

當香港券商面對內地洶涌的結構化產品需求&#xff0c;一套智能化的TRS系統正成為打開萬億市場的金鑰匙 在跨境金融的暗流涌動中&#xff0c;一家中資背景的香港券商正面臨甜蜜的煩惱&#xff1a;內地高凈值客戶對港股、美股的杠桿交易需求激增&#xff0c;但傳統TRS業務深陷操作…

實驗設計如何拯救我的 CEI VSR 28G 設計

為了確定總體設計裕量&#xff0c;CEI 28G VSR/100 Gb 以太網設計需要分析 500 萬種通道變化、收發器工藝和均衡設置的組合。蠻力模擬需要 278 天&#xff0c;這顯然超出了可用的時間表。 相反&#xff0c;我們使用實驗設計 &#xff08;DOE&#xff09; 和響應面建模 &#x…

【仿生機器人】刀劍神域——愛麗絲蘇醒計劃,需求文檔

仿生機器人"愛麗絲"系統架構設計需求文檔 一、硬件基礎 已完成頭部和頸部硬件搭建 25個舵機驅動表情系統 頸部旋轉功能 眼部攝像頭&#xff08;視覺輸入&#xff09; 麥克風陣列&#xff08;聽覺輸入&#xff09; 頸部發聲裝置&#xff08;語音輸出&#xff09…

【Day44】

DAY 44 預訓練模型 知識點回顧&#xff1a; 預訓練的概念常見的分類預訓練模型圖像預訓練模型的發展史預訓練的策略預訓練代碼實戰&#xff1a;resnet18 作業&#xff1a; 嘗試在cifar10對比如下其他的預訓練模型&#xff0c;觀察差異&#xff0c;盡可能和他人選擇的不同嘗試通…