for (inti = 0; i<images.Length; i++)
{
Text = string.Format("Загрузка {0} изображенияиз {1}", (i+1), images.Length);
//загрузкаоригинальногоизображения
imagesFromFolder[i] = newMyImage(newBitmap(images[i]));
//сохранениепервогопреобразования
imagesFromFolder[i].setFirstTransform(Transform.sobelTransform(newBitmap(images[i])));
//сохранениевторогопреобразования
imagesFromFolder[i].setSecondTransform(Transform.robertsTransform(newBitmap(images[i])));
//сохранениерезультата
imagesFromFolder[i].setResult(Transform.anotherWay(imagesFromFolder[i]));
//установка id
imagesFromFolder[i].setId(i);
if (imagesFromFolder[i].getDisp() > 1450)
{
badMas += imagesFromFolder[i].getMas();
}
else
{
goodMas += imagesFromFolder[i].getMas();
}
}
Text = "";
pictureBox1.Image = imagesFromFolder[0].getResult();
position = 0;
isLoad = true;
//d
label1.Text = string.Format("Диаметр: {0:0.####}", imagesFromFolder[0].getD());
//v
label2.Text = string.Format("Объем: {0:0.####}", imagesFromFolder[0].getV());
//mas
label3.Text = string.Format("Вес: {0:0.####}", imagesFromFolder[0].getMas());
//disp
label4.Text = string.Format("Дисперсия: {0:0000}", imagesFromFolder[0].getDisp());
//rotten
string rotten = imagesFromFolder[0].getDisp() > 1450 ? "Белый" :"Маслята";
label5.Text = string.Format(rotten.ToString());
///////////////////////////////////////////////////////
//ящики
badBox.Add(tdb.save_Box(2, badMas));
goodBox.Add(tdb.save_Box(1, goodMas));
//созданиеновойнакладной
idNa = tdb.save_Na(1, goodBox.Count);
//созданиеновогоакта
idAct = tdb.save_Act(2, badBox.Count);
//созданиезаписейЯщикиВнакладной
foreach (intidBoxingoodBox)
{
tdb.save_Box_in_Na(idNa, idBox);
}
foreach (intidBoxinbadBox)
{
tdb.save_Box_in_Act(idAct, idBox);
}
//передачанакладнойвформу
na = newNakladnaya(idNa, "Белыйгриб", "шт.", goodBox.Count, 150, 150 * goodMas * goodBox.Count, goodMas);
//передачаактавформу
act = newNakladnaya(idAct, "Маслята", "", badBox.Count, 40, 40 * badMas * badBox.Count, badMas);
this.images = imagesFromFolder;
}
//показать следующее изображение
privatevoidnext_Click(object sender, EventArgs e)
{
if (!isLoad)
return;
position++;
if (position >= images.Length)
position = 0;
pictureBox1.Image = images[position].getResult();
//d
label1.Text = string.Format("Диаметр: {0:0.####}", images[position].getD());
//v
label2.Text = string.Format("Объем: {0:0.####}", images[position].getV());
//mas
label3.Text = string.Format("Вес: {0:0.####}", images[position].getMas());
//disp
label4.Text = string.Format("Дисперсия: {0:0000}", images[position].getDisp());
//rotten
string rotten = images[position].getDisp() > 1450 ? "Белый" :"Маслята";
label5.Text = string.Format(rotten.ToString());
}
//показатьпредыдущееизображение
privatevoidprev_Click(object sender, EventArgs e)
{
if (!isLoad)
return;
if (position - 1 >= 0)
position--;
else
position = (byte) (images.Length - 1);
pictureBox1.Image = images[position].getResult();
//d
label1.Text = string.Format("Диаметр: {0:0.####}", images[position].getD());
//v
label2.Text = string.Format("Объем: {0:0.####}", images[position].getV());
//mas
label3.Text = string.Format("Вес: {0:0.####}", images[position].getMas());
//disp
label4.Text = string.Format("Дисперсия: {0:0000}", images[position].getDisp());
//rotten
string rotten = images[position].getDisp() > 1450 ? "Белый" :"Маслята";
label5.Text = string.Format(rotten.ToString());
}
//печатьнакладной
privatevoid button3_Click(object sender, EventArgs e)
{
if (!isLoad)
return;
Form2form2 = newForm2(na);
form2.Show();
}
//печатьакта
privatevoid button1_Click(object sender, EventArgs e)
{
if (!isLoad)
return;
Form3form3 = newForm3(act);
form3.Show();
}
privatevoid button4_Click(object sender, EventArgs e)
{
TestDBdbt = newTestDB();
//dbt.go2();
}
privatevoid label2_Click(object sender, EventArgs e)
{
}
}
}
using System;
usingSystem.Collections.Generic;
usingSystem.Drawing;
usingSystem.Drawing.Imaging;
usingSystem.Linq;
usingSystem.Runtime.InteropServices;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespaceKurceWork
{
classTransform
{
publicstaticBitmapsobelTransform(Bitmapsrc)
{
Bitmapbitmap = (Bitmap) src.Clone();
Color Pixel;
int R = 0;
int G = 0;
int B = 0;
//Создание массива массивов яркостей пикселей изображения по размеру высоты битовой матрицы
float[][] result = newfloat[bitmap.Height][];
//Сохранение яркости изображения в массиве
for (int y = 0; y <bitmap.Height; y++) //Для каждой строки
{
result[y] = newfloat[bitmap.Width];//Создание массивов по ширине битовой матрицы
for (int x = 0; x <bitmap.Width; x++) //Для каждого пикселя строки
{
Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы
result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив
}
}
//Собель
int[,] gx = newint[,] {
{ -1, 0, 1 },
{ -2, 0, 2 },
{ -1, 0, 1 }
};
int[,] gy = newint[,] {
{ 1, 2, 1 },
{ 0, 0, 0 },
{ -1, -2, -1 }
};
floatnew_x = 0, new_y = 0;
floatrc;
for (int y = 1; y <bitmap.Height - 1; y++)
for (int x = 1; x <bitmap.Width - 1; x++)
{
new_x = 0;
new_y = 0;
rc = 0;
for (intwi = -1; wi< 2; wi++)
{
for (inthw = -1; hw< 2; hw++)
{
rc = result[y + wi][x + hw];
new_x += gx[hw + 1, wi + 1] * rc;
new_y += gy[hw + 1, wi + 1] * rc;
}
}
//1. Способ (он без порога, ограничение (255) только из-за того,
//что Color принимает на вход параметры от 0 до 255)
new_x *= 25;
new_y *= 25;
if (new_x * new_x + new_y * new_y> 255)
{
R = 255;
G = 255;
B = 255;
}
else
{
R = (int)((float)new_x * new_x + new_y * new_y);
G = (int)((float)new_x * new_x + new_y * new_y);
B = (int)((float)new_x * new_x + new_y * new_y);
}
Pixel = Color.FromArgb(0, R, G, B);
bitmap.SetPixel(x, y, Pixel);
}
//bitmap.Save("sobel.bmp"); //Сохраняем изображение в файле
return bitmap;
}
publicstaticBitmaprobertsTransform(Bitmapsrc)
{
Bitmapbitmap = (Bitmap)src.Clone();
Color Pixel;
int R = 0;
int G = 0;
intB = 0;
//Создание массива массивов яркостей пикселей изображения по размеру высоты битовой матрицы
float[][] result = newfloat[bitmap.Height][];
//Сохранение яркости изображения в массиве
for (int y = 0; y <bitmap.Height; y++) //Для каждой строки
{
result[y] = newfloat[bitmap.Width];//Создание массивов по ширине битовой матрицы
for (int x = 0; x <bitmap.Width; x++) //Для каждого пикселя строки
{
Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы
result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив
}
}
//ЛБШ
floatroberts = 0;
float a = 0, b = 0;
for (int y = 1; y <bitmap.Height - 1; y++)
for (int x = 1; x <bitmap.Width - 1; x++)
{
a = 255 * (result[y][x] - result[y + 1][x + 1]);
b = 255 * (result[y][x + 1] - result[y + 1][x]);
roberts = (float)Math.Sqrt(a * a + b * b);
if (roberts> 255)
{
R = 255;
G = 255;
B = 255;
}
else
{
R = (int)(roberts);
G = (int)(roberts);
B = (int)(roberts);
}
Pixel = Color.FromArgb(0, R, G, B);
bitmap.SetPixel(x, y, Pixel);
}
//Сохраняем преобразованное изображение в файле
//bitmap.Save("roberts.bmp"); //Сохраняем изображение в файле
return bitmap;
}
publicstaticint[,] getDispers(Bitmapsrc)
{
Bitmapbitmap = (Bitmap)src.Clone();
float[][] result = newfloat[bitmap.Height][];//Созданиемассивамассивов result
Color Pixel;
for (int y = 0; y <bitmap.Height; y++) //Длякаждойстроки
{
result[y] = newfloat[bitmap.Width];//Создание массивов по ширине битовой матрицы
//Сохранение яркости точки в массиве
for (int x = 0; x <bitmap.Width; x++) //Для каждого пикселя строки
{
Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы
result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив
}
}
int s = 5 / 2; //Ширина и высота полуокна
intleft = 0; //Левая граница окна
intfloor = 0; //Нижняя граница окна
intright = 0; //Правая граница окна
intceil = 0; //Верхняя граница окна
int k = 0;
int[,] M = newint[bitmap.Height - 10, bitmap.Width - 10];
int[,] D = newint[bitmap.Height - 10, bitmap.Width - 10];
for (int y = 5; y < bitmap.Height-10; y++)
for (int x = 5; x < bitmap.Width-10; x++)
{
k = 0;
//Вычисление границ окна особой точки
left = x - s; if (left < 5) left = 5;
right = x + s; if (right >= bitmap.Width-5) right = bitmap.Width - 5;
ceil = y - s; if (ceil < 5) ceil = 5;
floor = y + s; if (floor >= bitmap.Height-5) floor = bitmap.Height - 5;
//вычислениеМат. Ожидания
for (intyy = ceil; yy<= floor; yy++)
for (int xx = left; xx <= right; xx++)
{
//Console.WriteLine("M = {0}; res = {1};", M[i], result[y][x]);
M[y,x] = M[y,x] + (int)((float)255 * result[yy][xx]);
k++;
}
M[y,x] = (int)((float)M[y,x] / (float)k);
//ВычислениеДисперсии
for (intyy = ceil; yy<= floor; yy++)
for (int xx = left; xx <= right; xx++)
{
D[y,x] = D[y,x] + ((int)((float)255 * result[yy][xx]) * (int)((float)255 * result[yy][xx])) - (M[y,x] * M[y,x]);
}
D[y,x] = (int)((float)D[y,x] / (float)(k - 1));
}
return D;
}
publicstaticint[,] getMat(Bitmapsrc)
{
Bitmapbitmap = (Bitmap)src.Clone();
float[][] result = newfloat[bitmap.Height][];//Созданиемассивамассивов result
Color Pixel;
for (int y = 0; y <bitmap.Height; y++) //Длякаждойстроки
{
result[y] = newfloat[bitmap.Width];//Создание массивов по ширине битовой матрицы
//Сохранение яркости точки в массиве
for (int x = 0; x <bitmap.Width; x++) //Для каждого пикселя строки
{
Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы
result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив
}
}
int s = 5 / 2; //Ширина и высота полуокна
intleft = 0; //Левая граница окна
intfloor = 0; //Нижняя граница окна
intright = 0; //Правая граница окна
intceil = 0; //Верхняя граница окна
int k = 0;
int[,] M = newint[bitmap.Height - 10, bitmap.Width-10];
for (int y = 5; y <bitmap.Height - 10; y++)
for (int x = 5; x <bitmap.Width - 10; x++)
{
//Вычисление границ окна особой точки
left = x - s; if (left< 5) left = 5;
right = x + s; if (right >= bitmap.Width - 5) right = bitmap.Width - 6;
ceil = y - s; if (ceil < 5) ceil = 5;
floor = y + s; if (floor >= bitmap.Height - 5) floor = bitmap.Height - 6;
k = 0;
//вычислениеМат. Ожидания
for (intyy = ceil; yy<= floor; yy++)
for (int xx = left; xx <= right; xx++)
{
//Console.WriteLine("x = {0}; y = {1}; xx = {2}; yy = {3}", x, y, xx, yy);
M[y,x] = M[y,x] + (int)((float)255 * result[yy][xx]);
k++;
}
M[y,x] = (int)((float)M[y,x] / (float)k);
}
return M;
}
publicstaticint[,] getModa(Bitmapsrc)
{
Bitmapbitmap = (Bitmap)src.Clone();
float[][] result = newfloat[bitmap.Height][];//Созданиемассивамассивов result
Color Pixel;
for (int y = 0; y <bitmap.Height; y++) //Длякаждойстроки
{
result[y] = newfloat[bitmap.Width];//Создание массивов по ширине битовой матрицы
//Сохранение яркости точки в массиве
for (int x = 0; x <bitmap.Width; x++) //Для каждого пикселя строки
{
Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы
result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив
}
}
int s = 5 / 2; //Ширина и высота полуокна
intleft = 0; //Левая граница окна
intfloor = 0; //Нижняя граница окна
intright = 0; //Правая граница окна
intceil = 0; //Верхняя граница окна
//int k = 0;
//int[,] M = new int[bitmap.Height - 10, bitmap.Width - 10];
int[,] Moda = newint[bitmap.Height - 10, bitmap.Width - 10];
for (int y = 5; y <bitmap.Height - 10; y++)
for (int x = 5; x <bitmap.Width - 10; x++)
{
//Вычисление границ окна особой точки
left = x - s; if (left< 5) left = 5;
right = x + s; if (right >= bitmap.Width - 5) right = bitmap.Width - 5;
ceil = y - s; if (ceil < 5) ceil = 5;
floor = y + s; if (floor >= bitmap.Height - 5) floor = bitmap.Height - 5;
//мода
intkk = 0;
Dictionary<float, int>mapModa = newDictionary<float, int>();
for (intyy = ceil; yy<= floor; yy++)
for (int xx = left; xx <= right; xx++)
{
//мода
intfreq = 0;
if (mapModa.ContainsKey((float)255 * result[yy][xx]))
{
freq = mapModa[(float)255 * result[yy][xx]];
mapModa[(float)255 * result[yy][xx]] = freq + 1;
}
else
{
mapModa.Add((float)255 * result[yy][xx], 1);
}
kk++;
}
//Мода
intmo = 0;
foreach (KeyValuePair<float, int>modainmapModa)
{
if (moda.Value>mo)
{
Moda[y,x] = (int)moda.Key;
mo = moda.Value;
}
}
}
returnModa;
}
publicstaticBitmap calculate(MyImage image)
{
//загрузкаизображений
Bitmapsrc = image.getSrc();
BitmapfirstT = image.getFirstTransform();
BitmapsecondT = image.getSecondTransform();
//загружканужныхпреобразований
float[,] x1 = normalization( getMat(firstT) );
float[,] x2 = normalization(getDispers(firstT));
float[,] x3 = normalization(getModa(firstT));
float[,] polynom = newfloat[src.Height, src.Width];
float a00 = -0.01f;
float a01 = 1.7f;
float a02 = -0.3f;
float a03 = 0.25f;
/*
float a00 = -0.01f;
float a01 = 1.7f;
float a02 = -0.3f;
float a03 = 0.25f;
*/
for (int y = 5; y < src.Height-10; y++)
for (int x = 5; x < src.Width-10; x++)
{
polynom[y,x] = a00 + a01 * x1[y,x] + a02 * x2[y,x] + a03 * x3[y,x];
polynom[y,x] = polynom[y,x] > 0.2f? 1f:0f;
}
Color pixel;
Bitmap res = (Bitmap) src.Clone();
for (int y = 0; y <src.Height; y++)
for (int x = 0; x <src.Width; x++)
{
if (polynom[y, x] == 1f)
{
pixel = Color.Black;
}
else
pixel = src.GetPixel(x, y);
res.SetPixel(x, y, pixel);
}
res.Save("counter.bmp");
return res;
}
publicstaticBitmapanotherWay(MyImage image)
{
//загрузкаизображений
Bitmapsrc = image.getSrc();
BitmapfirstT = image.getFirstTransform();
BitmapsecondT = image.getSecondTransform();
//загружканужныхпреобразований
float[,] x1 = normalization(getMat(firstT));
float[,] x2 = normalization(getDispers(firstT));
float[,] x3 = normalization(getModa(firstT));
//db
TestDBtdb = newTestDB();
//запись в бдПризнаков_Изображения
/*for(int y = 0; y < src.Height-10; y++)
for (int x = 0; x < src.Width-10; x++)
{
tdb.save_PriznakiIzobr(image.getId(), x, y, 0, x1[y,x]);
}*/
//загрузитькоэфыполиномаизбд
List<float> poly = tdb.get_Poly();
float[,] polynom = newfloat[src.Height, src.Width];
float a00 = poly[0];
float a01 = poly[1];
float a02 = poly[2];
float a03 = poly[3];
float a04 = poly[4];
float a05 = poly[5];
float a06 = poly[6];
float a07 = poly[7];
float a08 = poly[8];
float a09 = poly[9];
for (int y = 5; y <src.Height - 10; y++)
for (int x = 5; x <src.Width - 10; x++)
{
//polynom[y, x] = a00 + a01 * x1[y, x] + a02 * x2[y, x] + a03 * x3[y, x];
polynom[y, x] = a00 + a01 * x1[y, x] + a02 * x2[y, x] + a03 * x3[y, x] + a04 * x1[y, x] * x1[y, x] + a05 * x1[y, x] * x2[y, x] + a06 * x1[y, x] * x3[y, x] + a07 * x2[y, x] * x2[y, x] + a08 * x2[y, x] * x3[y, x] + a09 * x3[y, x] * x3[y, x];
polynom[y, x] = polynom[y, x] > 0.5f ? 1f : 0f;
//db
tdb.save_VybVhD(image.getId(), x, y, polynom[y,x]);
//tdb.save_PrResh(0, 1, 2, polynom[y, x]);
}
//left + rigth side
Color pixel;
Bitmap res = (Bitmap)src.Clone();
Bitmapdest = (Bitmap)src.Clone();
int lx = 500, rx = 0;
#regionmark_border
for (int y = 0; y <src.Height; y++)
{
//left
for (int x = 0; x <src.Width; x++)
{
if (polynom[y, x] == 1f)
{
pixel = Color.Black;
res.SetPixel(x, y, pixel);
if (x < lx) lx = x;
break;
}
else
{
pixel = Color.Blue;
dest.SetPixel(x, y, pixel);
}
}
//right
for (int x = src.Width-1; x > 0 ; x--)
{
if (polynom[y, x] == 1f)
{
pixel = Color.Black;
res.SetPixel(x, y, pixel);
if (x >rx) rx = x;
break;
}
else
{
pixel = Color.Blue;
dest.SetPixel(x, y, pixel);