濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > OpenCV清除小面積連通域的實(shí)現(xiàn)方法

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

熱門(mén)標(biāo)簽:鶴壁手機(jī)自動(dòng)外呼系統(tǒng)違法嗎 怎么辦理400客服電話 B52系統(tǒng)電梯外呼顯示E7 沈陽(yáng)防封電銷(xiāo)電話卡 銀川電話機(jī)器人電話 企業(yè)微信地圖標(biāo)注 高德地圖標(biāo)注收入咋樣 地圖標(biāo)注多個(gè) 萊蕪電信外呼系統(tǒng)

場(chǎng)景需求

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

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

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

       運(yùn)行速度方面,我沒(méi)單獨(dú)測(cè)試過(guò)這個(gè)單元,大家如果試過(guò)之后太慢可以評(píng)論告訴我哦~

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

C++實(shí)現(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::vectorstd::vectorcv::Point> > contours;  // 創(chuàng)建輪廓容器
	std::vectorcv::Vec4i> 	hierarchy;  
 
	// 尋找輪廓的函數(shù)
	// 第四個(gè)參數(shù)CV_RETR_EXTERNAL,表示尋找最外圍輪廓
	// 第五個(gè)參數(shù)CV_CHAIN_APPROX_NONE,表示保存物體邊界上所有連續(xù)的輪廓點(diǎn)到contours向量?jī)?nèi)
	cv::findContours(src, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE, cv::Point());
 
	if (!contours.empty()  !hierarchy.empty()) 
	{
		std::vectorstd::vectorcv::Point> >::const_iterator itc = contours.begin();
		// 遍歷所有輪廓
		while (itc != contours.end()) 
		{
			// 定位當(dāng)前輪廓所在位置
			cv::Rect rect = cv::boundingRect(cv::Mat(*itc));
			// contourArea函數(shù)計(jì)算連通區(qū)面積
			double area = contourArea(*itc);
			// 若面積小于設(shè)置的閾值
			if (area  min_area) 
			{
				// 遍歷輪廓所在位置所有像素點(diǎn)
				for (int i = rect.y; i  rect.y + rect.height; i++) 
				{
					uchar *output_data = dst.ptruchar>(i);
					for (int j = rect.x; j  rect.x + rect.width; j++) 
					{
						// 將連通區(qū)的值置0
						if (output_data[j] == 255) 
						{
							output_data[j] = 0;
						}
					}
				}
			}
			itc++;
		}
	}
}

測(cè)試代碼

#includeiostream>
#includeopencv2/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::vectorstd::vectorcv::Point> > contours;  // 創(chuàng)建輪廓容器
	std::vectorcv::Vec4i> 	hierarchy;  
 
	// 尋找輪廓的函數(shù)
	// 第四個(gè)參數(shù)CV_RETR_EXTERNAL,表示尋找最外圍輪廓
	// 第五個(gè)參數(shù)CV_CHAIN_APPROX_NONE,表示保存物體邊界上所有連續(xù)的輪廓點(diǎn)到contours向量?jī)?nèi)
	cv::findContours(src, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE, cv::Point());
 
	if (!contours.empty()  !hierarchy.empty()) 
	{
		std::vectorstd::vectorcv::Point> >::const_iterator itc = contours.begin();
		// 遍歷所有輪廓
		while (itc != contours.end()) 
		{
			// 定位當(dāng)前輪廓所在位置
			cv::Rect rect = cv::boundingRect(cv::Mat(*itc));
			// contourArea函數(shù)計(jì)算連通區(qū)面積
			double area = contourArea(*itc);
			// 若面積小于設(shè)置的閾值
			if (area  min_area) 
			{
				// 遍歷輪廓所在位置所有像素點(diǎn)
				for (int i = rect.y; i  rect.y + rect.height; i++) 
				{
					uchar *output_data = dst.ptruchar>(i);
					for (int j = rect.x; j  rect.x + rect.width; j++) 
					{
						// 將連通區(qū)的值置0
						if (output_data[j] == 255) 
						{
							output_data[j] = 0;
						}
					}
				}
			}
			itc++;
		}
	}
}

測(cè)試效果

 

圖1 處理前后圖

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

您可能感興趣的文章:
  • OpenCV實(shí)現(xiàn)圖像連通域
  • 使用OpenCV去除面積較小的連通域
  • 使用OpenCV獲取圖片連通域數(shù)量,并用不同顏色標(biāo)記函

標(biāo)簽:三亞 銀川 葫蘆島 呼倫貝爾 湘西 烏魯木齊 呼倫貝爾 安慶

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《OpenCV清除小面積連通域的實(shí)現(xiàn)方法》,本文關(guān)鍵詞  OpenCV,清除,小,面積,連通,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《OpenCV清除小面積連通域的實(shí)現(xiàn)方法》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于OpenCV清除小面積連通域的實(shí)現(xiàn)方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    壤塘县| 乌鲁木齐市| 涞水县| 米脂县| 东城区| 凤山市| 贵溪市| 太康县| 阿克陶县| 湄潭县| 怀来县| 张家港市| 辽阳市| 正安县| 科尔| 宜宾市| 田林县| 蕉岭县| 徐州市| 维西| 布拖县| 习水县| 隆德县| 安图县| 伊宁县| 韶关市| 彰化市| 富宁县| 曲沃县| 锦州市| 桂阳县| 梧州市| 南召县| 肃宁县| 墨竹工卡县| 东至县| 磐安县| 繁峙县| 班戈县| 武川县| 西贡区|