예제 #1
0
        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];
            }
        }
예제 #2
0
        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");
        }
예제 #3
0
        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);
        }
예제 #4
0
        public void Setup()
        {
            bmp = new Bitmap(32, 32);
            g   = Graphics.FromImage(bmp);
            g.Clear(Color.Black);

            image = new EffImage(bmp);
        }
예제 #5
0
        public void TestAdativeBinary()
        {
            var img = new EffImage((Bitmap)Bitmap.FromFile("z:/test3.png"));

            img.GrayScale();
            img.AdativeBinarization();
            img.Origin.Save("z:/test_bin.bmp");
        }
예제 #6
0
 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());
     }
 }
예제 #7
0
        public string Recognize(Bitmap img)
        {
            EffImage inputPattern = new EffImage(img);

            img.Dispose();
            SetInputPattern(inputPattern);
            int index = ForwardPropagation();

            return(patternMapping[index].ToString());
        }
예제 #8
0
        public void TestReverse()
        {
            var eff = new EffImage(bmp);

            eff.Reverse();

            var color = eff.At(11, 12);

            Assert.AreEqual(color.ToArgb(), Color.White.ToArgb());
        }
예제 #9
0
        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);
        }
예제 #10
0
        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");
            }
        }
예제 #11
0
        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;
                    }
                }
            }
        }
예제 #12
0
        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]);
                }
            }
        }