You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

132 lines
4.8 KiB

using System;
/*
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using System.ComponentModel;
using System.Drawing.Imaging;
using System.Globalization;
using static System.Net.Mime.MediaTypeNames;
using System.Diagnostics;
using System.Net.NetworkInformation;
using System.Net;
using System.Management;
using System.IO.Ports;
using System.IO;
using System.Security.Cryptography;
using System.Windows.Forms.Design;
*/
namespace UTIL
{
#region Медианный фильтр
public class GMedian<T> where T : IComparable<T>
{
private T[] buf;
byte _count = 0;
UInt16 _num = 0;
public GMedian(UInt16 num)
{
buf = new T[num];
_count = 0;
_num = num;
}
public T filtered(T newVal)
{
buf[_count] = newVal;
if ((_count < _num - 1) && (buf[_count].CompareTo(buf[_count + 1]) > 0))
{
for (int i = _count; i < _num - 1; i++)
{
if (buf[i].CompareTo(buf[i + 1]) > 0)
{
T buff = buf[i];
buf[i] = buf[i + 1];
buf[i + 1] = buff;
}
}
}
else
{
if ((_count > 0) && (buf[_count - 1].CompareTo(buf[_count])) > 0)
{
for (int i = _count; i > 0; i--)
{
if (buf[i].CompareTo(buf[i - 1]) < 0)
{
T buff = buf[i];
buf[i] = buf[i - 1];
buf[i - 1] = buff;
}
}
}
}
if (++_count >= _num) _count = 0;
return buf[_num / 2];
}
}
#endregion
#region Медианный фильтр 2
public class GMedian3
{
public UInt16 filtered(UInt16 value)
{ // возвращает фильтрованное значение
bufUI16[_counter] = value;
if (++_counter > 2)
_counter = 0;
return (Math.Max(bufUI16[0], bufUI16[1]) == Math.Max(bufUI16[1], bufUI16[2])) ? Math.Max(bufUI16[0], bufUI16[2]) : Math.Max(bufUI16[1], Math.Min(bufUI16[0], bufUI16[2]));
}
public Int16 filtered(Int16 value)
{ // возвращает фильтрованное значение
bufI16[_counter] = value;
if (++_counter > 2)
_counter = 0;
return (Math.Max(bufI16[0], bufI16[1]) == Math.Max(bufI16[1], bufI16[2])) ? Math.Max(bufI16[0], bufI16[2]) : Math.Max(bufI16[1], Math.Min(bufI16[0], bufI16[2]));
}
public UInt32 filtered(UInt32 value)
{ // возвращает фильтрованное значение
bufUI32[_counter] = value;
if (++_counter > 2)
_counter = 0;
return (Math.Max(bufUI32[0], bufUI32[1]) == Math.Max(bufUI32[1], bufUI32[2])) ? Math.Max(bufUI32[0], bufUI32[2]) : Math.Max(bufUI32[1], Math.Min(bufUI32[0], bufUI32[2]));
}
public Int32 filtered(Int32 value)
{ // возвращает фильтрованное значение
bufI32[_counter] = value;
if (++_counter > 2)
_counter = 0;
return (Math.Max(bufI32[0], bufI32[1]) == Math.Max(bufI32[1], bufI32[2])) ? Math.Max(bufI32[0], bufI32[2]) : Math.Max(bufI32[1], Math.Min(bufI32[0], bufI32[2]));
}
public float filtered(float value)
{ // возвращает фильтрованное значение
buff[_counter] = value;
if (++_counter > 2)
_counter = 0;
return (Math.Max(buff[0], buff[1]) == Math.Max(buff[1], buff[2])) ? Math.Max(buff[0], buff[2]) : Math.Max(buff[1], Math.Min(buff[0], buff[2]));
}
public Double filtered(Double value)
{ // возвращает фильтрованное значение
bufd[_counter] = value;
if (++_counter > 2)
_counter = 0;
return (Math.Max(bufd[0], bufd[1]) == Math.Max(bufd[1], bufd[2])) ? Math.Max(bufd[0], bufd[2]) : Math.Max(bufd[1], Math.Min(bufd[0], bufd[2]));
}
UInt16[] bufUI16 = new UInt16[3];
Int16[] bufI16 = new Int16[3];
UInt32[] bufUI32 = new UInt32[3];
Int32[] bufI32 = new Int32[3];
Double[] bufd = new Double[3];
Single[] buff = new Single[3];
Byte _counter = 0;
};
#endregion
}