当前位置: 首页 > news >正文

C#图片处理

查找图片所在位置


原理:使用OpenCvSharp对比查找小图片在大图片上的位置

private static System.Drawing.Point Find(Mat BackGround, Mat Identify, double threshold = 0.8)
{using (Mat res = new Mat(BackGround.Rows - Identify.Rows + 1, BackGround.Cols - Identify.Cols + 1, MatType.CV_32FC1)){Mat gref = BackGround.CvtColor(ColorConversionCodes.BGR2GRAY);Mat gtpl = Identify.CvtColor(ColorConversionCodes.BGR2GRAY);Cv2.MatchTemplate(gref, gtpl, res, TemplateMatchModes.CCoeffNormed);Cv2.Threshold(res, res, 0.8, 1.0, ThresholdTypes.Tozero);double minval, maxval;OpenCvSharp.Point minloc, maxloc;Cv2.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc);if (maxval >= threshold){return new System.Drawing.Point(maxloc.X,maxloc.Y);}return new System.Drawing.Point(0, 0);}}

图片转化


引用的博客比较多,这是其中几个引用,其他的找不到原出处了

https://blog.csdn.net/wchstrife/article/details/78984735?ydreferer=aHR0cHM6Ly9jbi5iaW5nLmNvbS8%3D
https://blog.csdn.net/jiangxinyu/article/details/6222322
https://blog.csdn.net/fangyu723/article/details/108240479

界面效果
在这里插入图片描述
在这里插入图片描述
数字提取
在这里插入图片描述
网上找的一张游戏界面图

