最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenCV清除小面積連通域的實現(xiàn)方法

 更新時間:2021年09月06日 08:48:06   作者:翟天保Steven  
本文主要介紹了OpenCV清除小面積連通域的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

場景需求

       使用OpenCV,往往遇到這類場景:需要清除目標(biāo)圖像中比較小的噪聲區(qū),保留主要區(qū)域信息。

       特此分享自己寫的一個簡單的清除小面積連通域函數(shù),邏輯比較簡單,給大家留出了足夠的發(fā)展空間,根據(jù)自身場景需求進行調(diào)整。

       原理可以簡單歸結(jié)為:搜索圖像的連通區(qū)輪廓->遍歷各個連通區(qū)->基于閾值刪除面積較小的連通區(qū)

       運行速度方面,我沒單獨測試過這個單元,大家如果試過之后太慢可以評論告訴我哦~

       反正平常我工作跑那種2000*2000的圖像,這個函數(shù)的耗時幾乎忽略不計。。。

C++實現(xiàn)代碼

/**
* @brief  Clear_MicroConnected_Areas         清除微小面積連通區(qū)函數(shù)
* @param  src                                輸入圖像矩陣
* @param  dst                                輸出結(jié)果
* @return min_area                           設(shè)定的最小面積清除閾值
*/
void Clear_MicroConnected_Areas(cv::Mat src, cv::Mat &dst, double min_area)
{
	// 備份復(fù)制
	dst = src.clone();
	std::vector<std::vector<cv::Point> > contours;  // 創(chuàng)建輪廓容器
	std::vector<cv::Vec4i> 	hierarchy;  
 
	// 尋找輪廓的函數(shù)
	// 第四個參數(shù)CV_RETR_EXTERNAL,表示尋找最外圍輪廓
	// 第五個參數(shù)CV_CHAIN_APPROX_NONE,表示保存物體邊界上所有連續(xù)的輪廓點到contours向量內(nèi)
	cv::findContours(src, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE, cv::Point());
 
	if (!contours.empty() && !hierarchy.empty()) 
	{
		std::vector<std::vector<cv::Point> >::const_iterator itc = contours.begin();
		// 遍歷所有輪廓
		while (itc != contours.end()) 
		{
			// 定位當(dāng)前輪廓所在位置
			cv::Rect rect = cv::boundingRect(cv::Mat(*itc));
			// contourArea函數(shù)計算連通區(qū)面積
			double area = contourArea(*itc);
			// 若面積小于設(shè)置的閾值
			if (area < min_area) 
			{
				// 遍歷輪廓所在位置所有像素點
				for (int i = rect.y; i < rect.y + rect.height; i++) 
				{
					uchar *output_data = dst.ptr<uchar>(i);
					for (int j = rect.x; j < rect.x + rect.width; j++) 
					{
						// 將連通區(qū)的值置0
						if (output_data[j] == 255) 
						{
							output_data[j] = 0;
						}
					}
				}
			}
			itc++;
		}
	}
}

測試代碼

#include<iostream>
#include<opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
void Clear_MicroConnected_Areas(cv::Mat src, cv::Mat &dst, double min_area);
 
int main(void)
{
	Mat A = Mat::zeros(500, 500, CV_8UC1);
	circle(A, Point2i(100, 100), 50, 255, -1);
	circle(A, Point2i(300, 400), 15, 255, -1);
	Mat B;
	Clear_MicroConnected_Areas(A, B, 1000);
 
	imshow("before:A", A);
	imshow("after:B", B);
	waitKey(0);
 
	system("pause");
	return 0;
}
 
void Clear_MicroConnected_Areas(cv::Mat src, cv::Mat &dst, double min_area)
{
	// 備份復(fù)制
	dst = src.clone();
	std::vector<std::vector<cv::Point> > contours;  // 創(chuàng)建輪廓容器
	std::vector<cv::Vec4i> 	hierarchy;  
 
	// 尋找輪廓的函數(shù)
	// 第四個參數(shù)CV_RETR_EXTERNAL,表示尋找最外圍輪廓
	// 第五個參數(shù)CV_CHAIN_APPROX_NONE,表示保存物體邊界上所有連續(xù)的輪廓點到contours向量內(nèi)
	cv::findContours(src, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE, cv::Point());
 
	if (!contours.empty() && !hierarchy.empty()) 
	{
		std::vector<std::vector<cv::Point> >::const_iterator itc = contours.begin();
		// 遍歷所有輪廓
		while (itc != contours.end()) 
		{
			// 定位當(dāng)前輪廓所在位置
			cv::Rect rect = cv::boundingRect(cv::Mat(*itc));
			// contourArea函數(shù)計算連通區(qū)面積
			double area = contourArea(*itc);
			// 若面積小于設(shè)置的閾值
			if (area < min_area) 
			{
				// 遍歷輪廓所在位置所有像素點
				for (int i = rect.y; i < rect.y + rect.height; i++) 
				{
					uchar *output_data = dst.ptr<uchar>(i);
					for (int j = rect.x; j < rect.x + rect.width; j++) 
					{
						// 將連通區(qū)的值置0
						if (output_data[j] == 255) 
						{
							output_data[j] = 0;
						}
					}
				}
			}
			itc++;
		}
	}
}

