Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2015, 01:48   #1
3JIou_geg
Пользователь
 
Регистрация: 29.03.2015
Сообщений: 11
По умолчанию выделение максимума графика

Дана картинка с графиком.После отрисовки массива точек графика нужно отметить на ней максимум по амплитуде красным кружком.Как это сделать?

Есть только код отрисовки массива цветов графика
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
       

        private void button1_Click(object sender, EventArgs e)
        {
            this.openFileDialog1.Filter = "Images (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|" + "All files (*.*)|*.*";
            DialogResult dr = this.openFileDialog1.ShowDialog();
            if (dr == System.Windows.Forms.DialogResult.OK)
            {

                Bitmap Bmp = new Bitmap(openFileDialog1.FileName); //Основное изображение.
                Bitmap Temp = new Bitmap(Bmp.Width, Bmp.Height); //Чистое изображение.
                Color[,] ALL = new Color[Bmp.Width - 1, Bmp.Height - 1]; //Массив для цветов пикселей.
                for (int i = 0; i < (Bmp.Width - 1); i++)
                {
                    for (int j = 0; j < (Bmp.Height - 1); j++)
                    {
                        ALL[i, j] = Bmp.GetPixel(i, j); //Получаем все цвета в массив.
                    }
                }
                for (int i = 0; i < (Bmp.Width - 1); i++)
                {
                    for (int j = 0; j < (Bmp.Height - 1); j++)
                    {
                        Temp.SetPixel(i, j, ALL[i, j]); //Красим все пиксели по порядку в Темп.
                    }
                }
                pictureBox1.Image = Temp; //Выводим.
            }
        }
    }
}
Изображения
Тип файла: jpg 2.jpg (16.0 Кб, 87 просмотров)
Тип файла: jpg 4.jpg (16.5 Кб, 86 просмотров)
3JIou_geg вне форума Ответить с цитированием
Старый 30.03.2015, 03:15   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от 3JIou_geg Посмотреть сообщение
Дана картинка с графиком.После отрисовки массива точек графика нужно отметить на ней максимум по амплитуде красным кружком.Как это сделать?
Для начала нужно определить положение максимумов. Это можно легко сделать немного доработав имеющийся код.
А, далее, исходя из положения максимумов, рисовать круги.
Надеюсь, идея понятна...
Streletz вне форума Ответить с цитированием
Старый 01.04.2015, 16:34   #3
3JIou_geg
Пользователь
 
Регистрация: 29.03.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Для начала нужно определить положение максимумов. Это можно легко сделать немного доработав имеющийся код.
А, далее, исходя из положения максимумов, рисовать круги.
Надеюсь, идея понятна...
Я так понял:двумерным массивом нужно пройтись строчку за строчкой,как только попадётся черный пиксель-это будет максимум получается.Затем по координатам массива кружки рисовать. Вопрос как тут двумерный массив пикселей прописать(в смысле с моим кодом),хотя бы пример. И вопрос-если максимумов будет не один,что тогда???
3JIou_geg вне форума Ответить с цитированием
Старый 02.04.2015, 00:08   #4
3JIou_geg
Пользователь
 