在这里插入图片描述

    /// <summary>/// 图像处理转换/// </summary>public class ImgConvert{/// <summary>/// 图片脱色(灰度)/// </summary>/// <param name="bitmap"></param>/// <param name="Case"></param>/// <returns></returns>public static Bitmap DeColor(Bitmap bitmap,int Case){int Height = bitmap.Height;int Width = bitmap.Width;Bitmap newBitmap = new Bitmap(Width, Height);Color pixel;for (int x = 0; x < Width; x++)for (int y = 0; y < Height; y++){pixel = bitmap.GetPixel(x, y);int r, g, b, Result = 0;r = pixel.R;g = pixel.G;b = pixel.B;switch (Case){case 0://平均值法Result = ((r + g + b) / 3);break;case 1://最大值法Result = r > g ? r : g;Result = Result > b ? Result : b;break;case 2://加权平均值法1Result = ((int)(0.7 * r) + (int)(0.2 * g) + (int)(0.1 * b));break;case 3://加权平均值法2Result = ((int)(0.3 * r) + (int)(0.59 * g) + (int)(0.11 * b));break;}newBitmap.SetPixel(x, y, Color.FromArgb(Result, Result, Result));}return newBitmap;}/// <summary>/// 图片暗角/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap DarkCorner(Bitmap bitmap){Bitmap newbitmap = bitmap.Clone() as Bitmap;int width = newbitmap.Width;int height = newbitmap.Height;float cx = width / 2;float cy = height / 2;float maxDist = cx * cx + cy * cy;float currDist = 0, factor;Color pixel;for (int i = 0; i < width; i++){for (int j = 0; j < height; j++){currDist = ((float)i - cx) * ((float)i - cx) + ((float)j - cy) * ((float)j - cy);factor = currDist / maxDist;pixel = newbitmap.GetPixel(i, j);int red = (int)(pixel.R * (1 - factor));int green = (int)(pixel.G * (1 - factor));int blue = (int)(pixel.B * (1 - factor));newbitmap.SetPixel(i, j, Color.FromArgb(red, green, blue));}}return newbitmap;}/// <summary>/// 加马赛克/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap Mosaic(Bitmap bitmap){Bitmap newbitmap = bitmap.Clone() as Bitmap;int RIDIO = 20;//马赛克的尺度,默认为周围两个像素for (int h = 0; h < newbitmap.Height; h += RIDIO){for (int w = 0; w < newbitmap.Width; w += RIDIO){int avgRed = 0, avgGreen = 0, avgBlue = 0;int count = 0;//取周围的像素for (int x = w; (x < w + RIDIO && x < newbitmap.Width); x++){for (int y = h; (y < h + RIDIO && y < newbitmap.Height); y++){Color pixel = newbitmap.GetPixel(x, y);avgRed += pixel.R;avgGreen += pixel.G;avgBlue += pixel.B;count++;}}//取平均值avgRed = avgRed / count;avgBlue = avgBlue / count;avgGreen = avgGreen / count;//设置颜色for (int x = w; (x < w + RIDIO && x < newbitmap.Width); x++){for (int y = h; (y < h + RIDIO && y < newbitmap.Height); y++){Color newColor = Color.FromArgb(avgRed, avgGreen, avgBlue);newbitmap.SetPixel(x, y, newColor);}}}}return newbitmap;}/// <summary>/// 底片/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap Negative(Bitmap bitmap){int Height = bitmap.Height;int Width = bitmap.Width;Bitmap newbitmap = new Bitmap(Width, Height);Color pixel;for (int x = 1; x < Width; x++){for (int y = 1; y < Height; y++){int r, g, b;pixel = bitmap.GetPixel(x, y);r = 255 - pixel.R;g = 255 - pixel.G;b = 255 - pixel.B;newbitmap.SetPixel(x, y, Color.FromArgb(r, g, b));}}return newbitmap;}/// <summary>/// 浮雕/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap Relief(Bitmap bitmap){int Height = bitmap.Height;int Width = bitmap.Width;Bitmap newbitmap = new Bitmap(Width, Height);Color pixel1, pixel2;for (int x = 0; x < Width - 1; x++){for (int y = 0; y < Height - 1; y++){int r = 0, g = 0, b = 0;pixel1 = bitmap.GetPixel(x, y);pixel2 = bitmap.GetPixel(x + 1, y + 1);r = Math.Abs(pixel1.R - pixel2.R + 128);g = Math.Abs(pixel1.G - pixel2.G + 128);b = Math.Abs(pixel1.B - pixel2.B + 128);if (r > 255)r = 255;if (r < 0)r = 0;if (g > 255)g = 255;if (g < 0)g = 0;if (b > 255)b = 255;if (b < 0)b = 0;newbitmap.SetPixel(x, y, Color.FromArgb(r, g, b));}}return newbitmap;}/// <summary>/// 图片柔化/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap Soften(Bitmap bitmap){int width = bitmap.Width;int height = bitmap.Height;Bitmap newbitmap = new Bitmap(width, height);Color pixel;//高斯模板int[] Gauss = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };for (int x = 1; x < width - 1; x++)for (int y = 1; y < height - 1; y++){int r = 0, g = 0, b = 0;int Index = 0;for (int col = -1; col <= 1; col++)for (int row = -1; row <= 1; row++){pixel = bitmap.GetPixel(x + row, y + col);r += pixel.R * Gauss[Index];g += pixel.G * Gauss[Index];b += pixel.B * Gauss[Index];Index++;}r /= 16;g /= 16;b /= 16;//处理颜色值溢出r = r > 255 ? 255 : r;r = r < 0 ? 0 : r;g = g > 255 ? 255 : g;g = g < 0 ? 0 : g;b = b > 255 ? 255 : b;b = b < 0 ? 0 : b;newbitmap.SetPixel(x - 1, y - 1, Color.FromArgb(r, g, b));}return newbitmap;}/// <summary>/// 图片锐化/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap Sharpen(Bitmap bitmap){int Width = bitmap.Width;int Height = bitmap.Height;Bitmap newBitmap = new Bitmap(Width, Height);Color pixel;//拉普拉斯模板int[] Laplacian = { -1, -1, -1, -1, 9, -1, -1, -1, -1 };for (int x = 1; x < Width - 1; x++){for (int y = 1; y < Height - 1; y++){int r = 0, g = 0, b = 0;int Index = 0;for (int col = -1; col <= 1; col++)for (int row = -1; row <= 1; row++){pixel = bitmap.GetPixel(x + row, y + col); r += pixel.R * Laplacian[Index];g += pixel.G * Laplacian[Index];b += pixel.B * Laplacian[Index];Index++;}//处理颜色值溢出r = r > 255 ? 255 : r;r = r < 0 ? 0 : r;g = g > 255 ? 255 : g;g = g < 0 ? 0 : g;b = b > 255 ? 255 : b;b = b < 0 ? 0 : b;newBitmap.SetPixel(x - 1, y - 1, Color.FromArgb(r, g, b));}}return newBitmap;}/// <summary>/// 图片雾化/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap Nebulization(Bitmap bitmap){int Width = bitmap.Width;int Height = bitmap.Height;Bitmap newBitmap = new Bitmap(Width, Height);Color pixel;for (int x = 1; x < Width - 1; x++){for (int y = 1; y < Height - 1; y++){System.Random MyRandom = new Random();int k = MyRandom.Next(123456);//像素块大小int dx = x + k % 19;int dy = y + k % 19;if (dx >= Width)dx = Width - 1;if (dy >= Height)dy = Height - 1;pixel = bitmap.GetPixel(dx, dy);newBitmap.SetPixel(x, y, pixel);}}  return newBitmap;}/// <summary>/// 翻转/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap TurnOver(Bitmap bitmap){Bitmap newbitmap = bitmap.Clone() as Bitmap;newbitmap.RotateFlip(RotateFlipType.Rotate90FlipNone);return newbitmap;}/// <summary>/// 直方图均衡化/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap HistAverage(Bitmap bitmap){Bitmap newbitmap = bitmap.Clone() as Bitmap;int iw = bitmap.Width, ih = bitmap.Height;int[] hist = ImgConvertHelper.GetHist(bitmap, iw, ih);Color c = new Color();double p = (double)255 / (iw * ih);double[] sum = new double[256];int[] outg = new int[256];int r, g, b;sum[0] = hist[0];for (int i = 1; i < 256; i++)sum[i] = sum[i - 1] + hist[i];//灰度变换:i-->outg[i]	for (int i = 0; i < 256; i++)outg[i] = (int)(p * sum[i]);for (int j = 0; j < ih; j++){for (int i = 0; i < iw; i++){r = (newbitmap.GetPixel(i, j)).R;g = (newbitmap.GetPixel(i, j)).G;b = (newbitmap.GetPixel(i, j)).B;c = Color.FromArgb(outg[r], outg[g], outg[b]);bitmap.SetPixel(i, j, c);}}return newbitmap;}/ <summary>/ 对比度扩展/ </summary>/ <param name="bitmap"></param>/ <returns></returns>//public static Bitmap Contrast(Bitmap bitmap)//{//    Bitmap newbitmap = bitmap.Clone() as Bitmap;//    int x1 = Convert.ToInt32(dialog.getX01);//    int y1 = Convert.ToInt32(dialog.getY01);//    int x2 = Convert.ToInt32(dialog.getX02);//    int y2 = Convert.ToInt32(dialog.getY02);//    //计算灰度映射表//    int[] pixMap = pixelsMap(x1, y1, x2, y2);//    //线性拉伸//    bm = stretch(bm, pixMap, iw, ih);//    return newbitmap;//}/// <summary>/// 3 X 3 阈值滤波/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap ThresholdFilter(Bitmap bitmap){int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = bitmap.Clone() as Bitmap;int avr,          //灰度平均 sum,          //灰度和num = 0,      //计数器nT = 4,       //计数器阈值T = 50;       //阈值int pij, pkl,     //(i,j),(i+k,j+l)处灰度值err;          //误差for (int j = 1; j < ih - 1; j++){for (int i = 1; i < iw - 1; i++){//取3×3块的9个象素, 求和sum = 0;for (int k = -1; k < 2; k++){for (int l = -1; l < 2; l++){if ((k != 0) || (l != 0)){pkl = (bitmap.GetPixel(i + k, j + l)).R;pij = (bitmap.GetPixel(i, j)).R;err = Math.Abs(pkl - pij);sum = sum + pkl;if (err > T) num++;}}}avr = (int)(sum / 8.0f);         //平均值if (num > nT)newbitmap.SetPixel(i, j, Color.FromArgb(avr, avr, avr));}}return newbitmap;}/// <summary>/// 均值滤波/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap AverageFilter(Bitmap bitmap){int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = bitmap.Clone() as Bitmap;for (int j = 1; j < ih - 1; j++){for (int i = 1; i < iw - 1; i++){int avr;int avr1;int avr2;int sum = 0;int sum1 = 0;int sum2 = 0;for (int k = -1; k <= 1; k++){for (int l = -1; l <= 1; l++){sum = sum + (bitmap.GetPixel(i + k, j + 1).R);sum1 = sum1 + (bitmap.GetPixel(i + k, j + 1).G);sum2 = sum2 + (bitmap.GetPixel(i + k, j + 1).B);}}avr = (int)(sum / 9.0f);avr1 = (int)(sum1 / 9.0f);avr2 = (int)(sum2 / 9.0f);newbitmap.SetPixel(i, j, Color.FromArgb(avr, avr1, avr2));}}return newbitmap;}/// <summary>/// 中值滤波/// </summary>/// <param name="bitmap"></param>/// <param name="n"></param>/// <returns></returns>public static Bitmap MedianFilter(Bitmap bitmap,int n){int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = bitmap.Clone() as Bitmap;for (int j = 2; j < ih - 2; j++){int[] dt;int[] dt1;int[] dt2;for (int i = 2; i < iw - 2; i++){int m = 0, r = 0, r1 = 0, r2 = 0, a = 0, b = 0;if (n == 3){dt = new int[25];dt1 = new int[25];dt2 = new int[25];//取5×5块的25个象素for (int k = -2; k < 3; k++){for (int l = -2; l < 3; l++){//取(i+k,j+l)处的象素,赋于数组dtdt[m] = (bitmap.GetPixel(i + k, j + l)).R;dt1[a] = (bitmap.GetPixel(i + k, j + l)).G;dt2[b] = (bitmap.GetPixel(i + k, j + l)).B;m++;a++;b++;}}//冒泡排序,输出中值r = ImgConvertHelper.MedianSorter(dt, 25); //中值      r1 = ImgConvertHelper.MedianSorter(dt1, 25);r2 = ImgConvertHelper.MedianSorter(dt2, 25);}else if (n == 1){dt = new int[5];//取1×5窗口5个像素dt[0] = (bitmap.GetPixel(i, j - 2)).R;dt[1] = (bitmap.GetPixel(i, j - 1)).R;dt[2] = (bitmap.GetPixel(i, j)).R;dt[3] = (bitmap.GetPixel(i, j + 1)).R;dt[4] = (bitmap.GetPixel(i, j + 2)).R;r = ImgConvertHelper.MedianSorter(dt, 5);   //中值dt1 = new int[5];//取1×5窗口5个像素dt1[0] = (bitmap.GetPixel(i, j - 2)).G;dt1[1] = (bitmap.GetPixel(i, j - 1)).G;dt1[2] = (bitmap.GetPixel(i, j)).G;dt1[3] = (bitmap.GetPixel(i, j + 1)).G;dt1[4] = (bitmap.GetPixel(i, j + 2)).G;r1 = ImgConvertHelper.MedianSorter(dt1, 5);   //中值   dt2 = new int[5];//取1×5窗口5个像素dt2[0] = (bitmap.GetPixel(i, j - 2)).B;dt2[1] = (bitmap.GetPixel(i, j - 1)).B;dt2[2] = (bitmap.GetPixel(i, j)).B;dt2[3] = (bitmap.GetPixel(i, j + 1)).B;dt2[4] = (bitmap.GetPixel(i, j + 2)).B;r2 = ImgConvertHelper.MedianSorter(dt2, 5);   //中值                           }else if (n == 2){dt = new int[5];//取5×1窗口5个像素dt[0] = (bitmap.GetPixel(i - 2, j)).R;dt[1] = (bitmap.GetPixel(i - 1, j)).R;dt[2] = (bitmap.GetPixel(i, j)).R;dt[3] = (bitmap.GetPixel(i + 1, j)).R;dt[4] = (bitmap.GetPixel(i + 2, j)).R;r = ImgConvertHelper.MedianSorter(dt, 5);  //中值 dt = new int[5];//取5×1窗口5个像素dt1 = new int[5];dt1[0] = (bitmap.GetPixel(i - 2, j)).G;dt1[1] = (bitmap.GetPixel(i - 1, j)).G;dt1[2] = (bitmap.GetPixel(i, j)).G;dt1[3] = (bitmap.GetPixel(i + 1, j)).G;dt1[4] = (bitmap.GetPixel(i + 2, j)).G;r1 = ImgConvertHelper.MedianSorter(dt1, 5);  //中值       //取5×1窗口5个像素dt2 = new int[5];dt2[0] = (bitmap.GetPixel(i - 2, j)).B;dt2[1] = (bitmap.GetPixel(i - 1, j)).B;dt2[2] = (bitmap.GetPixel(i, j)).B;dt2[3] = (bitmap.GetPixel(i + 1, j)).B;dt2[4] = (bitmap.GetPixel(i + 2, j)).B;r2 = ImgConvertHelper.MedianSorter(dt2, 5);  //中值       }newbitmap.SetPixel(i, j, Color.FromArgb(r, r1, r2));         //输出                  }}return newbitmap;}/// <summary>/// 3×3 低通滤波/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap LowpassFilter(Bitmap bitmap, int n){int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = bitmap.Clone() as Bitmap;int[,] h;//定义扩展输入图像矩阵int[,] ex_inpix = ImgConvertHelper.Exinpix(bitmap, iw, ih);//低通滤波for (int j = 1; j < ih + 1; j++){for (int i = 1; i < iw + 1; i++){int r = 0, sum = 0;//低通模板		h = ImgConvertHelper.LowMatrix(n);//求3×3窗口9个像素加权和for (int k = -1; k < 2; k++)for (int l = -1; l < 2; l++)sum = sum + h[k + 1, l + 1] * ex_inpix[i + k, j + l];if (n == 1)r = (int)(sum / 9);       //h1平均值else if (n == 2)r = (int)(sum / 10);      //h2else if (n == 3)r = (int)(sum / 16);      //h3 newbitmap.SetPixel(i - 1, j - 1, Color.FromArgb(r, r, r));    //输出                    }}return newbitmap;}/// <summary>/// Kirsch锐化/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap KirschSharpen(Bitmap bitmap){int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = bitmap.Clone() as Bitmap;Color c = new Color();int i, j, r;int[,] inr = new int[iw, ih]; //红色分量矩阵int[,] ing = new int[iw, ih]; //绿色分量矩阵int[,] inb = new int[iw, ih]; //蓝色分量矩阵int[,] gray = new int[iw, ih];//灰度图像矩阵	//转变为灰度图像矩阵for (j = 0; j < ih; j++){for (i = 0; i < iw; i++){c = bitmap.GetPixel(i, j);inr[i, j] = c.R;ing[i, j] = c.G;inb[i, j] = c.B;gray[i, j] = (int)((c.R + c.G + c.B) / 3.0);}}int[,] kir0 = {{ 5, 5, 5},{-3, 0,-3},{-3,-3,-3}},//kir0kir1 =  {{-3, 5, 5},{-3, 0, 5},{-3,-3,-3}},//kir1kir2 = {{-3,-3, 5},{-3, 0, 5},{-3,-3, 5}},//kir2kir3 = {{-3,-3,-3},{-3, 0, 5},{-3, 5, 5}},//kir3kir4 = {{-3,-3,-3},{-3, 0,-3},{ 5, 5, 5}},//kir4kir5 = {{-3,-3,-3},{ 5, 0,-3},{ 5, 5,-3}},//kir5kir6 = {{ 5,-3,-3},{ 5, 0,-3},{ 5,-3,-3}},//kir6kir7 = {{ 5, 5,-3},{ 5, 0,-3},{-3,-3,-3}};//kir7	//边缘检测int[,] edge0 = new int[iw, ih];int[,] edge1 = new int[iw, ih];int[,] edge2 = new int[iw, ih];int[,] edge3 = new int[iw, ih];int[,] edge4 = new int[iw, ih];int[,] edge5 = new int[iw, ih];int[,] edge6 = new int[iw, ih];int[,] edge7 = new int[iw, ih];edge0 = ImgConvertHelper.EdgeEnhance(gray, kir0, iw, ih);edge1 = ImgConvertHelper.EdgeEnhance(gray, kir1, iw, ih);edge2 = ImgConvertHelper.EdgeEnhance(gray, kir2, iw, ih);edge3 = ImgConvertHelper.EdgeEnhance(gray, kir3, iw, ih);edge4 = ImgConvertHelper.EdgeEnhance(gray, kir4, iw, ih);edge5 = ImgConvertHelper.EdgeEnhance(gray, kir5, iw, ih);edge6 = ImgConvertHelper.EdgeEnhance(gray, kir6, iw, ih);edge7 = ImgConvertHelper.EdgeEnhance(gray, kir7, iw, ih);int[] tem = new int[8];int max;for (j = 0; j < ih; j++){for (i = 0; i < iw; i++){tem[0] = edge0[i, j];tem[1] = edge1[i, j];tem[2] = edge2[i, j];tem[3] = edge3[i, j];tem[4] = edge4[i, j];tem[5] = edge5[i, j];tem[6] = edge6[i, j];tem[7] = edge7[i, j];max = 0;for (int k = 0; k < 8; k++)if (tem[k] > max) max = tem[k];if (max > 255) max = 255;r = 255 - max;newbitmap.SetPixel(i, j, Color.FromArgb(r, r, r));}}return newbitmap;}/// <summary>/// Laplace锐化/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap LaplaceSharpen(Bitmap bitmap){int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = bitmap.Clone() as Bitmap;Color c = new Color();int i, j, r;int[,] inr = new int[iw, ih]; //红色分量矩阵int[,] ing = new int[iw, ih]; //绿色分量矩阵int[,] inb = new int[iw, ih]; //蓝色分量矩阵int[,] gray = new int[iw, ih];//灰度图像矩阵	//转变为灰度图像矩阵for (j = 0; j < ih; j++){for (i = 0; i < iw; i++){c = bitmap.GetPixel(i, j);inr[i, j] = c.R;ing[i, j] = c.G;inb[i, j] = c.B;gray[i, j] = (int)((c.R + c.G + c.B) / 3.0);}}int[,] lap1 = {{ 1, 1, 1},{ 1,-8, 1},{ 1, 1, 1}};//边缘增强int[,] edge = ImgConvertHelper.EdgeEnhance(gray, lap1, iw, ih);for (j = 0; j < ih; j++){for (i = 0; i < iw; i++){r = edge[i, j];if (r > 255) r = 255;if (r < 0) r = 0;c = Color.FromArgb(r, r, r);newbitmap.SetPixel(i, j, c);}}return newbitmap;}/// <summary>/// Prewitt锐化/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap PrewittSharpen(Bitmap bitmap){int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = bitmap.Clone() as Bitmap;Color c = new Color();int i, j, r;int[,] inr = new int[iw, ih]; //红色分量矩阵int[,] ing = new int[iw, ih]; //绿色分量矩阵int[,] inb = new int[iw, ih]; //蓝色分量矩阵int[,] gray = new int[iw, ih];//灰度图像矩阵	//转变为灰度图像矩阵for (j = 0; j < ih; j++){for (i = 0; i < iw; i++){c = bitmap.GetPixel(i, j);inr[i, j] = c.R;ing[i, j] = c.G;inb[i, j] = c.B;gray[i, j] = (int)((c.R + c.G + c.B) / 3.0);}}//Prewitt算子D_x模板int[,] pre1 = {{ 1, 0,-1},{ 1, 0,-1},{ 1, 0,-1}};//Prewitt算子D_y模板int[,] pre2 = {{ 1, 1, 1},{ 0, 0, 0},{-1,-1,-1}};int[,] edge1 = ImgConvertHelper.EdgeEnhance(gray, pre1, iw, ih);int[,] edge2 = ImgConvertHelper.EdgeEnhance(gray, pre2, iw, ih);for (j = 0; j < ih; j++){for (i = 0; i < iw; i++){r = Math.Max(edge1[i, j], edge2[i, j]);if (r > 255) r = 255;c = Color.FromArgb(r, r, r);newbitmap.SetPixel(i, j, c);}}return newbitmap;}/// <summary>/// Roberts锐化/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap RobertsSharpen(Bitmap bitmap){int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = bitmap.Clone() as Bitmap;int r, r0, r1, r2, r3, g, g0, g1, g2, g3, b, b0, b1, b2, b3;int[,] inr = new int[iw, ih];//红色分量矩阵int[,] ing = new int[iw, ih];//绿色分量矩阵int[,] inb = new int[iw, ih];//蓝色分量矩阵int[,] gray = new int[iw, ih];//灰度图像矩阵	             for (int j = 1; j < ih - 1; j++){for (int i = 1; i < iw - 1; i++){r0 = (bitmap.GetPixel(i, j)).R;r1 = (bitmap.GetPixel(i, j + 1)).R;r2 = (bitmap.GetPixel(i + 1, j)).R;r3 = (bitmap.GetPixel(i + 1, j + 1)).R;r = (int)Math.Sqrt((r0 - r3) * (r0 - r3) + (r1 - r2) * (r1 - r2));g0 = (bitmap.GetPixel(i, j)).G;g1 = (bitmap.GetPixel(i, j + 1)).G;g2 = (bitmap.GetPixel(i + 1, j)).G;g3 = (bitmap.GetPixel(i + 1, j + 1)).G;g = (int)Math.Sqrt((g0 - g3) * (g0 - g3) + (g1 - g2) * (g1 - g2));b0 = (bitmap.GetPixel(i, j)).B;b1 = (bitmap.GetPixel(i, j + 1)).B;b2 = (bitmap.GetPixel(i + 1, j)).B;b3 = (bitmap.GetPixel(i + 1, j + 1)).B;b = (int)Math.Sqrt((b0 - b3) * (b0 - b3)+ (b1 - b2) * (b1 - b2));if (r < 0)r = 0;                                       //黑色,边缘点if (r > 255)r = 255;newbitmap.SetPixel(i, j, Color.FromArgb(r, r, r));}}return newbitmap;}/// <summary>/// Sobel锐化/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap SobelSharpen(Bitmap bitmap){int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = bitmap.Clone() as Bitmap;Color c = new Color();int i, j, r;int[,] inr = new int[iw, ih]; //红色分量矩阵int[,] ing = new int[iw, ih]; //绿色分量矩阵int[,] inb = new int[iw, ih]; //蓝色分量矩阵int[,] gray = new int[iw, ih];//灰度图像矩阵	//转变为灰度图像矩阵for (j = 0; j < ih; j++){for (i = 0; i < iw; i++){c = bitmap.GetPixel(i, j);inr[i, j] = c.R;ing[i, j] = c.G;inb[i, j] = c.B;gray[i, j] = (int)((c.R + c.G + c.B) / 3.0);}}int[,] sob1 = {{ 1, 0,-1},{ 2, 0,-2},{ 1, 0,-1}};int[,] sob2 = {{ 1, 2, 1},{ 0, 0, 0},{-1,-2,-1}};int[,] edge1 = ImgConvertHelper.EdgeEnhance(gray, sob1, iw, ih);int[,] edge2 = ImgConvertHelper.EdgeEnhance(gray, sob2, iw, ih);for (j = 0; j < ih; j++){for (i = 0; i < iw; i++){r = Math.Max(edge1[i, j], edge2[i, j]);if (r > 255) r = 255;c = Color.FromArgb(r, r, r);newbitmap.SetPixel(i, j, c);}}return newbitmap;}/// <summary>/// 透明化/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public static Bitmap Transparent(Bitmap bitmap){int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = new Bitmap(iw, ih);int alpha = 0;Color demo;Color pixel;for (int x = 0; x < iw; x++){for (int y = 0; y < ih; y++){demo = bitmap.GetPixel(1, 1);pixel = bitmap.GetPixel(x, y);int R = demo.R;int G = demo.G;int B = demo.B;int r1 = pixel.R;int g1 = pixel.G;int b1 = pixel.B;int a = 40;  //RGB误差范围if (Math.Abs(R - r1) < a && Math.Abs(G - g1) < a && Math.Abs(B - b1) < a){alpha = 0;  //RGB在色差范围内,透明度为0}else{alpha = 255;}newbitmap.SetPixel(x, y, Color.FromArgb(alpha, r1, g1, b1));}}return newbitmap;}/// <summary>/// 指定颜色透明化/// </summary>/// <param name="bitmap"></param>/// <param name="R"></param>/// <param name="G"></param>/// <param name="B"></param>/// <returns></returns>public static Bitmap Transparent(Bitmap bitmap, int R, int G, int B){int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = new Bitmap(iw, ih);int alpha = 0;Color pixel;for (int x = 0; x < iw; x++){for (int y = 0; y < ih; y++){pixel = bitmap.GetPixel(x, y);int r1 = pixel.R;int g1 = pixel.G;int b1 = pixel.B;int a = 40;  //色差范围值if (Math.Abs(R - r1) < a && Math.Abs(G - g1) < a && Math.Abs(B - b1) < a){alpha = 0;    //若两种颜色比较接近,透明度设为0}else{alpha = 255;}newbitmap.SetPixel(x, y, Color.FromArgb(alpha, r1, g1, b1));}}return newbitmap;}/// <summary>/// 指定颜色替换/// </summary>/// <param name="bitmap"></param>/// <param name="R"></param>/// <param name="G"></param>/// <param name="B"></param>/// <param name="newR"></param>/// <param name="newG"></param>/// <param name="newB"></param>/// <returns></returns>public static Bitmap ColorReplace(Bitmap bitmap, int R, int G, int B, int newR, int newG, int newB){int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = new Bitmap(iw, ih);Color pixel;for (int x = 0; x < iw; x++){for (int y = 0; y < ih; y++){pixel = bitmap.GetPixel(x, y);int r1 = pixel.R;int g1 = pixel.G;int b1 = pixel.B;int a = 40;if (Math.Abs(R - r1) < a && Math.Abs(G - g1) < a && Math.Abs(B - b1) < a){newbitmap.SetPixel(x, y, Color.FromArgb(newR, newG, newB));}else{newbitmap.SetPixel(x, y, Color.FromArgb(r1, g1, b1));}}}return newbitmap;}/// <summary>/// 指定颜色保留(其余透明化)/// </summary>/// <param name="bitmap"></param>/// <param name="R"></param>/// <param name="G"></param>/// <param name="B"></param>/// <returns></returns>public static Bitmap ColorRetain(Bitmap bitmap, int R, int G, int B){// 色差值int difference = 40;int iw = bitmap.Width, ih = bitmap.Height;Bitmap newbitmap = new Bitmap(iw, ih);int alpha = 0;Color pixel;for (int x = 0; x < iw; x++){for (int y = 0; y < ih; y++){pixel = bitmap.GetPixel(x, y);int r1 = pixel.R;int g1 = pixel.G;int b1 = pixel.B;if (Math.Abs(R - r1) < difference && Math.Abs(G - g1) < difference && Math.Abs(B - b1) < difference){alpha = 0;r1 = 0;b1 = 0;g1 = 0;}else{alpha = 255;r1 = 255;b1 = 255;g1 = 255;}newbitmap.SetPixel(x, y, Color.FromArgb(alpha, r1, g1, b1));}}return newbitmap;}}

