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
//Методы рисования пользователя