Регистрация: 29.03.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Для начала нужно определить положение максимумов. Это можно легко сделать немного доработав имеющийся код.
А, далее, исходя из положения максимумов, рисовать круги.
Надеюсь, идея понятна...
Опрашиваю массивом.Как только нахожу черный цвет-кидаю координаты и вывожу. Проблема в том что выводит у всех изображений максимумы в точках [{0},{0}] [{0},{2}] или выводит пустое окно. В чем проблема может быть??? Код C#

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.openFileDialog1.Filter = "Images (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|" + "All files (*.*)|*.*";
            DialogResult dr = this.openFileDialog1.ShowDialog();
            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                // список точек в которое будет помещать найденные максимумы
                List<Point> maxPoints = new List<Point>();


                Bitmap Bmp = new Bitmap(openFileDialog1.FileName); //Основное изображение.
                Bitmap Temp = new Bitmap(Bmp.Width, Bmp.Height); //Чистое изображение.
                Color[,] ALL = new Color[Bmp.Width - 1, Bmp.Height - 1]; //Массив для цветов пикселей.
                for (int i = 0; i < (Bmp.Width - 1); i++)
                {
                    for (int j = 0; j < (Bmp.Height - 1); j++)
                    {
                        ALL[i, j] = Bmp.GetPixel(i, j); //Получаем все цвета в массив.
                    }
                }
                for (int i = 0; i < (Bmp.Width - 1); i++)
                {
                    for (int j = 0; j < (Bmp.Height - 1); j++)
                    {
                        Temp.SetPixel(i, j, ALL[i, j]); //Красим все пиксели по порядку в Темп.
                    }
                }

                pictureBox1.Image = Temp; //Выводим.

                // цикл по строке
                for (int i = 0; i < ALL.GetLength(0); i++)
                {
                    bool maximumFound = true; // нашли ли максимум

                    // цикл по столбцам
                    for (int j = 0; j < ALL.GetLength(1); j++)
                    {
                        if (ALL[i, j] == Color.Black)
                        {
                            maximumFound = true; // нашли максимум
                            maxPoints.Add(new Point(i, j)); // добавили максимум в список
                        }
                    }

                    // если нашли максимум, прерываем цикл
                    if (maximumFound) break;
                }

                string text = "";
                foreach (var item in maxPoints)
                {
                    text += String.Format("найден максимум по координатам [{0},{1}]\n", item.X, item.Y);
                }
                MessageBox.Show(text);



            }

        }
    }
}
3JIou_geg вне форума Ответить с цитированием
Старый 02.04.2015, 02:30   #5
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от 3JIou_geg Посмотреть сообщение
Как только нахожу черный цвет-кидаю координаты и вывожу
По хорошему, перед тем как добавлять точки в массив, было бы не плохо определить относится ли она к графику или является, так называемым, "мусором" (на скинах из топика он есть). При этом следует учесть, что толщина линии графика (по крайней мере на скринах в топике) больше 1 пикселя.
Кроме того, поиск максимума в массиве у Вас реализован явно неправильно. В начале нужно определить координаты всех точек графика (в рамках допустимой погрешности) и уже только после этого искать максимум в получившемся массиве.

Последний раз редактировалось Streletz; 02.04.2015 в 02:37.
Streletz вне форума Ответить с цитированием
Старый 05.04.2015, 20:20   #6
3JIou_geg
Пользователь
 
Регистрация: 29.03.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
По хорошему, перед тем как добавлять точки в массив, было бы не плохо определить относится ли она к графику или является, так называемым, "мусором" (на скинах из топика он есть). При этом следует учесть, что толщина линии графика (по крайней мере на скринах в топике) больше 1 пикселя.
Кроме того, поиск максимума в массиве у Вас реализован явно неправильно. В начале нужно определить координаты всех точек графика (в рамках допустимой погрешности) и уже только после этого искать максимум в получившемся массиве.

Теперь мы не ищем черный цвет, а ищем НЕ белый. Погрешность довольно высокая, но работает.
Проблему с линией толще 1 пикселя обошли довольно топорно. После нахождения первого максимум, пропускаем 10 пикселей, подразумевается что максимумы не будут расположены так близко друг к другу.