我的代码
https://download.csdn.net/download/qq_21703215/88055234

相关文章:

C#图片处理

查找图片所在位置 原理&#xff1a;使用OpenCvSharp对比查找小图片在大图片上的位置 private static System.Drawing.Point Find(Mat BackGround, Mat Identify, double threshold 0.8) {using (Mat res new Mat(BackGround.Rows - Identify.Rows 1, BackGround.Cols - Iden…...

php 开发微信 h5 支付 APIv3 接入超详细流程

✨ 目录 &#x1f388; 申请商户号&#x1f388; 申请商户证书&#x1f388; 设置V3密钥&#x1f388; 开通H5支付&#x1f388; 设置支付域名&#x1f388; SDK 下载&#x1f388; 第一次下载平台证书&#x1f388;非第一次下载平台证书&#x1f388; H5下单 &#x1f388; 申…...

HTML学习 第一部分(前端学习)

参考学习网站: 网页简介 (w3schools.com) 我的学习思路是&#xff1a;网站实践视频。 视频很重要的&#xff0c;因为它会给你一种开阔思路的方式。你会想&#xff0c;噢&#xff01;原来还可以这样。这是书本或者网站教程 所不能教给你的。而且&#xff0c;对一些教程&#…...

python 实现串口指令通讯

上一篇文章文章写了串口数据的读取&#xff0c;这篇文章讲串口数据的写入&#xff08;指令控制&#xff09; 与下位机通信往往需要十六进制形式进行数据通信&#xff0c;根据设备串口通信指令文档进行指令通信&#xff0c;本篇以灯光控制为例&#xff1a; 1.pyserial模块封装…...

