opencv 學習

PamShao發表於2020-10-18

環境

VS2019

opencv4.4.0

參考:連結

初步嘗試

參考:連結

影像顯示

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

using namespace cv;

int main()
{
	//讀取圖片
	Mat img = imread("D:\\生活資料\\圖片\\鬥圖\\1.jpg", 1); //圖片儲存位置地址使用 
	if (img.empty())
	{
		std::cout << "圖片讀取失敗!" << std::endl;
		system("pause");
		return 0;
	}
	imshow("【原圖】", img);    //顯示原圖片
	waitKey(); // 等待任意按鍵按下 
	return 0;
}

顯示效果:

程式碼解釋:

1、using namespace cv;

opencv 中的C++類和函式都是定義在名稱空間cv之內的,在程式碼開頭的適當位置加上 using namespace cv; ,規定程式位於此名稱空間之內

2、Mat類

mat 類用於儲存影像以及其他矩陣資料的資料結構,我們這裡只是用到了 Mat img=imread();

3、imread()

imread() 函式用於讀取檔案中的圖片到opencv中,定義如下:

Mat imread( const String& filename, int flags = IMREAD_COLOR );

第一個引數  const String& filename ,指的是圖片路徑,在Windows下,opencv的imread函式支援如下型別的影像載入:

第二個引數: int flags = IMREAD_COLOR ,為載入表示,指定了一個載入影像的顏色型別,其他不多介紹

4、imshow()

imshow()函式用於在指定的敞口中顯示衣服影像,函式定義為:
void imshow(const String& winname, InputArray mat);

第一個引數:const String& winname,只要顯示的視窗顯示名稱

第二個引數:InputArray mat,只要顯示的影像,其他不多介紹

圖形腐蝕和膨脹

腐蝕:就是影像中暗色部分“腐蝕”掉影像中的高亮部分

程式碼:

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

using namespace cv;

int main()
{
	//讀取圖片
	Mat img = imread("D:\\生活資料\\圖片\\鬥圖\\1.jpg", 1); //圖片儲存位置地址使用 \\
	
	if (img.empty())
	{
		std::cout << "圖片讀取失敗!" << std::endl;
		system("pause");
		return 0;
	}
	imshow("【原圖】", img);    //顯示原圖片

	//進行腐蝕操作
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
	Mat dstimg;
	erode(img, dstimg, element);
	//顯示效果圖
	imshow("【腐蝕操作】", dstimg);
	waitKey(); // 等待任意按鍵按下 
	return 0;
}

效果:

程式碼解釋:

參考:連結  

1、getStructuringElement

getStructuringElement()函式,返回值為指定形狀和尺寸結構元素(核心矩陣),定義如下:

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

第一個引數:核心的形狀(一般來說:矩形:MORPH_RECT;交叉形:MORPH_CROSS;橢圓形:MORPH_ELLIPSE

第二個引數:核心大小(如上,就是15*15的正方行核心)

第三個引數:錨點的位置(預設值Point(-1,-1),表示錨點位於中心點)

2、erode

erode 函式使用畫素鄰域內的區域性極小運算子來腐蝕一張圖片,從src輸入,由dst輸出,定義如下:

void erode(

InputArray src,

OutputArray dst,

InputArray kernel,
Point anchor = Point(-1,-1),

int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue()

);

第一個引數:輸入影像,即源影像,填Mat類的物件即可

第二個引數:目標影像,需要有原影像有一樣的尺寸和型別

第三個引數:kernel,腐蝕操作的核心,為NULL時,表示的是使用參考點位於中心3*3的核,一般使用 getStructuringElement 函式,會返回指定形狀和尺寸的結構元素(核心矩陣)

第四個引數:anchor,錨的位置,預設為(-1,-1),表示錨位於單位(element)的中心

第五個引數:iterations ,迭代使用erode函式的次數,預設為1

第六個引數:borderType ,用於推斷影像外部畫素的某種邊界模式,預設為BORDER_CONSTANT

第七個引數:borderValue,當邊界為常數時的邊界值,有預設值 morphologyDefaultBorderValue ,其他不多解釋

但使用erode函式,一般只需要前三個引數,後面四個引數都是預設值

膨脹:和腐蝕相反,將影像亮度部分放大,黑暗部分縮小

程式碼:

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

using namespace cv;

int main()
{
	//讀取圖片
	Mat img = imread("D:\\生活資料\\圖片\\鬥圖\\1.jpg", 1); //圖片儲存位置地址使用 \\
	
	if (img.empty())
	{
		std::cout << "圖片讀取失敗!" << std::endl;
		system("pause");
		return 0;
	}
	imshow("【原圖】", img);    //顯示原圖片

	//進行腐蝕操作
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
	Mat dstimg;
	dilate(img, dstimg, element);
	//顯示效果圖
	imshow("【膨脹操作】", dstimg);
	waitKey(); // 等待任意按鍵按下 
	return 0;
}

效果:

程式碼分析:

1、dilate

dilate 函式使用畫素鄰域內的區域性極大運算子來膨脹一張圖片,從src輸入,由dst輸出,函式定義為:

void dilate(

InputArray src,

OutputArray dst,

InputArray kernel,
Point anchor = Point(-1,-1),

int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue()

);

引數介紹:

影像模糊

模糊,就是對影像進行了增值濾波操作

程式碼:

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

using namespace cv;

int main()
{
	//讀取圖片
	Mat img = imread("D:\\生活資料\\圖片\\鬥圖\\1.jpg", 1); //圖片儲存位置地址使用 \\
	
	if (img.empty())
	{
		std::cout << "圖片讀取失敗!" << std::endl;
		system("pause");
		return 0;
	}
	imshow("【原圖】", img);    //顯示原圖
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
	Mat dstimg;
	// 進行腐蝕操作
	erode(img, dstimg, element);
	imshow("【腐蝕操作】", dstimg);
	// 進行膨脹操作
	dilate(img, dstimg, element);
	imshow("【膨脹操作】", dstimg);
	// 進行模糊操作
	blur(img, dstimg, Size(7, 7));
	imshow("【均值濾波】", dstimg);
	waitKey(); // 等待任意按鍵按下 
	return 0;
}

效果:

 

相關文章