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

C++ Opencv自寫函數(shù)實現(xiàn)膨脹腐蝕處理技巧

 更新時間:2021年10月13日 10:40:17   作者:秋沐霖  
這篇文章主要介紹了C++ Opencv 自寫函數(shù)實現(xiàn)膨脹腐蝕處理,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、膨脹腐蝕學(xué)習(xí)筆記

二、代碼及結(jié)果分享

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

//定義腐蝕函數(shù)
void myErode(Mat Src, Mat Tem, Mat Dst)
{
	int m = (Tem.rows - 1) / 2;
	int n = (Tem.cols - 1) / 2;
	for (int i = m; i < Src.rows - m; i++)//i、j的范圍保證結(jié)構(gòu)元始終在擴展后的圖像內(nèi)部
	{
		for (int j = n; j < Src.cols - n; j++)
		{
			Mat SrcROI = Src(Rect(j - m, i - n, Tem.cols, Tem.rows));
			double sum = 0;
			sum = SrcROI.dot(Tem);//矩陣對應(yīng)位置相乘后求和
			if (sum == 9)//結(jié)構(gòu)元的9個元素均為1,和為9才能保證結(jié)構(gòu)元完全包含于相應(yīng)集合
				Dst.at<uchar>(i, j) = 255;
			else
				Dst.at<uchar>(i, j) = 0;
		}
	}
}

//定義膨脹函數(shù)
void myDilate(Mat Src, Mat Tem, Mat Dst)
{
	int m = (Tem.rows - 1) / 2;
	int n = (Tem.cols - 1) / 2;
	for (int i = m; i < Src.rows - m; i++)//i、j的范圍保證結(jié)構(gòu)元始終在擴展后的圖像內(nèi)部
	{
		for (int j = n; j < Src.cols - n; j++)
		{
			Mat SrcROI = Src(Rect(j - m, i - n, Tem.cols, Tem.rows));
			double sum = 0;
			sum = SrcROI.dot(Tem);//矩陣對應(yīng)位置相乘后求和
			if (sum != 0)//結(jié)構(gòu)元的9個元素均為1,只要和不為0,就能說明結(jié)構(gòu)元與相應(yīng)集合有交集
				Dst.at<uchar>(i, j) = 255;
			else
				Dst.at<uchar>(i, j) = 0;
		}
	}
}

int main()
{
	Mat mImage = imread("dada.jpg", 0);
	if (mImage.data == 0)
	{
		cerr << "Image reading error !" << endl;
		system("pause");
		return -1;
	}
	namedWindow("The original image", WINDOW_NORMAL);
	imshow("The original image", mImage);

	//設(shè)置閾值將圖像二值化
	const int binThreshold = 80;
	for (int i = 0; i < mImage.rows; i++)
	{
		uchar* pImage = mImage.ptr<uchar>(i);
		for (int j = 0; j < mImage.cols; j++)
		{
			if (pImage[j] > binThreshold)//事實上應(yīng)將灰度值大于閾值的賦值為255,但為了方便后續(xù)膨脹腐蝕的計算,在這里將其賦值為1
				pImage[j]= 1;
			else
				pImage[j] = 0;
		}
	}

	//定義并初始化結(jié)構(gòu)元
	Mat mTemplate(3, 3, CV_8UC1, Scalar(1));
	if (mTemplate.rows * mTemplate.cols % 2 == 0)
	{
		cerr << "The size doesn't meet the requirement !" << endl;
		system("pause");
		return -1;
	}
	
	//擴展圖像邊界
	copyMakeBorder(mImage, mImage, mTemplate.rows, mTemplate.rows, mTemplate.cols, mTemplate.cols, BORDER_CONSTANT, Scalar(0));

	//進行圖像腐蝕
	Mat mEResult = mImage.clone();
	myErode(mImage, mTemplate, mEResult);

	//進行圖像膨脹
	Mat mDResult = mImage.clone();
	myDilate(mImage, mTemplate, mDResult);

	//進行顯示
	namedWindow("The eroding image", WINDOW_NORMAL);
	imshow("The eroding image", mEResult);
	namedWindow("The dilating image", WINDOW_NORMAL);
	imshow("The dilating image", mDResult);
	waitKey();
	destroyAllWindows();

	return 0;
}

膨脹(dilate)和腐蝕(erode)均是對白色區(qū)域而言。由結(jié)果可明顯看出,膨脹后的白色面積要比腐蝕后的大。由圖像左下角的水印變化也可直觀看出兩種操作對圖像的不同影響。

三、注意事項

在本次編程實現(xiàn)過程中,為了確定結(jié)構(gòu)元是否包含于集合(或與集合是否有交集),需要讓結(jié)構(gòu)元中各元素與圖像中對應(yīng)位置像素值相乘后求和。Mat類型中有幾種不同類型的乘法,在這里加以總結(jié)。