pytorch深度学习逻辑回归 logistic regression

# logistic regression 二分类 # 导入pytorch 和 torchvision import numpy as np import torch import torchvision from torch.autograd import Variable import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import matplotlib.pyplot as …...

数据仓库建设-数仓分层

数据仓库能够帮助企业做出更好的决策&#xff0c;提高业务效率和效益&#xff1b;在数据仓库建设时&#xff0c;绕不开的话题就是数仓分层。 一、数据分层的好处 1. 降低数据开发成本 通用的业务逻辑加工好&#xff0c;后续的开发任务可以基于模型快速使用&#xff0c;数据需…...

共享与协作:时下最热门的企业共享网盘推荐!

现代企业面临着越来越大的数据存储和共享压力。为了提高公司的生产力和效率&#xff0c;许多企业开始寻找共享网盘解决方案。这些共享网盘平台可以帮助企业集中管理文件和数据&#xff0c;并方便快速地与同事、客户或供应商共享。以下是几款好用的企业共享网盘。 Zoho Workdriv…...

mysql取24小时数据

MySQL是一种常用的关系型数据库管理系统。在进行实时数据处理时&#xff0c;我们常常需要查询最近24小时的数据来进行分析和处理。下面我们将介绍如何使用MySQL查询最近24小时的数据。 SELECT * FROM table_name WHERE timestamp_column > DATE_SUB(NOW(), INTERVAL 24 HOU…...

