您好,登錄后才能下訂單哦!
本篇文章為大家展示了使用OpenCvSharp如何實(shí)現(xiàn)將Mat對象像素化,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
1: 輸出一個(gè)Mat對象的像素
自定義一個(gè)Mat 對象,然后輸出像素值(像素值基本都在 0 – 255 之間 ,圖像為三通道)
代碼
public static void F1() { Scalar s = new Scalar(0, 0, 255); //定義一個(gè)三通道顏色(紅色) Mat m = new Mat(100, 100, MatType.CV_8UC3, s); //矩陣數(shù)據(jù)類型(深度和通道數(shù)) MatType /* * 小圖像的每一個(gè)像素值我們都是知道的,可以輸出查看,驗(yàn)證算法正確性,然后在ran大圖 */ //打印 100 * 100 Mat對象像素值 for (int i = 0; i < m.Height; i++) { for (int j = 0; j < m.Width; j++) { Vec3b color = m.Get<Vec3b>(i, j); //new Vec3b(); 顏色通道類型 (字節(jié)的三元組),直接視同Get泛型方法返回指定類型 //單獨(dú)獲取指定通道像素 //color.Item0= m.Get<Vec3b>(i, j).Item0; //R //color.Item1 = m.Get<Vec3b>(i, j).Item1; //G //color.Item2 = m.Get<Vec3b>(i, j).Item2; //B Console.Write(color.Item0 + " " + color.Item1 + " " + color.Item2); Console.WriteLine(" "); //輸出一個(gè)換行 } } using (new Window("M", WindowMode.AutoSize, m)) { Cv2.WaitKey(0); } }
100*100 個(gè)像素大小的圖像不是很大,顏色在代碼值指定了(0,0,255)三通道的顏色值,打印出來都只是(0,0,255)。
下面讀取一張彩色圖片試一下:
public static void F1(string path) { //Scalar s = new Scalar(0, 0, 255); //Mat m = new Mat(100, 100, MatType.CV_8UC3, s); //矩陣數(shù)據(jù)類型(深度和通道數(shù)) MatType Mat m = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth); /* * 小圖像的每一個(gè)像素值我們都是知道的,可以輸出查看,驗(yàn)證算法正確性,然后在ran大圖 */ //打印 100 * 100 Mat對象像素值 for (int i = 0; i < m.Height; i++) { for (int j = 0; j < m.Width; j++) { Vec3b color = m.Get<Vec3b>(i, j); //new Vec3b(); 顏色通道類型(字節(jié)的三元組) ,直接視同Get泛型方法返回指定類型 //單獨(dú)獲取指定通道像素 //color.Item0= m.Get<Vec3b>(i, j).Item0; //R //color.Item1 = m.Get<Vec3b>(i, j).Item1; //G //color.Item2 = m.Get<Vec3b>(i, j).Item2; //B Console.Write(color.Item0 + " " + color.Item1 + " " + color.Item2); Console.WriteLine(" "); //輸出一個(gè)換行 } } Console.WriteLine("圖像高度:{0}", m.Height); Console.WriteLine("圖像寬度:{0}", m.Width); using (new Window("M", WindowMode.AutoSize, m)) { Cv2.WaitKey(0); } }
這張圖比較大,輸出像素要費(fèi)點(diǎn)時(shí)間,最后輸出了圖像的高度和寬度 480 * 512 =245760 多個(gè)像素點(diǎn)。 像素點(diǎn)的值 都在0 --255之間且是正數(shù)。
2:使用指針獲取一個(gè)像素值和圖像的行列值
代碼 在C#中使用指針方法要加 unsafe , Main函數(shù)也要加
unsafe static void Main(string[] args) { string imagePath = @"E:\image\lenna.png"; //圖片加載路徑 Function1(imagePath); }
/// <summary> /// 操作指針要加 unsafe /// </summary> unsafe public static void Function1(string path) { Mat src = new Mat(path, ImreadModes.AnyColor); if (src.Empty()) //判斷 MAT對象是否為空,不過在C#中好像沒用,因?yàn)樵趍at對象初始化的時(shí)候找不到圖片就直接拋出異常了,但是C++中可以用來判斷。 { Console.WriteLine("加載圖像出錯"); return; } /* C++: Mat dst; dst=Mat(src.Size(), src.Type()); dst=Scalar(127,0,255); */ //Scalar s = new Scalar(127, 0, 255); //創(chuàng)建一個(gè)顏色標(biāo)量(RED)C# 中是一個(gè)對象 // Mat dst = new Mat(src.Size(), src.Type(),s);//創(chuàng)建一個(gè)與src 的大小和類型一直的圖片矩陣 //Mat dst = src.Clone(); //克?。旱玫揭粋€(gè)完全拷貝的對象 Mat dst = new Mat(); src.CopyTo(dst); //拷貝一個(gè)與克隆類似,但是dst必須先new出來 //Cv2.CvtColor(src, dst, ColorConversionCodes.BGRA2GRAY); //轉(zhuǎn)為灰度圖 Console.WriteLine("InputImage 顏色通道:{0}", src.Channels()); //顏色通道數(shù) Console.WriteLine("Create 顏色通道:{0}", dst.Channels()); //顏色通道數(shù) //指針獲取值(根據(jù)下標(biāo)),第一個(gè)像素值 IntPtr c = dst.Ptr(0); //Mat對象的 Ptr方法:返回指向指定矩陣行的指針。 byte* c1 = (byte*)c; //像素值在C#中是byte類型 ,在C++中是 uchar類型 //byte* cc = (byte*)dst.Ptr(0); Console.WriteLine("第一個(gè)像素值:{0}", *c1); int row = dst.Rows; //行 int clo = dst.Cols; //列 Console.WriteLine("Rows :{0} ;Cols :{1}", row, clo); using (new Window("Create", WindowMode.FreeRatio, dst)) using (new Window("InputImage", WindowMode.FreeRatio, src)) { Cv2.WaitKey(0); } }
上述內(nèi)容就是使用OpenCvSharp如何實(shí)現(xiàn)將Mat對象像素化,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。