CaptchaReactNeuron

1. добавлена функция медианной фильтрации изображения 2.

12/23/2019 12:37:56 AM

Details

diff --git a/NeuralNetwork/NeuralNetwork.PictureWork/PictureWork.cs b/NeuralNetwork/NeuralNetwork.PictureWork/PictureWork.cs
index 1ac5575..7d414fd 100644
--- a/NeuralNetwork/NeuralNetwork.PictureWork/PictureWork.cs
+++ b/NeuralNetwork/NeuralNetwork.PictureWork/PictureWork.cs
@@ -186,6 +186,104 @@ namespace NeuralNetwork.PictureWork
             return _array;
         }
 
+        /// <summary>
+        /// Выполняет фильтрацию медианным алгоритмом.
+        /// Для каждого пикселя смотрятся вокруг 8 штук для каждого канала.
+        /// Выполняется сортировка и выборка среднего медианного значения.
+        /// </summary>
+        /// <remarks>
+        /// Т.к. рассматривается всё изображение кроме окантовки в 1 пиксель по периметру.
+        /// то окантовка остается белой. Критично - исправить заполнением из исходного изображения.
+        /// </remarks>
+        /// <param name="bmp"></param>
+        /// <returns></returns>
+        public unsafe static Bitmap MedianFilter(Bitmap bmp)
+        {
+            int width = bmp.Width,
+                height = bmp.Height;
+            System.Drawing.Imaging.BitmapData bdRead = bmp.LockBits(
+                new Rectangle(0, 0, width, height),
+                System.Drawing.Imaging.ImageLockMode.ReadOnly,
+                System.Drawing.Imaging.PixelFormat.Format32bppRgb);
+
+            Bitmap bitmap = new Bitmap(width, height);
+            System.Drawing.Imaging.BitmapData bdWrite = bitmap.LockBits(
+                new Rectangle(0, 0, width, height),
+                System.Drawing.Imaging.ImageLockMode.WriteOnly,
+                System.Drawing.Imaging.PixelFormat.Format32bppRgb);
+
+            Dictionary<string, int[]> RGB_Array = new Dictionary<string, int[]>
+            {
+                { "R", new int[9] },
+                { "G", new int[9] },
+                { "B", new int[9] },
+            };
+            try
+            {
+                unsafe
+                {
+                    for (int h = 1; h < height - 1; ++h)
+                    {
+                        byte* rowRead_Top = (byte*)bdRead.Scan0 + ((h - 1) * bdRead.Stride);
+                        byte* rowRead_Mid = (byte*)bdRead.Scan0 + (h * bdRead.Stride);
+                        byte* rowRead_Bot = (byte*)bdRead.Scan0 + ((h + 1) * bdRead.Stride);
+
+                        byte* rowWrite = (byte*)bdWrite.Scan0 + (h * bdWrite.Stride);
+                        int columnOffset = 4;
+                        for (int w = 1; w < width - 1; ++w)
+                        {
+                            foreach (var key in RGB_Array.Keys)
+                            {
+                                int colorOffset = -1;
+                                switch (key)
+                                {
+                                    case "R": colorOffset = 2; break;
+                                    case "G": colorOffset = 1; break;
+                                    case "B": colorOffset = 0; break;
+                                    default: throw new Exception();
+                                }
+                                //  Линия выше
+                                RGB_Array[key][0] = rowRead_Top[columnOffset + colorOffset - 4];    // Левее
+                                RGB_Array[key][1] = rowRead_Top[columnOffset + colorOffset];        // Центр
+                                RGB_Array[key][2] = rowRead_Top[columnOffset + colorOffset + 4];    // Правее
+
+                                //  Линия текущая
+                                RGB_Array[key][3] = rowRead_Mid[columnOffset + colorOffset - 4];    // Левее
+                                RGB_Array[key][4] = rowRead_Mid[columnOffset + colorOffset];        // Центр
+                                RGB_Array[key][5] = rowRead_Mid[columnOffset + colorOffset + 4];    // Правее
+
+                                //  Линия ниже
+                                RGB_Array[key][6] = rowRead_Bot[columnOffset + colorOffset - 4];    // Левее
+                                RGB_Array[key][7] = rowRead_Bot[columnOffset + colorOffset];        // Центр
+                                RGB_Array[key][8] = rowRead_Bot[columnOffset + colorOffset + 4];    // Правее
+                            }
+
+                            foreach (var array in RGB_Array.Values)
+                                Array.Sort(array);
+
+                            /*B*/
+                            rowWrite[columnOffset] = (byte)RGB_Array["B"][4];
+                            /*G*/
+                            rowWrite[columnOffset + 1] = (byte)RGB_Array["G"][4];
+                            /*R*/
+                            rowWrite[columnOffset + 2] = (byte)RGB_Array["R"][4];
+
+                            //end
+                            columnOffset += 4;
+                        }
+                    }
+                }
+
+            }
+            finally
+            {
+                bmp.UnlockBits(bdRead);
+                bitmap.UnlockBits(bdWrite);
+            }
+
+            return bitmap;
+        }
+
         public static Bitmap InsertBitmap(Bitmap src, int targetWidth, int targetHeight)
         {
             Bitmap target = new Bitmap(targetWidth, targetHeight);
diff --git a/NeuralNetwork/NeuralNetwork.UI.Web/Scripts/Site/Pages/ReactAppPage.jsx b/NeuralNetwork/NeuralNetwork.UI.Web/Scripts/Site/Pages/ReactAppPage.jsx
index 4625abc..29b8dbd 100644
--- a/NeuralNetwork/NeuralNetwork.UI.Web/Scripts/Site/Pages/ReactAppPage.jsx
+++ b/NeuralNetwork/NeuralNetwork.UI.Web/Scripts/Site/Pages/ReactAppPage.jsx
@@ -9,7 +9,8 @@ class ReactAppPage extends React.Component {
             {
                 TextRecognising_Result: "",
                 TextRecognising_Learn: "",
-                sliderValue: 1
+                sliderValue: 1,
+                inputURL: ""
             };
 
         this.api = new API_TextRecognising();
@@ -19,6 +20,7 @@ class ReactAppPage extends React.Component {
         this._OnClick_Button_Recognized = this._OnClick_Button_Recognized.bind(this);
         this._OnClick_Button_Learn = this._OnClick_Button_Learn.bind(this);
         this.handleInputChange = this.handleInputChange.bind(this);
+        this.handleInputURLChange = this.handleInputURLChange.bind(this);
         this.handleSliderChange = this.handleSliderChange.bind(this);
     }
 
@@ -28,6 +30,11 @@ class ReactAppPage extends React.Component {
         this.canvas.PrintLine();
     }
 
+    handleInputURLChange(event) {
+        this.setState({ inputURL: event.target.value });
+        this.canvas.DrawImage(this.state.inputURL);
+    }
+
     handleInputChange(event) {
         this.setState({ TextRecognising_Learn: event.target.value });
     }
@@ -82,6 +89,13 @@ class ReactAppPage extends React.Component {
 
                 <div className="input-group mb-3">
                     <div className="input-group-prepend">
+                        <span className="input-group-text" id="basic-addon1">Ссылка на изображение:</span>
+                    </div>
+                    <input type="text" value={this.state.inputURL} className="form-control" onChange={this.handleInputURLChange} />
+                </div>
+
+                <div className="input-group mb-3">
+                    <div className="input-group-prepend">
                         <span className="input-group-text" id="basic-addon1">Result:</span>
                     </div>
                     <input type="text" readOnly="readonly" value={this.state.TextRecognising_Result} className="form-control" aria-describedby="basic-addon1" />
diff --git a/NeuralNetwork/NeuralNetwork.UI.Web/Scripts/Site/Tools/Canvas.js b/NeuralNetwork/NeuralNetwork.UI.Web/Scripts/Site/Tools/Canvas.js
index e618ff7..1727c69 100644
--- a/NeuralNetwork/NeuralNetwork.UI.Web/Scripts/Site/Tools/Canvas.js
+++ b/NeuralNetwork/NeuralNetwork.UI.Web/Scripts/Site/Tools/Canvas.js
@@ -59,6 +59,12 @@ class Canvas {
         return this.canvas.toDataURL(format);
     }
 
+    //Изменить толщину пера
+    DrawImage(image, width, height) {
+
+        this.context.drawImage(image, 0, 0, width, height);
+    }
+
 
     //Private
     //Методы рисования пользователя