private void SetInputPattern(EffImage src) { Layer layer = CNN.Layers.First(); int width = src.Width; int height = src.Height; double[] array = new double[width * height]; double num = -1.0; double value = 1.0; double num2 = 255.0 / (Math.Abs(num) + Math.Abs(value)); for (int i = 0; i < array.Length; i++) { array[i] = num; } int num3 = 0; for (int j = 0; j < height; j++) { for (int k = 0; k < width; k++) { Color color = src.At(k, j); int num4 = color.R + color.G + color.B; num4 /= 3; array[num3] = (double)(255 - num4) / num2 - 1.0; num3++; } } for (int l = 0; l < layer.NeuronCount; l++) { layer.Neurons[l].Output = array[l]; } }
public void TestCutting() { var session = new WebSession(); var buf = session.GetRaw("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"); var ms = new MemoryStream(buf); var img = (Bitmap)Image.FromStream(ms); var eff = new EffImage(img); // 透明底rgb是0 eff.ProcessEach((_, i, j) => { var color = _.At(i, j); if (color.R == 0) { _.Set(i, j, Color.White); } }); eff.GrayScale(); eff.AdativeBinarization(); eff = EffImage.CutH(eff, 200, 330); eff = EffImage.CutV(eff, 100, 230); eff.Origin.Save("z:/cut.bmp"); }
public void TestConnectedArea() { bmp = new Bitmap(32, 32); g = Graphics.FromImage(bmp); g.Clear(Color.White); // 三条线 g.DrawLine(Pens.Black, new Point(0, 4), new Point(32, 4)); g.DrawLine(Pens.Black, new Point(1, 8), new Point(20, 8)); g.DrawLine(Pens.Black, new Point(1, 12), new Point(20, 12)); // 框框 1-20, 22-27 g.FillRectangle(Brushes.Black, new Rectangle(1, 22, 20, 5)); g.FillRectangle(Brushes.Black, new Rectangle(1, 30, 20, 32)); image = new EffImage(bmp); var area = image.ConnectedAreas.ToArray(); Assert.AreEqual(5, area.Length); var max = area.Max(i => i.Size.Height * i.Size.Width); var maxCount = area.Max(i => i.Points.Count); // 最大面积 Assert.AreEqual(100, max); Assert.AreEqual(100, maxCount); }
public void Setup() { bmp = new Bitmap(32, 32); g = Graphics.FromImage(bmp); g.Clear(Color.Black); image = new EffImage(bmp); }
public void TestAdativeBinary() { var img = new EffImage((Bitmap)Bitmap.FromFile("z:/test3.png")); img.GrayScale(); img.AdativeBinarization(); img.Origin.Save("z:/test_bin.bmp"); }
public string Recognize(Stream ImgStream) { using (Image image = Image.FromStream(ImgStream)) { EffImage inputPattern = new EffImage(image as Bitmap); SetInputPattern(inputPattern); int index = ForwardPropagation(); return(patternMapping[index].ToString()); } }
public string Recognize(Bitmap img) { EffImage inputPattern = new EffImage(img); img.Dispose(); SetInputPattern(inputPattern); int index = ForwardPropagation(); return(patternMapping[index].ToString()); }
public void TestReverse() { var eff = new EffImage(bmp); eff.Reverse(); var color = eff.At(11, 12); Assert.AreEqual(color.ToArgb(), Color.White.ToArgb()); }
public void TestBinaryWithParallel() { var img = new EffImage((Bitmap)Bitmap.FromFile("z:/test.jpg")); // 多核并行 img.ProcessEach((EffImage x, int i, int j) => { var c = x.At(i, j); if (c.R < 50) { x.Set(i, j, Color.Black); } else { x.Set(i, j, Color.White); } }, parallel: true); }
public void TestOCR() { var img = new EffImage((Bitmap)Bitmap.FromFile("z:/test.jpg")); img.GrayScale(); img.Binarization(100); img.Origin.Save("z:/test_bin.bmp"); img = EffImage.Resize(img, 1024, 768); var vhist = img.ProjectionHistV(); // 用垂直投影找底部 var bottom = img.Bottom; int upperBound = 0; for (upperBound = bottom; upperBound > 0; upperBound--) { if (vhist[upperBound] <= 5) { break; } } var idImg = EffImage.CutV(img, upperBound, bottom); idImg.ClearNoise(3); idImg.Binarization(50); var area = idImg.ConnectedAreas; int i = 0; foreach (var item in area) { var rect = item.ValidArea; var seg = EffImage.CutH(EffImage.CutV(idImg, rect.Top, rect.Bottom), rect.Left, rect.Right); var resz = EffImage.Resize(seg, 32, 32); resz.Origin.Save($"z:/seg/{i++}.bmp"); } }
public void TestBinaryWithNoParallel() { var img = new EffImage((Bitmap)Bitmap.FromFile("z:/test.jpg")); var th = 50; for (int i = 0; i < img.Width; i++) { for (int j = 0; j < img.Height; j++) { // 直接操作pixel数据, 快一丢丢 var c = img.Pixels[i, j]; if (c.R < th) { img.Pixels[i, j] = Color.Black; } else { img.Pixels[i, j] = Color.White; } } } }
public void TestForeground() { var fore = Color.FromArgb(11, 22, 33); g.Clear(Color.White); image = new EffImage(bmp, ImageColorType.Colored); var rnd = new Random(); // 随机几个前景点 Dictionary <int, int> marks = new Dictionary <int, int>(); for (int i = 0; i < 100; i++) { var x = rnd.Next(0, 32); if (marks.ContainsKey(x)) { ++marks[x]; } else { marks[x] = 1; } image.Set(x, marks[x], fore); } var hist = image.ProjectionHistH(); for (int i = 0; i < image.Width; i++) { if (marks.ContainsKey(i)) { Assert.AreEqual(marks[i], hist[i]); } } }