TCP/IP网络编程 第十五章:套接字和标准I/O

标准I/O函数的优点 标准I/O函数的两个优点 将标准I/O函数用于数据通信并非难事。但仅掌握函数使用方法并没有太大意义&#xff0c;至少应该 了解这些函数具有的优点。下面列出的是标准I/O函数的两大优点: □标准I/O函数具有良好的移植性(Portability) □标准I/O函数可以利用缓…...

SaleSmartly,客户满意度调查的绝对好助手

企业使用客户满意度调查来收集反馈并评估客户满意度水平&#xff0c;包括有关产品质量、服务、支持和整体满意度的问题。客户满意度调查的主要目标是直接从客户那里收集有价值的见解&#xff0c;以了解他们的需求、偏好和期望。这种反馈可以帮助企业确定需要改进的领域&#xf…...

MySQL高阶语句

文章目录 一.常用查询1.按关键字排序&#xff08;ORDER BY 语句&#xff09;1.1 语法格式1.2 ASC和DESC的排序概念1.3 举例1.3.1 数据库有一张info表&#xff0c;记录了学生的id&#xff0c;姓名&#xff0c;分数&#xff0c;地址和爱好1.3.2 按分数排序&#xff0c;默认不指定…...

手机快充协议

高通:QC2.0、QC3.0、QC3.5、QC4.0、QC5.0、 FCP、SCP、AFC、SFCP、 MTKPE1.1/PE2.0/PE3.0、TYPEC、PD2.0、PD3.0/3.1、VOOC 支持 PD3.0/PD2.0 支持 QC3.0/QC2.0 支持 AFC 支持 FCP 支持 PE2.0/PE1.1 联发科的PE&#xff08;Pump Express&#xff09;/PE 支持 SFCP 在PP…...

