做公司中文網(wǎng)站需要注意什么小語種網(wǎng)站建設(shè) cover
鶴壁市浩天電氣有限公司
2026/01/22 08:50:42
做公司中文網(wǎng)站需要注意什么,小語種網(wǎng)站建設(shè) cover,深圳 福田網(wǎng)站建設(shè),wordpress搭建環(huán)境先講講思路#xff0c;圖片是一組龐大的矩陣數(shù)據(jù)#xff0c;每一個(gè)像素點(diǎn)有用數(shù)據(jù)為五個(gè)分別為RGB#xff08;三原色#xff09;#xff0c;以及XY坐標(biāo)。也就是說我們能將整張圖片每一個(gè)像素點(diǎn)的數(shù)據(jù)提取出來加以分析。那么就可以做到圖片識別。源代碼會在最下方貼出。首先…先講講思路圖片是一組龐大的矩陣數(shù)據(jù)每一個(gè)像素點(diǎn)有用數(shù)據(jù)為五個(gè)分別為RGB三原色以及XY坐標(biāo)。也就是說我們能將整張圖片每一個(gè)像素點(diǎn)的數(shù)據(jù)提取出來加以分析。那么就可以做到圖片識別。源代碼會在最下方貼出。首先整個(gè)流程思想是這楊復(fù)制代碼#region 6孔混合魚苗VisionHelper.Two_Level(C:UsersAdministratorDesktop右上角三只魚的提取小魚圖片2-單個(gè).png, C:UsersAdministratorDesktop3.1二級化.png);VisionHelper.Outline(C:UsersAdministratorDesktop3.1二級化.png, C:UsersAdministratorDesktop3.1輪廓檢測.png);VisionHelper.CutCircle(C:UsersAdministratorDesktop3.1輪廓檢測.png, C:UsersAdministratorDesktop3.1圓形剪切.bmp);VisionHelper.ExtractCircle(C:UsersAdministratorDesktop3.1圓形剪切.bmp, C:UsersAdministratorDesktop3.1圓形提取.jpg);var data VisionHelper.GetImagePixel(C:UsersAdministratorDesktop3.1圓形提取.jpg);data VisionHelper.FishExtract(data, C:UsersAdministratorDesktop3.1圓形提取.jpg);var fish VisionHelper.FishGroup(data);fish VisionHelper.FishDistinct(fish);data VisionHelper.FishCenter(fish);#endregion復(fù)制代碼先將抓取的圖片二級化,效果如下所示VisionHelper.Two_Level(C:UsersAdministratorDesktop右上角三只魚的提取小魚圖片2-單個(gè).png, C:UsersAdministratorDesktop3.1二級化.png);原圖左處理圖右小魚圖片2-單個(gè)小魚圖片2-單個(gè)-二級化處理二級化以后這張圖片的數(shù)據(jù)就只剩黑色和白色如果二級化時(shí)沒有損壞到目標(biāo)特征像素點(diǎn)那么接下來提取目標(biāo)特征像素點(diǎn)會很容易因?yàn)橹挥泻诎變缮酉聛碜鲚喞O(jiān)測將整個(gè)培養(yǎng)皿掃描出來并且去除這楊就只剩培養(yǎng)皿內(nèi)的魚苗和食物或者排泄物VisionHelper.Outline(C:UsersAdministratorDesktop3.1二級化.png, C:UsersAdministratorDesktop3.1輪廓檢測.png);效果如下所示小魚圖片2-單個(gè)-二級化處理 小魚圖片2-單個(gè)-輪廓處理在圖片處理的算法中我用紅圈標(biāo)注了培養(yǎng)皿內(nèi)的區(qū)域并且用藍(lán)點(diǎn)打出了中心接下來呢可以將其他無用的圖片區(qū)域全部剪切掉就是圖片內(nèi)圓形切割VisionHelper.CutCircle(C:UsersAdministratorDesktop3.1輪廓檢測.png, C:UsersAdministratorDesktop3.1圓形剪切.bmp);切割效果如下圖所示小魚圖片2-單個(gè)-輪廓處理image因?yàn)楫?dāng)初代碼里設(shè)定生成的圖片是BMP,上傳不了博客所以這粗糙的截圖一下。可以看到圓形剪切.bmp里只剩培養(yǎng)皿內(nèi)區(qū)域的圖片了之前輪廓處理和圓形剪切形成的紅色,藍(lán)色圓圈或者中心點(diǎn)代碼里可以設(shè)置不寫入那么接下來就是對圓形剪切區(qū)域的有用像素進(jìn)行提取和分析復(fù)制代碼var data VisionHelper.GetImagePixel(C:UsersAdministratorDesktop3.1圓形提取.jpg);data VisionHelper.FishExtract(data, C:UsersAdministratorDesktop3.1圓形提取.jpg);var fish VisionHelper.FishGroup(data);fish VisionHelper.FishDistinct(fish);data VisionHelper.FishCenter(fish);復(fù)制代碼我先展示下最終的結(jié)果image經(jīng)過我進(jìn)行數(shù)據(jù)處理后的圖片內(nèi)提取出了三條魚的中心點(diǎn)位數(shù)據(jù)我們校驗(yàn)一下答案下圖1是原圖小魚圖片2-單個(gè)三個(gè)小黑點(diǎn)是三條魚數(shù)據(jù)正確坐標(biāo)是否正確我用畫圖工具打開校驗(yàn)如下三圖所示為了更直觀的展示結(jié)果用鼠標(biāo)浮在指定坐標(biāo)手機(jī)拍攝的不是很清楚但是看得清大家可以雙擊圖片放大微信圖片_20250928141219第一條數(shù)據(jù)15177在圖內(nèi)鼠標(biāo)右上角指向的小魚苗內(nèi)微信圖片_20250928141224第二條數(shù)據(jù)2288在圖內(nèi)鼠標(biāo)左側(cè)指向的小魚苗內(nèi)微信圖片_20250928141228第三條數(shù)據(jù)13714888在圖內(nèi)鼠標(biāo)右下角指向的小魚苗內(nèi)接下來貼出我手搓的核心算法整個(gè)VisionHelper運(yùn)用了OpenCvSharp和Emgu.CV這兩個(gè)第三方圖片處理框架的算法所有的方法都可以靈活運(yùn)用方法體內(nèi)的參數(shù)可以隨著實(shí)際需要識別的物體做調(diào)整源代碼里有那么多注釋應(yīng)該就不用在講解基礎(chǔ)框架和算法應(yīng)用了吧嘻嘻復(fù)制代碼using Emgu.CV;using Emgu.CV.CvEnum;using Emgu.CV.Structure;using OpenCvSharp;using System.Drawing.Drawing2D;using System.Drawing.Imaging;using FishVision.Model;namespace FishVision{public class VisionHelper{/// summary/// 1.二級化/// /summary/// param nameoldpath/param/// param namenewPath/parampublic static void Two_Level(string oldpath,string newPath){Emgu.CV.Mat image CvInvoke.Imread(oldpath, Emgu.CV.CvEnum.ImreadModes.Grayscale);Emgu.CV.Mat mid new Emgu.CV.Mat();CvInvoke.Threshold(image, mid, 125, 255, ThresholdType.Binary);//180 改CvInvoke.Imwrite(newPath, mid);}/// summary/// 2.輪廓檢測/// /summarypublic static void Outline(string oldpath, string newPath){//讀取圖片var img Cv2.ImRead(oldpath);//轉(zhuǎn)換成灰度圖OpenCvSharp.Mat gray img.CvtColor(ColorConversionCodes.BGR2GRAY);//閾值操作 閾值參數(shù)可以用一些可視化工具來調(diào)試得到OpenCvSharp.Mat ThresholdImg gray.Threshold(135, 255, ThresholdTypes.Binary);//Cv2.ImShow(Threshold, ThresholdImg);//降噪 高斯變化//Mat gaussImg ThresholdImg.GaussianBlur(new Size(5, 5), 0.8);//Cv2.ImShow(GaussianBlur, gaussImg);//中值濾波降噪//Mat medianImg ThresholdImg.MedianBlur(5);//Cv2.ImShow(MedianBlur, medianImg);//膨脹腐蝕//Mat kernel new Mat(15, 15, MatType.CV_8UC1);//Mat DilateImg ThresholdImg.Dilate(kernel);////腐蝕處理//Mat binary DilateImg.Erode(kernel);OpenCvSharp.Mat element Cv2.GetStructuringElement(MorphShapes.Ellipse, new OpenCvSharp.Size(3, 3));OpenCvSharp.Mat openImg ThresholdImg.MorphologyEx(MorphTypes.Open, element);//Cv2.ImShow(Dilate Erode, openImg);//設(shè)置感興趣的區(qū)域int x 0, y 0, w img.Width, h img.Height;Rect roi new Rect(x, y, w, h);OpenCvSharp.Mat ROIimg new OpenCvSharp.Mat(openImg, roi);//Cv2.ImShow(ROI Image, ROIimg);//尋找圖像輪廓OpenCvSharp.Point[][] contours;HierarchyIndex[] hierachy;Cv2.FindContours(ROIimg, out contours, out hierachy, RetrievalModes.List, ContourApproximationModes.ApproxTC89KCOS);//根據(jù)找到的輪廓點(diǎn)擬合橢圓for (int i 0; i contours.Length; i){//擬合函數(shù)必須至少5個(gè)點(diǎn)少于則不擬合if (contours[i].Length 150 || contours[i].Length 200) continue;//橢圓擬合var rrt Cv2.FitEllipse(contours[i]);//ROI復(fù)原rrt.Center.X x;rrt.Center.Y y;//畫橢圓Cv2.Ellipse(img, rrt, new Scalar(0, 0, 255), 2, LineTypes.AntiAlias);//畫圓心Cv2.Circle(img, (int)(rrt.Center.X), (int)(rrt.Center.Y), 4, new Scalar(255, 0, 0), -1, LineTypes.Link8, 0);}//Cv2.ImShow(Fit Circle, img);Cv2.ImWrite(newPath, img);}/// summary/// 3.圓形剪切/// /summary/// param nameoldpath/param/// param namenewPath/parampublic static void CutCircle(string oldpath, string newPath){ImageBgr, Byte src new ImageBgr, byte(oldpath);int scale 1;if (src.Width 500){scale 2;}if (src.Width 1000){scale 10;}if (src.Width 10000){scale 100;}var size new System.Drawing.Size(src.Width / scale, src.Height / scale);ImageBgr, Byte srcNewSize new ImageBgr, byte(size);CvInvoke.Resize(src, srcNewSize, size);//將圖像轉(zhuǎn)換為灰度Emgu.CV.UMat grayImage new Emgu.CV.UMat();CvInvoke.CvtColor(srcNewSize, grayImage, ColorConversion.Bgr2Gray);//使用高斯濾波去除噪聲CvInvoke.GaussianBlur(grayImage, grayImage, new System.Drawing.Size(3, 3), 3);//霍夫圓檢測CircleF[] circles CvInvoke.HoughCircles(grayImage, Emgu.CV.CvEnum.HoughModes.Gradient, 2.0, 200.0, 100.0, 180.0, 5);Rectangle rectangle new Rectangle();float maxRadius 0;foreach (CircleF circle in circles){var center circle.Center;//圓心var radius circle.Radius;//半徑if (radius maxRadius){maxRadius radius;rectangle new Rectangle((int)(center.X - radius) * scale,(int)(center.Y - radius) * scale,(int)radius * 2 * scale scale,(int)radius * 2 * scale scale);}srcNewSize.Draw(circle, new Bgr(System.Drawing.Color.Blue), 4);}//CvInvoke.Imwrite(原始圖片.bmp, srcNewSize); //保存原始圖片if (maxRadius 0){//MessageBox.Show(沒有圓形);}CvInvoke.cvSetImageROI(srcNewSize.Ptr, rectangle);//設(shè)置興趣點(diǎn)—ROIregion of interest var clone srcNewSize.Clone();CvInvoke.Imwrite(newPath, clone); //保存結(jié)果圖src.Dispose();srcNewSize.Dispose();grayImage.Dispose();}/// summary/// 4.圓形提取/// /summarypublic static void ExtractCircle(string oldpath, string newPath){// 加載原始圖片Bitmap originalImage new Bitmap(oldpath);int diameter Math.Min(originalImage.Width, originalImage.Height); // 獲取最小邊長作為直徑int x (originalImage.Width - diameter) / 2; // 計(jì)算起始x坐標(biāo)int y (originalImage.Height - diameter) / 2; // 計(jì)算起始y坐標(biāo)// 創(chuàng)建與圓形大小相等的bitmapBitmap croppedImage new Bitmap(diameter, diameter);using (Graphics g Graphics.FromImage(croppedImage)){g.Clear(Color.LightBlue); // 設(shè)置圓圈外的顏色// 設(shè)置高質(zhì)量插值法g.InterpolationMode InterpolationMode.HighQualityBicubic;// 設(shè)置高質(zhì)量,低速度呈現(xiàn)平滑程度g.SmoothingMode SmoothingMode.HighQuality;g.PixelOffsetMode PixelOffsetMode.HighQuality;g.CompositingQuality CompositingQuality.HighQuality;// 創(chuàng)建一個(gè)圓形路徑using (GraphicsPath path new GraphicsPath()){path.AddEllipse(0, 0, diameter, diameter);// 設(shè)置裁剪區(qū)域?yàn)閳A形路徑g.SetClip(path);// 從原始圖片中繪制圓形區(qū)域到新圖片g.DrawImage(originalImage, new Rectangle(0, 0, diameter, diameter), x, y, diameter, diameter, GraphicsUnit.Pixel);}}// 保存剪切后的圖片croppedImage.Save(newPath, ImageFormat.Jpeg);}/// summary/// 5.像素提取默認(rèn)黑像素/// /summary/// param nameimg/param/// returns/returnspublic static Liststring GetImagePixel(string oldpath)//過濾{// 加載原始圖片Bitmap img new Bitmap(oldpath);//0 黑色//95 深灰//240 淺灰//255 白Listint R new Listint();Listint G new Listint();Listint B new Listint();Liststring xyList new Liststring();for (int y 0; y img.Height; y){for (int x 0; x img.Width; x){var a img.GetPixel(x, y);if (a.R 0 a.G 0 a.B 0){R.Add(img.GetPixel(x, y).R);G.Add(img.GetPixel(x, y).G);B.Add(img.GetPixel(x, y).B);xyList.Add(x | y);}}}return xyList;}/// summary/// 6.魚像素提取/// /summary/// returns/returnspublic static Liststring FishExtract(Liststring data ,string circleImg){for (int i 0; i data.Count; i){var str data[i].Split(|);if (!string.IsNullOrWhiteSpace(data[i])){Bitmap image2 new Bitmap(circleImg);//周邊檢測 6var list GetSurroundingPixels(image2, Convert.ToInt32(str[0]), Convert.ToInt32(str[1]));if (list.Where(a a.R 0 a.G 0 a.B 0).Count() 2)//這是魚像素特征{}else{data[i] string.Empty;//非魚}}}return data;}//像素周邊檢測public static ListFishVision.Model.Pixel GetSurroundingPixels(Bitmap bitmap, int x, int y){var result new ListFishVision.Model.Pixel();int width bitmap.Width;int height bitmap.Height;Color[,] surroundingPixels new Color[3, 3]; // 3x3 grid including the center pixelfor (int i -1; i 1; i) // Loop through the 3x3 grid around the center pixel{for (int j -1; j 1; j){int newX x i;int newY y j;// Check if the new coordinates are within the bounds of the imageif (newX 0 newX width newY 0 newY height){surroundingPixels[i 1, j 1] bitmap.GetPixel(newX, newY);}else{// Optionally, set out-of-bounds pixels to a default color or handle them as neededsurroundingPixels[i 1, j 1] Color.Transparent; // or any other color you prefer}}}// Use surroundingPixels as needed (e.g., print colors)for (int i 0; i 3; i) // Printing the surrounding pixels for demonstration purposes{for (int j 0; j 3; j){var model new FishVision.Model.Pixel();model.X x i - 1;model.Y y j - 1;model.R surroundingPixels[i, j].R;model.G surroundingPixels[i, j].G;model.B surroundingPixels[i, j].B;result.Add(model);//Console.WriteLine($Pixel ({x i - 1}, {y j - 1}): {surroundingPixels[i, j]});}}return result;}/// summary/// 7.魚像素去重/// /summary/// param namelistFish/param/// returns/returnspublic static ListFishModel FishDistinct(ListFishModel listFish){if (listFish ! null listFish.Count() 0){for (int i 0; i listFish.Count; i){listFish[i].FishIndex listFish[i].FishIndex.Distinct().ToList();}}return listFish;}/// summary/// 8.魚像素分組/// /summarypublic static ListFishModel FishGroup(Liststring data){var fish new ListFishModel();//魚像素分組for (int i 0; i data.Count; i){for (int b 0; b data.Count; b){if (!string.IsNullOrWhiteSpace(data[i]) !string.IsNullOrWhiteSpace(data[b])){var data_i_xy data[i].Split(|);var data_b_xy data[b].Split(|);if (AreAdjacent(Convert.ToInt32(data_i_xy[0]), Convert.ToInt32(data_i_xy[1]), Convert.ToInt32(data_b_xy[0]), Convert.ToInt32(data_b_xy[1])))//相鄰的魚像素合并一組{var entity fish.Where(a a.FishIndex.Contains(data[i]) || a.FishIndex.Contains(data[b])).FirstOrDefault();if (entity ! null){entity.FishIndex.Add(data[i]);entity.FishIndex.Add(data[b]);}else{FishModel model new FishModel();model.FishIndex new Liststring();model.FishIndex.Add(data[i]);model.FishIndex.Add(data[b]);fish.Add(model);}}}}}return fish;}/// summary/// 像素是否相鄰/// /summary/// param namex1/param/// param namey1/param/// param namex2/param/// param namey2/param/// returns/returnspublic static bool AreAdjacent(int x1, int y1, int x2, int y2){// 檢查x和y坐標(biāo)之差是否為1這樣可以確保像素是直接相鄰的return (Math.Abs(x1 - x2) 1 Math.Abs(y1 - y2) 1) !(x1 x2 y1 y2);}/// summary/// 9.每條魚的像素群尋找中位值作為軌跡坐標(biāo)/// /summary/// param namelistFish/param/// returns/returnspublic static Liststring FishCenter(ListFishModel listFish){var result new Liststring();if (listFish ! null listFish.Count() 0){for (int i 0; i listFish.Count; i){//取中位值var index -1;if (listFish[i].FishIndex.Count() % 2 0) // 偶數(shù)長度{index listFish[i].FishIndex.Count() / 2;}else // 奇數(shù)長度{index (listFish[i].FishIndex.Count() 1) / 2;}//這條魚中心坐標(biāo)var center listFish[i].FishIndex[index];result.Add(center);}}return result;}/// summary/// 反向二級化/// /summary/// param nameoldpath/param/// param namenewPath/parampublic static void Two_LevelReversal(string oldpath, string newPath){OpenCvSharp.Mat src Cv2.ImRead(oldpath, OpenCvSharp.ImreadModes.Grayscale);OpenCvSharp.Mat dst new OpenCvSharp.Mat();// 反向二值化大于 127 的像素設(shè)為 0其他設(shè)為 255Cv2.Threshold(src, dst, 135, 255, ThresholdTypes.BinaryInv);Cv2.ImWrite(newPath, dst);}/// summary/// 96孔魚苗高光二級化處理/// /summary/// param nameoldpath/param/// param namenewPath/parampublic static void Two_LevelHeight(string oldpath, string newPath){Emgu.CV.Mat image CvInvoke.Imread(oldpath, Emgu.CV.CvEnum.ImreadModes.Grayscale);Emgu.CV.Mat mid2 new Emgu.CV.Mat();CvInvoke.Threshold(image, mid2, 180, 255, ThresholdType.Binary);CvInvoke.Imwrite(newPath, mid2);}/// summary/// 斑點(diǎn)檢測(用不著)/// /summary/// param namemat圖片/param/// param nameresultMat結(jié)果圖片/param/// returns斑點(diǎn)中心點(diǎn)數(shù)據(jù)/returnspublic static KeyPoint[] SimpleblobDetector(OpenCvSharp.Mat mat, out OpenCvSharp.Mat resultMat){// 轉(zhuǎn)化為灰度圖OpenCvSharp.Mat gray new OpenCvSharp.Mat();Cv2.CvtColor(mat, gray, ColorConversionCodes.BGR2GRAY);// 創(chuàng)建SimpleBlobDetector并設(shè)置參數(shù)OpenCvSharp.SimpleBlobDetector.Params parameters new OpenCvSharp.SimpleBlobDetector.Params();parameters.BlobColor 0;//斑點(diǎn)的亮度值取值為0或255默認(rèn)為0表示只檢測黑色斑點(diǎn)。parameters.FilterByArea true; // 是否根據(jù)斑點(diǎn)的面積進(jìn)行過濾默認(rèn)為trueparameters.MinArea 10; // 最小的斑點(diǎn)面積默認(rèn)為25parameters.MaxArea 6000; // 最大的斑點(diǎn)面積默認(rèn)為5000// 創(chuàng)建SimpleBlobDetectorOpenCvSharp.SimpleBlobDetector detector OpenCvSharp.SimpleBlobDetector.Create(parameters);// 檢測斑點(diǎn)KeyPoint[] keypoints detector.Detect(gray);// 在圖像上繪制斑點(diǎn)resultMat new OpenCvSharp.Mat();Cv2.DrawKeypoints(mat, keypoints, resultMat, Scalar.All(-1));return keypoints;}}}