Mat A, B ;

3.1A.dot(B)

A、B對應(yīng)位置元素相乘,之后將所有乘積相加求和,返回值是double型數(shù)字。要求A、B size必須相同。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
	uchar A[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	uchar B[3][3] = { { 1,1,1 },{ 1,1,1 },{ 1,1,1 } };
	Mat Src(3, 3, CV_8UC1, A);
	Mat Dst(3, 3, CV_8UC1, B);
	double Result = Src.dot(Dst);
	cout << "Src:" << Src << endl;
	cout << "Dst:" << Dst << endl;
	cout << "Result:" << Result << endl;
	system("pause");
	return 0;
}

3.2A.mul(B)

A、B對應(yīng)位置元素相乘,返回值是和A、B等大小,同類型的Mat型矩陣。要求A、B size必須相同。若計算結(jié)果溢出,則溢出值自動變?yōu)楫?dāng)前數(shù)據(jù)類型下允許的的最大值。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
	uchar A[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	uchar B[3][3] = { { 1,1,1 },{ 1,1,1 },{ 1,1,1 } };
	Mat Src(3, 3, CV_8UC1, A);
	Mat Dst(3, 3, CV_8UC1, B);
	Mat Result = Src.mul(Dst);
	cout << "Src:" << Src << endl;
	cout << "Dst:" << Dst << endl;
	cout << "Result:" << Result << endl;
	system("pause");
	return 0;
}

到此這篇關(guān)于C++ Opencv 自寫函數(shù)實現(xiàn)膨脹腐蝕處理的文章就介紹到這了,更多相關(guān)C++ Opencv 膨脹腐蝕內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt 使用 canon edsdk 實現(xiàn)實時預(yù)覽的示例代碼

    Qt 使用 canon edsdk 實現(xiàn)實時預(yù)覽的示例代碼

    這篇文章主要介紹了Qt 使用 canon edsdk 實現(xiàn)實時預(yù)覽的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • DevC++如何自定義頭文件并使用

    DevC++如何自定義頭文件并使用

    文章介紹了如何在DevC++中自定義頭文件并使用,首先創(chuàng)建一個項目,然后新建一個頭文件并編寫代碼,保存后創(chuàng)建一個源文件并將其放在項目目錄下
    2024-11-11
  • C/C++使用API實現(xiàn)數(shù)據(jù)的壓縮與解壓縮

    C/C++使用API實現(xiàn)數(shù)據(jù)的壓縮與解壓縮

    在Windows編程中,經(jīng)常會遇到需要對數(shù)據(jù)進行壓縮和解壓縮的情況,本文將深入探討使用Windows API進行數(shù)據(jù)壓縮與解壓縮的過程,感興趣的小伙伴可以了解下
    2023-11-11
  • C語言中的柔性數(shù)組你了解嗎

    C語言中的柔性數(shù)組你了解嗎

    這篇文章主要為大家詳細介紹了C99中的新語法——柔性數(shù)組的使用以及優(yōu)缺點,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的可以了解一下
    2023-04-04
  • 講解C語言編程中指針賦值的入門實例

    講解C語言編程中指針賦值的入門實例

    這篇文章主要介紹了講解C語言編程中指針賦值的入門實例,通過const int i與int *const pi這樣兩個例子來分析指針的賦值和地址指向,需要的朋友可以參考下
    2015-12-12
  • 解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型

    解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型

    虛擬函數(shù)(Visual Function)亦常被成為虛函數(shù),是C++中的一個重要特性,本文我們就來解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型
    2016-06-06
  • C++實現(xiàn)有向圖的鄰接表表示

    C++實現(xiàn)有向圖的鄰接表表示

    這篇文章主要為大家詳細介紹了C++實現(xiàn)有向圖的鄰接表表示,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C語言入門篇--注釋,關(guān)鍵字typedef及轉(zhuǎn)義字符詳解

    C語言入門篇--注釋,關(guān)鍵字typedef及轉(zhuǎn)義字符詳解

    本篇文章是c語言基礎(chǔ)篇,主要為大家介紹了C語言的關(guān)鍵字typedef,注釋,轉(zhuǎn)義字符的基本理論知識,希望可以幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • C++編譯器無法捕捉到的8種錯誤實例分析

    C++編譯器無法捕捉到的8種錯誤實例分析

    這篇文章主要介紹了C++編譯器無法捕捉到的8種錯誤,是深入學(xué)習(xí)C++所必須加以掌握的排錯技能,需要的朋友可以參考下
    2014-09-09
  • C語言實現(xiàn)楊輝三角實例

    C語言實現(xiàn)楊輝三角實例

    這篇文章主要介紹了C語言實現(xiàn)楊輝三角的方法,主要通過數(shù)組簡單實現(xiàn),具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-09-09

最新評論