centos 7升级gcc到10.5.0

目录 1、安装gcc 1.1、查看是否含有gcc及gcc版本 1.2、快速安装gcc 2、升级gcc 2.1、下载gcc源码包并解压缩 2.2、下载编译依赖项 2.3、新建gcc-bulid目录&#xff08;与gcc-10.5.0同级&#xff09;并进入该目录中 2.4、生成Makefile文件 2.5、开始编译 2.6、安装 2…...

从脚手架搭建到部署访问路程梳理

1、vue-cli 起文件&#xff1a; 2、配置 webpack &#xff1a;打包配置等&#xff0c;env文件&#xff08; 处理线上和测试的ip&#xff09;&#xff0c; https://www.ibashu.cn/news/show_377892.html 3、样式&#xff1a;封装 style &#xff1a;组件&#xff08;element-u…...

数据库应用:MySQL数据库SQL高级语句与操作

目录 一、理论 1.克隆表与清空表 2.SQL高级语句 3.SQL函数 4.SQL高级操作 5.MySQL中6种常见的约束 二、实验 1.克隆表与清空表 2.SQL高级语句 3.SQL函数 4.SQL高级操作 5.主键表和外键表 三、总结 一、理论 1.克隆表与清空表 克隆表&#xff1a;将数据表的数据记录…...

