欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenCV邊緣提取算法流程的實(shí)現(xiàn)(附DEMO)

 更新時(shí)間:2022年08月03日 14:41:39   作者:顏丑文良777  
本文主要介紹了OpenCV邊緣提取算法流程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在傳統(tǒng)的計(jì)算機(jī)視覺領(lǐng)域,經(jīng)常需要使用一些傳統(tǒng)的圖像處理算法完成對(duì)圖像的邊緣提取功能,通過對(duì)圖像的邊緣進(jìn)行提取完成對(duì)目標(biāo)對(duì)象的分割,目標(biāo)分割技術(shù)又包括語義分割與實(shí)例分割,比較高端的魯棒性較強(qiáng)的還是需要卷積神經(jīng)網(wǎng)絡(luò)算法進(jìn)行相關(guān)的訓(xùn)練,如fcn全連接網(wǎng)絡(luò),mask-rcnn實(shí)例分割網(wǎng)絡(luò)。本案例旨在采用傳統(tǒng)的圖像處理技術(shù)完成對(duì)圖像的邊緣檢測任務(wù),并通過膨脹腐蝕操作進(jìn)行連通域的提取,之后通過連通域的填充以及掩膜操作完成目標(biāo)對(duì)象的分割。

具體需要達(dá)到的目標(biāo)如下:

 上圖所示,可以很好的將河道信息進(jìn)行提取。

1. 具體算法流程

首先對(duì)采集的圖片進(jìn)行灰度化處理(方便進(jìn)行數(shù)據(jù)處理),然后對(duì)灰度圖像進(jìn)行中值濾波操作去除湖面上的細(xì)小雜質(zhì),之后通過x方向和y方向上的Sobel梯度算子分別獲取梯度圖像,并將梯度圖像轉(zhuǎn)換成CV_8UC1類型,并對(duì)轉(zhuǎn)換后的x,y方向上的梯度圖像進(jìn)行OTSU二值化操作獲取二值圖像,并對(duì)兩幅二值圖像按對(duì)應(yīng)像素位置進(jìn)行與運(yùn)算,目的是為了去除河道上的波紋干擾。(可以繼續(xù)對(duì)與運(yùn)算之后的結(jié)果圖進(jìn)行中值濾波去除湖面上的細(xì)小雜質(zhì))。最后對(duì)二值圖進(jìn)行多次迭代的膨脹腐蝕操作以及小區(qū)域塊的填充操作(用到findContours與drawContours接口進(jìn)行輪廓查找與填充)獲取河道連通區(qū)域。

2.流程圖

可以通過如下流程圖進(jìn)行展示。                     

3. 涉及到的代碼