測試效果

 

圖1 處理前后圖

到此這篇關(guān)于OpenCV-清除小面積連通域的文章就介紹到這了,更多相關(guān)OpenCV-清除小面積連通域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python創(chuàng)造虛擬環(huán)境方法總結(jié)

    python創(chuàng)造虛擬環(huán)境方法總結(jié)

    在本篇內(nèi)容里我們給大家整理了關(guān)于python創(chuàng)造虛擬環(huán)境的詳細方法和步驟,需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • Python中的Sequence類型使用實例

    Python中的Sequence類型使用實例

    這篇文章主要為大家介紹了Python中的Sequence類型使用實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • python實現(xiàn)屏保計時器的示例代碼

    python實現(xiàn)屏保計時器的示例代碼

    這篇文章主要介紹了python實現(xiàn)屏保計時器的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • python遞歸全排列實現(xiàn)方法

    python遞歸全排列實現(xiàn)方法

    這篇文章主要為大家詳細介紹了python遞歸全排列實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Python簡單幾步畫個鉆石戒指

    Python簡單幾步畫個鉆石戒指

    這篇文章主要介紹了Python簡單幾步畫個鉆石戒指,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • Python異步與定時任務(wù)提高程序并發(fā)性和定時執(zhí)行效率

    Python異步與定時任務(wù)提高程序并發(fā)性和定時執(zhí)行效率

    Python異步與定時任務(wù)是Python編程中常用的兩種技術(shù),異步任務(wù)可用于高效處理I/O密集型任務(wù),提高程序并發(fā)性;定時任務(wù)可用于定時執(zhí)行計劃任務(wù),提高程序的執(zhí)行效率。這兩種技術(shù)的應(yīng)用有助于提升Python程序的性能和效率
    2023-05-05
  • 在Python下使用Txt2Html實現(xiàn)網(wǎng)頁過濾代理的教程

    在Python下使用Txt2Html實現(xiàn)網(wǎng)頁過濾代理的教程

    這篇文章主要介紹了在Python下使用Txt2Html實現(xiàn)網(wǎng)頁過濾代理的教程,來自IBM官方開發(fā)者技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • Python?中的?Counter?模塊及使用詳解(搞定重復(fù)計數(shù))

    Python?中的?Counter?模塊及使用詳解(搞定重復(fù)計數(shù))

    Counter 是一個簡單的計數(shù)器,用于統(tǒng)計某些可哈希對象的數(shù)量。它以字典的形式存儲元素和它們的計數(shù),這篇文章主要介紹了Python?中的?Counter?模塊及使用詳解(搞定重復(fù)計數(shù)),需要的朋友可以參考下
    2023-04-04
  • Python中的字符串切片(截取字符串)的詳解

    Python中的字符串切片(截取字符串)的詳解

    這篇文章主要介紹了Python中的字符串切片(截取字符串)的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • python進階之魔術(shù)方法詳解

    python進階之魔術(shù)方法詳解

    這篇文章主要為大家介紹了python進階之魔術(shù)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評論

垦利县| 辰溪县| 剑阁县| 诸暨市| 博白县| 舒城县| 襄城县| 资兴市| 常宁市| 广东省| 康保县| 乌鲁木齐县| 新巴尔虎右旗| 罗田县| 龙泉市| 绥宁县| 陇西县| 白河县| 西城区| 葵青区| 互助| 沅陵县| 灵丘县| 偏关县| 牙克石市| 宁乡县| 容城县| 田阳县| 莱西市| 定边县| 太湖县| 洛隆县| 荣昌县| 台中市| 星子县| 大港区| 靖边县| 水城县| 阆中市| 项城市| 泌阳县|