xshell连接WSL2

1. 卸载 ssh server sudo apt-get remove openssh-server2. 安装 ssh server sudo apt-get install openssh-server3. 修改 ssh server 配置 sudo vim /etc/ssh/sshd_config需要修改以下几项&#xff1a; Port 2222 #默认的是22&#xff0c;但是windows有自己的ssh服务&am…...

Flask新手教程

Flask简介 Flask是一个轻量级的可定制框架&#xff0c;使用Python语言编写&#xff0c;较其他同类型框架更为灵活、轻便、安全且容易上手。 Flask 可以很好地结合MVC模式进行开发&#xff0c;开发人员分工合作&#xff0c;小型团队在短时间内就可以完成功能丰富的中小型网站或…...

拼多多API接口,百亿补贴商品详情页面采集

电商API的数据类型 电商API提供的数据种类多样&#xff0c;一般可分为以下几类&#xff1a; 1.商品数据&#xff1a;商品ID、商品名称、商品价格、库存等。 2.交易数据&#xff1a;订单号、付款时间、收货人等。 3.店铺数据&#xff1a;店铺ID、店铺名称、开店时间、店铺评…...

C++入门(未完待续)

1.命名空间 使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名冲突或名字污染 定义命名空间&#xff0c;需要使用到namespace关键字&#xff0c;后面跟命名空间的名字&#xff0c;然后接一对{}即可&#xff0c;{}中即为命名空间的成员 ①.普通的命名空间 n…...