int main() {
	Mat srcImage, srcImage2, srcImage3;
	for (int j = 1; j <= 172; j++)
	{
		//白天總共172張圖片。1-172;驗(yàn)證:1,162,146;
		//(挑選最好的效果作為模板。對(duì)比108與117進(jìn)行分析)。
		//if (j == 108 || j == 117)
		//{//對(duì)比分析之后選擇第108張圖片作為模板圖片
		char ch[4096] = { 0 };
		sprintf(ch, "..\\findriveredge\\day\\2 (%d).jpg", j);
		srcImage = imread(ch, IMREAD_ANYCOLOR);
		srcImage2 = srcImage.clone();
		srcImage3 = srcImage.clone();
		if (srcImage.empty())
		{
			return -1;
		}
		if (srcImage.channels() == 3)
		{
			cvtColor(srcImage, srcImage, COLOR_BGR2GRAY);
		}
 
		Mat outImage;
		medianBlur(srcImage, outImage, g_nKrenel);//首先對(duì)灰度圖進(jìn)行中值濾波操作,去除一些雜質(zhì)。
 
		Mat grad_x, abs_grad_x, grayImage_x;
		Sobel(outImage, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
		convertScaleAbs(grad_x, abs_grad_x);
		abs_grad_x.convertTo(grayImage_x, CV_8U);
 
 
		Mat grad_y, abs_grad_y, grayImage_y;
		Sobel(outImage, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
		convertScaleAbs(grad_y, abs_grad_y);
		abs_grad_y.convertTo(grayImage_y, CV_8U);
 
 
		Mat XBin, YBin;
		int n_thresh_x = myOtsu(grayImage_x);
		threshold(grayImage_x, XBin, n_thresh_x, 255, THRESH_BINARY);
 
 
		int n_thresh_y = myOtsu(grayImage_y);
		threshold(grayImage_y, YBin, n_thresh_y, 255, THRESH_BINARY);
 
 
		Mat Bin;
		bitwise_and(XBin, YBin, Bin);
 
 
		Mat outBin;
		medianBlur(Bin, outBin, 3);//去除一些雜質(zhì)點(diǎn)。
 
 
		Mat outBin2 = outBin.clone();
		int n_iterations = 5;
		Mat element = getStructuringElement(MORPH_ELLIPSE, Size(15, 15));//膨脹變亮形成連通域。
		Mat element2 = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));//腐蝕操作斷開一些連通域。
		dilate(outBin2, outBin2, element, Point(-1, -1), n_iterations);
		erode(outBin2, outBin2, element2, Point(-1, -1), 3);//腐蝕操作,斷開河流區(qū)域內(nèi)部的連接區(qū)域,方便后續(xù)的填充處理。
 
 
		//將河流ROI區(qū)域小塊連通域填黑。
		Mat outBin3 = outBin2.clone();
		vector<vector<Point>> contours;
		vector<Vec4i> hie;
		findContours(outBin3, contours, hie, RETR_LIST, CHAIN_APPROX_SIMPLE);
		float f_area = 0.0;
		for (int i = 0; i < contours.size(); i++)
		{
			f_area = contourArea(contours[i]);
			if (f_area < 250000)
			{
				drawContours(outBin3, contours, i, Scalar(0), -1);
			}
		}
 
 
		//由于final bin2在腐蝕過程中存在部分背景區(qū)域?yàn)楹谏斩矗枰獙⑵涮畎住?
		Mat outBin4_tmp = ~outBin3;
		Mat outBin4;
		contours.clear();
		hie.clear();
		findContours(outBin4_tmp, contours, hie, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
		for (unsigned int i = 0; i < contours.size(); i++)
		{
			f_area = contourArea(contours[i]);
			if (f_area < 250000)
			{
				drawContours(outBin4_tmp, contours, i, Scalar(0), -1);
			}
		}
		outBin4 = ~outBin4_tmp;
 
		//迭代腐蝕突出河流邊界區(qū)域。
		erode(outBin4, outBin4, element, Point(-1, -1), 10);
 
 
		//(可以對(duì)腐蝕圖在進(jìn)行一次外輪廓填充)。
		Mat outBin5_tmp = ~outBin4.clone();
		Mat outBin5;
		contours.clear();
		hie.clear();
		findContours(outBin5_tmp, contours, hie, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
		for (unsigned int i = 0; i < contours.size(); i++)
		{
			f_area = contourArea(contours[i]);
			if (f_area < 100000)
			{
				drawContours(outBin5_tmp, contours, i, Scalar(0), -1);
			}
		}
		outBin5 = ~outBin5_tmp;
 
 
		//根據(jù)outBin4,對(duì)原rgb圖取感興趣區(qū)域(即河流區(qū)域)
		for (int i = 0; i < outBin5.rows; i++)
		{
			for (int j = 0; j < outBin5.cols; j++)
			{
				if (outBin5.at<uchar>(i, j) == 255)
				{
					srcImage2.at<Vec3b>(i, j)[0] = 0;
					srcImage2.at<Vec3b>(i, j)[1] = 0;
					srcImage2.at<Vec3b>(i, j)[2] = 0;
				}
			}
		}
		namedWindow("finalImage", 0);
		imshow("finalImage", srcImage2);//這里的srcImage2表示最后所需效果圖
 
 
		cout << j << endl;
		waitKey(30);
	}
	return 0;
}

到此這篇關(guān)于OpenCV邊緣提取算法流程的實(shí)現(xiàn)(附DEMO)的文章就介紹到這了,更多相關(guān)OpenCV 邊緣提取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 你知道C語言函數(shù)調(diào)用常用的2種方式嗎

    你知道C語言函數(shù)調(diào)用常用的2種方式嗎

    本篇博客會(huì)講解C語言函數(shù)調(diào)用的2種方式,分別是:傳值調(diào)用和傳址調(diào)用。這2種函數(shù)調(diào)用方式有什么區(qū)別呢?為什么會(huì)有不同的效果呢?分別有哪些用途呢?下面就來一一展開
    2023-04-04
  • C++中對(duì)象與類的詳解及其作用介紹

    C++中對(duì)象與類的詳解及其作用介紹

    這篇文章主要介紹了C++中對(duì)象與類的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C/C++常用函數(shù)易錯(cuò)點(diǎn)分析

    C/C++常用函數(shù)易錯(cuò)點(diǎn)分析

    這篇文章主要介紹了C/C++常用函數(shù)易錯(cuò)點(diǎn)分析,包含了memset、sizeof、getchar三個(gè)常用函數(shù)的分析,需要的朋友可以參考下
    2014-08-08
  • C語言大小端字節(jié)序存儲(chǔ)模式深入解讀

    C語言大小端字節(jié)序存儲(chǔ)模式深入解讀

    我們知道,當(dāng)編譯器執(zhí)行 “創(chuàng)建變量” 這一代碼時(shí),會(huì)在內(nèi)存中開辟空間相應(yīng)的空間來存儲(chǔ)變量值。而對(duì)于整型變量而言,變量值又是以二進(jìn)制補(bǔ)碼的形式存放的
    2022-09-09
  • C語言實(shí)現(xiàn)小學(xué)生隨機(jī)出題測試計(jì)分

    C語言實(shí)現(xiàn)小學(xué)生隨機(jī)出題測試計(jì)分

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)小學(xué)生隨機(jī)出題測試計(jì)分,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Visual?Studio?2022下載及配置OpenCV4.5.5的詳細(xì)過程

    Visual?Studio?2022下載及配置OpenCV4.5.5的詳細(xì)過程

    這篇文章主要介紹了Visual?Studio?2022下載及配置OpenCV4.5.5的詳細(xì)過程,在這里注意下Win10的64位操作系統(tǒng),在OpenCV官網(wǎng)下載OpenCV4.5.5,安裝的是Win?pack,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • C語言結(jié)構(gòu)及隊(duì)列實(shí)現(xiàn)示例詳解

    C語言結(jié)構(gòu)及隊(duì)列實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了C語言實(shí)現(xiàn)隊(duì)列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 十分鐘學(xué)會(huì)C++?Traits

    十分鐘學(xué)會(huì)C++?Traits

    本文試圖以最簡潔的方式闡述對(duì)C++?traits?的理解,當(dāng)你理解了第二個(gè)例子的時(shí)候,相信你已經(jīng)理解了C++?traits,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-02-02
  • 詳解C++ 引用

    詳解C++ 引用

    這篇文章主要介紹了C++ 引用的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Vs2019+Qt+Opencv環(huán)境配置心得(圖文)

    Vs2019+Qt+Opencv環(huán)境配置心得(圖文)

    這篇文章主要介紹了Vs2019+Qt+Opencv環(huán)境配置心得(圖文),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評(píng)論