目錄
圖像處理的基礎操作
1、讀取圖像
1.1、讀取當前目錄下的圖像
2、顯示圖像
2.1、Cv2.ImShow 用于顯示圖像。
2.2、Cv2.WaitKey方法用于等待用戶按下鍵盤上按鍵的時間。
2.3、Cv2.DestroyAllWindows方法用于銷毀所有正在顯示圖像的窗口。
2.4實例1-顯示圖像
2.4實例2-顯示灰度圖像
3、保存圖像
3.1實例1-保存圖像
4、獲取圖像屬性
4.1實例1-獲取圖像屬性
圖像處理的基礎操作
圖像處理最基本的操作,包括讀取圖像、顯示圖像、保存圖像、獲取圖像屬性等
1、讀取圖像
OpenCvSharp提供了用于讀取圖像的Cv2.ImRead方法,函數如下:
public static Mat ImRead(string fileName, ImreadModes flags = ImreadModes.Color)
參數說明:
Mat:是ImRead方法的返回值,返回的是讀取到的圖像。
fileName:Name of file to be loaded.
要讀取圖像的完整的文件名。例如,要讀取當前項目下的test.jpg,fileName的值為"test.jpg"(雙引號為英文格式)。
flags:Specifies color type of the loaded image
讀取圖像顏色類型的標記,當flags的默認值為ImreadModes.Color時,表示讀取的是彩色圖像,此時的flags值可以省略,當flags的值為ImreadModes.Grayscale時,表示讀取的是灰度圖像(如果讀取的是彩色圖像,也可以將彩色圖轉換為灰度圖)。
1.1、讀取當前目錄下的圖像
在我們的測試Demo下,有一張test.jpg的圖像,如下圖
我們使用ImRead方法讀取,再使用Dump方法查詢像素值。代碼如下:
Mat mat = Cv2.ImRead("test.jpg");
string info = mat.Dump();
2、顯示圖像
相比上圖中秘密麻麻的數字,將圖像顯示出來,效果會更加直觀,我們需要使用Cv2.ImShow、Cv2.WaitKey、Cv2.DestroyAllWindows。
2.1、Cv2.ImShow 用于顯示圖像。
函數如下:
public static void ImShow(string winName, Mat mat)
參數說明:
winName:顯示圖像的窗口名稱。
mat:要實現的圖像。
2.2、Cv2.WaitKey方法用于等待用戶按下鍵盤上按鍵的時間。
用戶按下鍵盤上的任意按鍵時,將執行Cv2.WaitKey方法,并且獲取Cv2.WaitKey方法的返回值。其函數如下:
?public static int WaitKey(int delay = 0)
摘要:
? ? Waits for a pressed key.
參數:
? delay:
? ? Delay in milliseconds. 0 is the special value that means ”forever”
返回結果:
? ? Returns the code of the pressed key or -1 if no key was pressed before the specified
? ? time had elapsed.
2.3、Cv2.DestroyAllWindows方法用于銷毀所有正在顯示圖像的窗口。
其函數為:
? public static void DestroyAllWindows()
2.4實例1-顯示圖像
代碼如下:
Mat mat = Cv2.ImRead("test.jpg");
Cv2.ImShow("test.jpg", mat);
Cv2.WaitKey();
Cv2.DestroyAllWindows();
效果
2.4實例2-顯示灰度圖像
代碼如下:
Mat mat = Cv2.ImRead("test.jpg",ImreadModes.Grayscale);
Cv2.ImShow("test.jpg", mat);Cv2.WaitKey();
Cv2.DestroyAllWindows();
效果
3、保存圖像
OpenCvSharp提供Cv2.ImWrite方法,用于按照指定路徑保存圖像。其函數為:
?public static bool ImWrite(string fileName, Mat img, int[]? prms = null)
摘要:
? ? Saves an image to a specified file.
參數:
? fileName:
? ? Name of the file.
? img:
? ? Image to be saved.
? prms:
? ? Format-specific save parameters encoded as pairs
3.1實例1-保存圖像
代碼如下:
Mat mat = Cv2.ImRead("test.jpg");
Cv2.ImWrite("dst.jpg",mat);
效果
4、獲取圖像屬性
處理圖像過程中,經常需要獲取圖像的大小,類型等圖像屬性。OpenCvSharp提供了獲取常用的屬性的方法,如下:
Data
? ? ? ?IntPtr類型的指針,指向Mat矩陣數據的首地址。一般不用。
Rows 或 Height
? ? ? ? Mat矩陣的行數,也是圖片的高度(像素)。
Cols 或 Width
? ? ? ? Mat矩陣的列數,也是圖片的寬度(像素)。
Size()
? ? ? ? Size() 返回 Width,Height 組成的結構。
Dims
? ? ? ? Mat矩陣的維度,若Mat是一個二維矩陣,則Dims=2,三維則Dims=3。
Channels()
? ? ? ? Mat矩陣元素的通道數。
? ? ? ? 例如常見的RGB彩色圖像,Channels =3;
? ? ? ? 灰度圖像只有一個灰度分量信息,Channels =1。
Depth()
? ? ? ? 每一個像素中每一個通道的精度。
? ? ? ? 在Opencv中,Mat.Depth()得到的是一個 0~6 的數字,分別代表不同的位數,
? ? ? ? 對應關系如下: ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? CV_8U=0
? ? ? ? ? ? ? ? CV_8S=1
? ? ? ? ? ? ? ? CV_16U=2
? ? ? ? ? ? ? ? CV_16S=3
? ? ? ? ? ? ? ? CV_32S=4
? ? ? ? ? ? ? ? CV_32F=5
? ? ? ? ? ? ? ? CV_64F=6 ? ??
? ? ? ? 其中U是unsigned的意思,S表示signed,也就是有符號和無符號數。
ElemSize() and ElemSize1()
? ? ? ? 矩陣中每一個元素的數據字節數(bytes)。
? ? ? ? 如果Mat中的數據類型是CV_8UC1,那么ElemSize = 1;
? ? ? ? 如果是CV_8UC3或CV_8SC3,那么 ElemSize = 3;
? ? ? ? 如果是CV_16UC3或者CV_16SC3,那么 ElemSize = 6;
? ? ? ? 可見,ElemSize是以字節為單位的;
? ? ? ? ElemSize1() 就是通道1的數據字節數。有:
? ? ? ? ElemSize1 = ElemSize / Channels
Step() and Step1()
? ? ? ? Mat矩陣中每一行的步長(字節),即為每一行中所有元素的字節總量。
? ? ? ? Step1() 是通道1的步長。有:
? ? ? ? Step1 = Step / ElemSize1
Type()
? ? ? ? Mat矩陣的類型,包含有矩陣中元素的類型以及通道數信息。
4.1實例1-獲取圖像屬性
代碼如下:
Mat mat = Cv2.ImRead("test.jpg");
Console.WriteLine("獲取圖像的屬性");
Console.WriteLine("Data:" + mat.Data);
Console.WriteLine("Rows:" + mat.Rows);
Console.WriteLine("Height:" + mat.Height);
Console.WriteLine("Cols:" + mat.Cols);
Console.WriteLine("Width:" + mat.Width);
Console.WriteLine("Size:" + mat.Size());
Console.WriteLine("Dims:" + mat.Dims);
Console.WriteLine("Channels:" + mat.Channels());
Console.WriteLine("ElemSize:" + mat.ElemSize());
Console.WriteLine("ElemSize1:" + mat.ElemSize1());
Console.WriteLine("Step:" + mat.Step());
Console.WriteLine("Step1:" + mat.Step1());
Console.WriteLine("Type:" + mat.Type());
Console.ReadKey();
輸出