Python爬虫学习笔记(四)————XPath解析

目录 0.xpath最新下载地址和安装教程 1.xpath安装 2.xpath基本使用 3.xpath基本语法 4.实例 &#xff08;1&#xff09;xpath解析本地文件 &#xff08;2&#xff09;xpath解析服务器响应的数据 ①获取百度网站的“百度一下”四个字 ②获取站长素材网站情侣图片前十页的…...

AI图片售卖:是暴利新风口还是虚幻泡沫?哪些平台适合售卖AI图片

还记得去年大火的Midjourney吗&#xff1f;今年4月&#xff0c;Midjourney又发布了备受期待的V7版本&#xff0c;带来了更高的图像质量和创新功能。使用Midjourney、Stable Diffusion、DALLE等AI图片生成工具&#xff0c;创作者只需输入关键词即可获得高质量的原创图片。这一变…...

html、css(javaweb第一天)

HTML: 文字、图片、视频组成 由标签组成的语言 行内标签span//无语意 <img src"url">//图片 <a herf"url" target"是否开新页面">点击谁</a>//超链接 <video src"url" controls></video>//controls播放…...

Python训练营打卡Day42

知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 1. 回调函数&#xff08;Callback Function&#xff09; 回调函数是作为参数传递给另一个函数的函数&#xff0c;目的是在某个事件发生后执行。 def fetch_data(callback):# 模拟数据获取data {&quo…...

八股学习-JS的闭包

一.闭包的定义 闭包是指函数和其周围的词法环境的引用的组合。 简单来说&#xff0c;就是函数可以记住并访问其在定义时的作用域内的变量&#xff0c;即使该函数在其它作用域调用。 也就是说&#xff0c;闭包让你可以在一个内层函数中访问到其外层函数的作用域。 function …...

Ctrl+R 运行xxx.exe,发现有如下问题.

CtrlR 运行xxx.exe,发现有如下问题. (1)找不到Qt5Core.all,Qt5Cored.dll,Qt5Gui.dll,Qt5Guid.dll,Qt5Widgets.all,Qt5Widgetsd.dll? (2)之后找不到libwinpthread-1.dll 从这个目录拷贝相应的库到运行xx.exe目录下 方法二:将库路径添加到系统PATH环境变量里: 在Path中添加路…...

实现单例模式的常见方式

前言 java有多种设计模式&#xff0c;如下图所示&#xff1a; 单例模式它确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 1、单例模式介绍 1.1、使用原因 为什么要使用单例模式&#xff1f; 1. 控制资源访问 核心价值&#xff1a;确保对共享资源&#xff08;如…...

Linux top 命令 的使用总结

以下是 Linux top 命令 的使用总结,按功能分类整理,方便快速查询: 一、命令行参数 参数描述示例-d <秒数>设置刷新间隔时间top -d 2(每2秒刷新)-p <PID>监控指定进程IDtop -p 1234(仅显示PID为1234的进程)-u <用户名>显示指定用户的进程top -u root(…...

3.2 HarmonyOS NEXT跨设备任务调度与协同实战:算力分配、音视频协同与智能家居联动

HarmonyOS NEXT跨设备任务调度与协同实战&#xff1a;算力分配、音视频协同与智能家居联动 在万物互联的全场景时代&#xff0c;设备间的高效协同是释放分布式系统潜力的关键。HarmonyOS NEXT通过分布式任务调度技术&#xff0c;实现了跨设备算力动态分配与任务无缝流转&#…...

Linux配置yum 时间同步服务 关闭防火墙 关闭ESlinux

1、配置yum 1.1、Could not resolve host: mirrorlist.centos.org; 未知的错误 https://blog.csdn.net/fansfi/article/details/146369946?fromshareblogdetail&sharetypeblogdetail&sharerId146369946&sharereferPC&sharesourceRockandrollman&sharefr…...

影楼精修-AI衣服祛褶皱算法解析

注&#xff1a;为避免侵权&#xff0c;本文所用图像均为AIGC生成或无版权网站提供&#xff1b; 衣服祛褶皱功能&#xff0c;目前在像素蛋糕、美图云修、百度网盘AI修图、阿里云都有相关的功能支持&#xff0c;它的价值就是将不平整的衣服图像&#xff0c;变得整齐平整&#xf…...