Код:
private void button1_Click(object sender, EventArgs e)
{
    this.openFileDialog1.Filter = "Images (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|" + "All files (*.*)|*.*";
    DialogResult dr = this.openFileDialog1.ShowDialog();
    if (dr == System.Windows.Forms.DialogResult.OK)
    {
        // список точек в которые будем помещать найденные максимумы
        List<Point> maxPoints = new List<Point>();
 
        Bitmap Bmp = new Bitmap(openFileDialog1.FileName); //Основное изображение.
        int bmpWidth = Bmp.Width;
        int bmpHeight = Bmp.Height;
 
        Bitmap Temp = new Bitmap(bmpWidth, bmpHeight); //Чистое изображение.
        Color[,] ALL = new Color[bmpWidth - 1, bmpHeight - 1]; //Массив для цветов пикселей.
 
        for (int i = 0; i < (bmpWidth - 1); i++)
        {
            for (int j = 0; j < (bmpHeight - 1); j++)
            {
                ALL[i, j] = Bmp.GetPixel(i, j); //Получаем все цвета в массив.
                Temp.SetPixel(i, j, ALL[i, j]); //Красим все пиксели по порядку в Темп.
            }
        }
 
 
        for (int j = 0; j < ALL.GetLength(1); j++)
        {
            bool maximumFound = false;
 
            for (int i = ALL.GetLength(0) - 1; i >= 0; i--)
            {
                if (ALL[i, j] != Color.FromArgb(255, 255, 255))
                {
                    maximumFound = true;
                    maxPoints.Add(new Point(i, j));
                }
                i -= 10; // пропускаем 10 пикселей, из за толщины линии
            }
 
            if (maximumFound) break;
        }
 
        Graphics lin = Graphics.FromImage(Temp);
        foreach (var item in maxPoints)
            lin.DrawEllipse(new Pen(Color.Red), item.X - 5, item.Y - 5, 10, 10);
 
        pictureBox1.Image = Temp;
    }
}
Проект работает,только не на всех экг изображениях само собой. Нужно выделить оба R-зубца(максимум по амплитуде). Тут ищет максимум,отрисовывает его, а следующий R-зубец не выделяет. Еще проблема,если изображение будет скошено, сфоткано под углом и т.д.

А что если использовать какую нибудь функцию подгона всех изображений к одному стандарту пикселей,и сделать график в 1 пиксель,ну или немного четким.Например функцию из CvInvoke.cvResize Method EmguCV http://www.emgu.com/wiki/files/2.0.0...49feaef519.htm


Код C#

Код:
public static void cvResize
(
    IntPtr src, //входное изображение
    IntPtr dst, //результат
    INTER interpolation  //интерполяция
)
CV_INTER_NN
Nearest-neighbor interpolation
CV_INTER_LINEAR
Bilinear interpolation
CV_INTER_CUBIC
resampling using pixel area relation. It is the preferred method for image decimation that gives moire-free results. In case of zooming it is similar to CV_INTER_NN method
CV_INTER_AREA
Bicubic interpolation



Какую лучше интерполяцию выбрать и даст это нам что нибудь вообще?

Где то я нашёл информацию про зубцы,как выделить несколько R-зубцов сразу. Все не понял.

Выделение зубца R
Зубец R можно найти, зная, что он имеет самую большую амплитуду. Первое, что приходит в голову, это запустить цикл по массиву y1[] и если какое-то его значение равно Max(y1[]), то это и будет зубец R. Такой метод будет работать, только если в ROI, выбранном пользователем, один зубец R.На самом же деле, зубцов R в выбранном участке может быть несколько, причем, амплитуда одного зубца может отличаться от амплитуд других зубцов. Поэтому необходимо модифицировать предложенный метод поиска зубца R.А именно, внутри цикла по ind будем проверять условие: если y1ind-Max(y1[]) меньше какого-то заданного значения и эта точка является локальным максимумом, т.е. y1[ind] ≤ y1[ind + j], где j = -2, 2 (такую область мы выбрали экспериментально). Чаще всего зубец R представлен несколькими пикселями с одинаковыми значениями y1[], тогда зубцом R будем считать средний (по горизонтальной координате) из этих пикселей. Таким образом, мы находим зубец R и помещаем его в очередь zubci.
3JIou_geg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение фрагмента изображения, фильтр максимума C# Desired Помощь студентам 3 01.11.2013 10:36
последовательность чисел - поиск максимума, второго после максимума значения, количество чисел равных максимуму wasy96 Паскаль, Turbo Pascal, PascalABC.NET 1 28.09.2011 01:19
Нахождение минимума и максимума графика в Delphi BOOFER Помощь студентам 1 20.06.2010 10:12
Поиск максимума sp_Иришка Общие вопросы C/C++ 9 17.12.2009 15:18
выделение жирным шрифтом минимума и максимума из диапазона Bazzer Microsoft Office Excel 11 28.06.2008 18:50