【C++ OpenCV】機器視覺-二值圖像和灰度圖像的膨脹、腐蝕、開運算、閉運算

原圖請添加圖片描述

結果圖
請添加圖片描述

//包含頭文件
#include <opencv2/opencv.hpp>//命名空間
using namespace cv;
using namespace std;//全局函數聲明部分//我的腐蝕運算
Mat Erode(Mat src, Mat Mask, uint32_t x0, uint32_t y0)
{uint32_t x = 0, y = 0;Mat dst(src.rows, src.cols, CV_8U, Scalar(0));for (x = 0; x < src.cols; ++x){for (y = 0; y < src.rows; ++y){uint8_t dst_P = 255;for (uint32_t xm = 0; xm < Mask.cols; ++xm){for (uint32_t ym = 0; ym < Mask.rows; ++ym){if (dst_P && Mask.at<uchar>(Point(xm, ym)) && (x + xm) < src.cols && (y + ym) < src.rows)if (dst_P > src.at<uchar>(Point(x + xm, y + ym)))	//尋找最小值dst_P = src.at<uchar>(Point(x + xm, y + ym));}if (!dst_P)break;}if (dst_P && (x + x0) < src.cols && (y + y0) < src.rows)dst.at<uchar>(Point(x + x0, y + y0)) = dst_P;}}return dst;
}//我的膨脹運算
Mat Dilate(Mat src, Mat Mask, uint32_t x0, uint32_t y0)
{uint32_t x = 0, y = 0;Mat dst(src.rows, src.cols, CV_8U, Scalar(0));for (x = 0; x < src.cols; ++x){for (y = 0; y < src.rows; ++y){uint8_t dst_P = 0;for (uint32_t xm = 0; xm < Mask.cols; ++xm){for (uint32_t ym = 0; ym < Mask.rows; ++ym){if (dst_P != 255 && Mask.at<uchar>(Point(xm, ym)) && (x + xm) < src.cols && (y + ym) < src.rows)if (dst_P < src.at<uchar>(Point(x + xm, y + ym)))	//尋找最大值dst_P = src.at<uchar>(Point(x + xm, y + ym));}if (dst_P == 255)break;}if (dst_P && (x + x0) < src.cols && (y + y0) < src.rows)dst.at<uchar>(Point(x + x0, y + y0)) = dst_P;}}return dst;
}//主函數
int main(int argc, char* argv[])
{//【1】載入圖像,灰度化Mat image = imread("2.png", 0);//灰度原圖//【2】檢查是否載入成功if (image.empty()){printf("讀取圖片錯誤,請確認目錄下是否有imread函數指定圖片存在!\n");return 0;}//【3】生成結構元素uint8_t element_a[7][7] ={ 1,	1,	1,	1,	1,	1,	1,1,	1,	1,	1,	1,	1,	1,1,	1,	1,	1,	1,	1,	1,1,	1,	1,	1,	1,	1,	1,1,	1,	1,	1,	1,	1,	1,1,	1,	1,	1,	1,	1,	1,1,	1,	1,	1,	1,	1,	1, };Mat element = Mat(7, 7, CV_8U, element_a);//【4】顯示圖像imshow("原灰度圖像", image);//【5】腐蝕運算Mat erodedImage;erode(image, erodedImage, element);imshow("Opencv的腐蝕運算", erodedImage);imshow("我的腐蝕運算", Erode(image, element, 3, 3));//【6】膨脹運算Mat dilatedImage;dilate(image, dilatedImage, element);imshow("Opencv的膨脹運算", dilatedImage);imshow("我的膨脹運算", Dilate(image, element, 3, 3));//【7】開運算Mat OpenImage;morphologyEx(image, OpenImage, MORPH_OPEN, element);imshow("Opencv的開運算", OpenImage);imshow("我的開運算", Dilate(Erode(image, element, 3, 3), element, 3, 3));	//開運算即先腐蝕再膨脹//【8】閉運算Mat CloseImage;morphologyEx(image, CloseImage, MORPH_CLOSE, element);imshow("Opencv的閉運算", CloseImage);imshow("我的閉運算", Erode(Dilate(image, element, 3, 3), element, 3, 3));	//閉運算即先膨脹再腐蝕//【10】保持窗口顯示waitKey(0);return 0;
}

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

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

相關文章

如何在忘記密碼的情況下重置Realme手機?

歡迎閱讀我們關于如何在有或沒有密碼的情況下重置Realme手機的綜合指南。無論您是忘記了密碼&#xff0c;還是只是需要將設備恢復到出廠設置&#xff0c;我們都會為您提供所需的專業提示和技術專長。 發現分步說明、專家提示和行之有效的方法&#xff0c;輕松重新控制您的 Rea…

Hadoop3:集群壓測-讀寫性能壓測

一、準備工作 首先&#xff0c;我們要知道&#xff0c;平常所說的網速和文件大小的MB是什么關系。 100Mbps單位是bit&#xff1b;10M/s單位是byte ; 1byte8bit&#xff0c;100Mbps/812.5M/s。 測試 配置102、103、104虛擬機網速 102上用Python開啟一個文件下載服務&#x…

Alpha2:使用深度強化學習挖掘公式化的超額收益因子(附論文及源代碼)

原創文章第577篇&#xff0c;專注“AI量化投資、世界運行的規律、個人成長與財富自由"。 今天說說因子挖掘&#xff0c;我們之前交付的Deap遺傳算法因子挖掘&#xff0c;大家可以前往溫習一下&#xff1a; 源碼發布Quantlab4.2&#xff0c;Deap因子挖掘|gplearn做不到的…

【編譯】strip去除符號表

文章目錄 1. 去除符號表2. dbg信息的作用2.1 靜態編譯2.2 動態庫編譯方式 1. 去除符號表 作用&#xff1a;去除符號表可以極大縮小發布的二進制大小&#xff08;有時候可以縮小一半&#xff09; 去除手段共兩種&#xff1a; 直接使用strip命令使用objcopy(更常用&#xff09;…

多線程編程的基本概念,C++標準庫中的多線程支持(std::thread,std::async),如何處理線程同步和并發問題。

多線程編程在現代計算機系統中非常重要&#xff0c;因為它能夠使程序同時執行多個操作&#xff0c;提高計算效率。以下是多線程編程的基本概念及如何在C標準庫中使用std::thread和std::async進行多線程編程&#xff0c;同時處理線程同步和并發問題。 多線程編程的基本概念 線程…

K8S學習教程(二):在 PetaExpress KubeSphere容器平臺部署高可用 Redis 集群

前言 Redis 是在開發過程中經常用到的緩存中間件&#xff0c;為了考慮在生產環境中穩定性和高可用&#xff0c;Redis通常采用集群模式的部署方式。 在制定Redis集群的部署策略時&#xff0c;常規部署在虛擬機上的方式配置繁瑣并且需要手動重啟節點&#xff0c;相較之下&#…

十款絢麗的前端 CSS 菜單導航動畫

CSS漢堡菜單是一種非常流行的PC端和移動端web菜單風格&#xff0c;特別是移動端&#xff0c;這種風格的菜單應用更為廣泛。這款菜單便非常適合在手機App上使用&#xff0c;它的特點是當頂部菜單彈出時&#xff0c;頁面內容將會配合菜單出現適當的聯動&#xff0c;讓整個頁面變得…

關于linux捕捉鼠標事件的方法

網上找了很多方法&#xff0c;都比較雜亂。這篇文章專注于讀取鼠標的動作&#xff1a;左鍵、右鍵、中鍵、滾輪。 linux的設備都以文件形式存放&#xff0c;要讀取鼠標&#xff0c;有兩種方法&#xff0c;一種是通過/dev/input/mice&#xff0c;一種是通過/dev/input/eventx (x…

探索線程安全:HashMap 的四種使用技巧

這篇文章&#xff0c;我們聊聊線程安全使用 HashMap 的四種技巧。 1 方法內部&#xff1a;每個線程使用單獨的 HashMap 如下圖&#xff0c;tomcat 接收到到請求后&#xff0c;依次調用控制器 Controller、服務層 Service 、數據庫訪問層的相關方法。 每次訪問服務層方法 serv…

vue H5頁面video 視頻流自動播放, 解決ios不能自動播放問題

視頻組件 <videostyle"width: 100%; height: 100%;object-fit: fill"class"player"refplayer_big_boxcontrolspreloadautoplay //自動播放muted //是否靜音playsinline"true"x5-playsinline""webkit-playsinline"tru…

[Linux安全運維] Linux用戶以及權限管理

Linux用戶以及權限管理 Linux用戶和組 用戶信息文件pasawd /etc/passwd文件用于存儲用戶的信息 :用于分割不同的字段信息 字段示例&#xff08;第一行&#xff09;含義說明1root用戶名2x密碼占位符x代表用戶有密碼存儲在shadow文件中無內容代表用戶登錄系統不需要密碼30UID…

梧桐數據庫:存算分離和存算一體架構的分布式數據庫技術分析

摘要&#xff1a; 隨著數據量的不斷增長和對數據處理性能的要求越來越高&#xff0c;分布式數據庫技術成為了數據存儲和處理的重要解決方案。存算分離和存算一體是兩種常見的分布式數據庫架構&#xff0c;它們在數據存儲和計算方面有著不同的特點和優勢。本文將對存算分離和存算…

Spring源碼(一) 如何閱讀 Spring 源碼

學習 Spring 的源碼&#xff0c;也可以通過 SpringBoot 搭環境。 不管是什么源碼&#xff0c;最好寫個 demo&#xff0c;跑起來&#xff0c;然后從常用的類和方法入手&#xff0c;跟蹤調試。 配置對象 新建一個 SpringBoot 的項目&#xff0c; 詳情見&#xff1a; https://b…

FreeRTOS 中 vListInsertEnd 函數詳解

在 FreeRTOS 中&#xff0c;vListInsertEnd 函數用于將新項插入到指定列表的尾部&#xff08;但實際行為是插入到一個特定的索引位置之前&#xff09;。FreeRTOS 使用雙向鏈表&#xff08;doubly linked list&#xff09;來管理任務和其他系統對象&#xff0c;這樣可以高效地插…

前端三件套開發模版——產品介紹頁面

今天有空&#xff0c;使用前端三件套html、css、js制作了一個非常簡單的產品制作頁面&#xff0c;與大家分享&#xff0c;希望可以滿足大家應急的需求。本頁面可以對產品進行“搶購”、對產品進行介紹&#xff0c;同時可以安排一張產品的高清大圖&#xff0c;我也加入了頁面的背…

JAVA實現二分查找,斐波那契數列,深度優先搜索詳情教程【包含代碼】

本人詳解 作者:王文峰,參加過 CSDN 2020年度博客之星,《Java王大師王天師》 公眾號:JAVA開發王大師,專注于天道酬勤的 Java 開發問題中國國學、傳統文化和代碼愛好者的程序人生,期待你的關注和支持!本人外號:神秘小峯 山峯 轉載說明:務必注明來源(注明:作者:王文峰…

react+ts+antd項目搭建

前言&#xff1a; 基于ts語言創建react項目&#xff0c;node版本是v16.14.2 一、 腳手架創建項目 全局安裝 npm install -g creacte-react-app創建項目file-management&#xff0c;ts需要添加–template typescript npx create-react-app file-management --template typesc…

Ubuntu查看opencv版本c++

?命令行中直接輸入&#xff1a; pkg-config --modversion opencv?命令行中直接輸入&#xff1a; pkg-config --modversion opencv4注解&#xff1a;附上在markdown中打勾&#xff0c;對號和打叉。使用時將&和#之間的空格去掉&#xff0c;這里只是為了不讓CSDN自動轉換才…

Ubuntu20.04 c++程序 涉及opencv問題記錄

頭文件更改 默認的頭文件引用是 #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp>但是在ubuntu20中/usr/include中默認的是opencv4&#xff0c;他文件夾里面才是opencv2&#xff0c;需要…

vue3單個頁面進行防抖節流

防抖 <template><button id"submitButton" ref"submitButton">GET</button> </template><script lang"ts" setup> import { ref, onMounted } from vue;// 防抖函數 function debounce(func: () > void, dela…