Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Выделение контуров на изображении градиентным методом

Программа должна брать исходный файл с изображением и выделять контуры на изображении градиентным методом.Помогите написать программу(ну или часть где будет арифметическое действие с пикселями).Спасибо.
Ответ: Storm23, Благодарю, очень своевременно)

Добавлено через 1 час 1 минуту
Storm23, есть еще один вопрос к тебе, возможно ли написать аналогичную программу, но не для выделения контуров, а для подавления шумов изображения(Гауссовского белого шума)?
Заранее спасибо.
Вопрос: Создать изображение используя метод базовой точки Delphi

Создать изображение используя метод базовой точки. Изображение выбрать на собственный опыт.
Ответ: создавай. кто мешает? то, что по ссылке, называется "пример". изучи и сделай своё

Добавлено через 24 минуты
вот получше
Вопрос: "Востановление изображения алгебраическими методами"

Здравствуйте, помогите пожалуйста с написанием программы по теме "востановление изображения алгебраическими методами". Очень нужно!
Ответ: бывает..
Вопрос: Чтение и вывод изображения большого размера

Доброго времени суток, прошу у вас совета.

Используя пример, из книги Андрея Боровского, написал проект чтения изображения больших размеров.

Проблема заключается в том, что изображения считывается методом read() по нарастающей и очень долго.

Здесь я создаю массив, состоящий и классов с фрагментами.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    /*Читаем файл*/
    file.setFileName("bigimg.jpg");
    file.open(QIODevice::ReadOnly);
 
    /*Сохраняем изображение в буфере*/
    QByteArray ba = file.readAll();
    QBuffer io(&ba);
 
    file.close();
 
    /*Открываем и считываем с помощью метода ImageReqader*/
    io.open(QIODevice::ReadOnly);
 
    /*загружаем картинку в фрагменты, где i - по ширине, j - по высоте*/
    for (int i = 0; i < Division; ++i) {
        for (int j = 0; j < Division; ++j) {
            imgf = new ImageFrag();
            imgf->load(&io, i,j);
            listFrag.append(imgf);
        }
    }
далее сам метод с чтением и сохранением в память фрагмента

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    io = ioDevice;
 
    io->reset();
 
    QImageReader ir(io);
    ir.setClipRect(QRect(sizeF*w,sizeF * h,sizeF,sizeF));
 
    QBuffer(chank,this) = ir.read();
 
    
    QIODevice *chankIntf = new QBuffer(chank,this);
    chankIntf->open(QIODevice::WriteOnly);
    img.save(chankIntf,"PNG");
 
    delete chankIntf;
и так получается что у нас картинка размерами 9000x9000, сторона фрагмента 1000x1000 Division = 9, так вот получается, что время чтения возрастает эквивалентно возрастанию j в цикле.

в чем может быть проблема?
Ответ: метод лоад в это второй кусок кода, конструктор:

C++ (Qt)
1
2
3
4
5
6
7
8
ImageFrag::ImageFrag(QObject *parent)
    : QObject(parent)
{
    pixmap = 0;
    chank = new QByteArray();
    io = 0;
 
}

ток у меня небольшая ошибка в коде,
метод load выглядит так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void ImageFrag::load(QIODevice *ioDevice, const int w, int h)
{
    io = ioDevice;
 
    io->reset();
 
    QImageReader ir(io);
    ir.setClipRect(QRect(sizeF*w,sizeF * h,sizeF,sizeF));
 
    QImage img = ir.read();
 
    
    QIODevice *chankIntf = new QBuffer(chank,this);
    chankIntf->open(QIODevice::WriteOnly);
    img.save(chankIntf,"PNG");
 
    delete chankIntf;
}
Вопрос: Отправка файла на сервер методом WebClient.UploadData

Добрый день. Мне нужно отправить файл на сервер, но стандартный метод UploadFile работает некорректно в моем случае. Требуется именно UploadData. Как можно избежать лишних расходов памяти и не считывать сначала весь файл в массив byte[]?
Заранее спасибо!
Ответ: Да, грузит. Дожидаюсь ответственного за сервер.
Вопрос: Цифровая обработка изображений

Основы цифровой обработки изображений на языке С#
Создаем приложение WindowsForms (язык программирования C#). На форму помещаем компоненты: pictureBox для вывода изображения, openFileDialog – для открытия файла в режиме диалога и Chart – для отображения гистограммы.
Перед работой инициализируем следующие параметры:
C#
1
2
3
4
5
6
7
8
 byte[,] image_matr; // матрица полутонового изображения
        int [] hist; //гистограмма
        double[] ver; //вероятностная гистограмма
        double[,] obr_image; // матрица обработанного изображения
        double[] hist_new; //гистограмма
        int gmax,gmin; //желаемое максимальное и минимальное значение яркости
        int fmax, fmin; //максимальное и минимальное значение яркости изображения
 int w_b, h_b; //ширина и высота изображения
Функция открытия изображения из файла:
C#
1
2
3
4
5
6
7
openFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif|Png Image|*.png";
            openFileDialog1.Title = "Выберите файл изображения";
 
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
     {
         pictureBox1.Image = Image.FromFile(@openFileDialog1.FileName);
     }
Создаем экземпляр класса Bitmap ish_bitmap, в котором будет хранится исходное изображение, ширина и высота ish_bitmap равны ширине и высоте загруженного изображения соответственно.

C#
1
2
3
4
Bitmap ish_bitmap = (Bitmap)pictureBox1.Image;
 
w_b = ish_bitmap.Width;  //Ширина изображения
h_b = ish_bitmap.Height; //Высота изображения
Выделяем память для хранения исходного и обработанного изображений, а также для их гистограмм:

C#
1
2
3
4
5
image_matr = new byte[w_b, h_b];  //матрица изображения 
obr_image = new double[w_b, h_b];  //матрица изображения 
 
hist = new int[256];
hist_new = new double[256];
а также задаем начальные значения переменных fmin и fmax:

C#
1
2
fmin=1000;
fmax=-100;
Заполняем массив image_matr значениями яркостей каждой точки изображения:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int x = 0; x < w_b; x++)
   {
     for (int y = 0; y < h_b; y++)
          {
           System.Drawing.Color c = ish_bitmap.GetPixel(x, y);//получаем цвет указанной точки
               int r=Convert.ToInt32(c.R);
               int b=Convert.ToInt32(c.B);
               int g=Convert.ToInt32(c.G);
               int brit= Convert.ToInt32(0.299*r+0.587*g+0.114*b); //Перевод из RGB в полутон
               
 image_matr[x, y] = Convert.ToByte(brit);
                }
            }
Для получения гистограммы изображения и определения максимального, минимального значений яркостей изображения используем следующий код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
            for (int x = 0; x < w_b; x++)
            {
                for (int y = 0; y < h_b; y++)
                {
                    hist[image_matr[x, y]]++;
 
                    if(image_matr[x,y]>fmax)
                        fmax=image_matr[x,y];
                    if(image_matr[x,y]<fmin)
                        fmin=image_matr[x,y];
                }
            }
Выводим значения максимальной, минимальной яркостей изображения на экран:
C#
1
2
            label7.Text=Convert.ToString(fmax); //Максимальная яркость
            label8.Text = Convert.ToString(fmin); //Минимальная яркость
Вывод гистограммы на компонент Chart:
C#
1
2
3
4
5
6
            //Отображение гистограммы на компоненте chart
            chart1.Series[0].Points.Clear();
            for (int i = 0; i < 256; i++)
            {
                chart1.Series[0].Points.AddXY(i, hist[i]);
     }



Второй частью практической работы является предварительная обработка изображения, включающая контрастирование изображения, получение негатива, и фильтрации шумов.
Изменение яркости и контрастности изображения
Изменение яркости позволяет сделать изображение «светлее» или «темнее». Повышение/снижение яркости – это сложение/вычитание значения яркости исходного изображения с некоторым фиксированным значением К (Кϵ [0, 255]).
. (1)
Слабый контраст наиболее распространенный дефект изображений. Обычно он вызван малым динамическим диапазоном изменения яркости либо нелинейностью характеристики передачи уровней яркости.
Простейшим методом контрастирования является функциональное отображение градации яркости в т.е.
.
Для изменения контраста часто используют линейное функциональное отображение, которое в общем виде записывается так
, (2)
где - значение яркостей элементов входного (выходного) изображения;
- значение максимальной (минимальной) яркости элементов выходного изображения – выбираемые величины;
- значение максимальной (минимальной яркости элементов входного) изображения (их можно и задать) – заданные величины.
Графически выражение (2) представляется следующим образом (рис.2). Наклон линии определяется значением d:
.

Рисунок 2
Изменение обеспечивает сжатие и растяжение диапазона яркостей.
Контрастирование также может выполняться по формуле:
, (3)
где - значение яркостей элементов входного (выходного) изображения;
Z – коэффициент контрастности,
fср – среднее значение яркости исходного изображения.

При работе с яркостью и контрастом особое внимание требуется уделять выходу значения яркости за диапазон [0, 255]!
Для этого необходимо выполнять проверку:
C#
1
2
3
4
5
6
7
8
9
10
for (int x = 0; x < w_b; x++)
            {
                for (int y = 0; y < h_b; y++)
                {
                    if (obr_image[x, y] > 255)
                        obr_image[x, y] = 255;
                    if (obr_image[x, y] < 0)
                        obr_image[x, y] = 0;
                }
      }
Негатив изображения
Негатив получается заменой каждого значения яркости исходного изображения на его дополнение до 255.
.
Пример получения негатива (рисунок 3):
C#
1
2
3
4
5
6
7
  for (int x = 0; x < w_b; x++)
            {
                for (int y = 0; y < h_b; y++)
                {
                    obr_image[x, y] =(double)(255- image_matr[x,y]);
                }
        }
Пример отображения негатива в picturebox2:
C#
1
2
3
4
5
6
7
8
9
10
            Bitmap obr = (Bitmap)pictureBox1.Image;
            for (int x = 0; x < w_b; x++)
            {
                for (int y = 0; y < h_b; y++)
                {
                    byte briteness = Convert.ToByte(obr_image[x,y]);
                    System.Drawing.Color c = System.Drawing.Color.FromArgb(briteness,briteness,briteness);
                    obr.SetPixel(x, y, c);
                }
        }
Как это все сделать ума не приложу , может кто знает?
Ответ:
Вопрос: Как правильно привязать обработанные координаты к линии?

в таком виде все работает вроде нормально, но затыка в том что координаты линии не равны напрямую значениям в комбобоксах, а должны проити определенную обработку. как правильно привязать обработанные координаты(в зависимости от данных в комбобоксах) к линии. для примера если в "txt1"=4.2 , то обработав его скажем методом stPX=4.2^2, забиндить координаты линии на результат метода. сори за сумбурность объяснения.
XML
1
2
3
4
5
6
7
8
9
10
11
12
<Canvas Name="shapka" Grid.Row="0" Background="Aqua" >
            <TextBlock Text="Static Pressure:" Canvas.Top="15" Canvas.Left="5" FontSize="12"/>
            <TextBox Name="txt1" Text="{Binding Path=startPointX, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                     Height="30" Width="70" Canvas.Top="10" Canvas.Left="110" />
     
        </Canvas>
        <Canvas Name="cnvs" Grid.Row="1" Background="Beige">
            <Line Name="ln" Stroke="Black" StrokeThickness="1" 
                  X1="{Binding ElementName=txt1, Path=Text}"
                  Y1="{Binding ElementName=txtdt, Path=Text}"
                  X2="100" Y2="100"/>
        </Canvas>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
   /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
 
        double _startPointX, _startPointY, _x;
 
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            
        }
 
        public double startPointX
        {
            get { return _startPointX; }
            set
            {
                _startPointX = value;
                OnPropertyChanged("startPointX");
            }
        }
 
        public double startPointY
        {
            get { return _startPointY; }
            set
            {
                _startPointY = value;
                OnPropertyChanged("startPointY");
            }
        }
    }
Ответ: Ev_Hyper, вроде то что доктор прописал. спасибо пошел разбираться.
Вопрос: Обработка изображение стандартами С++

Добрый день, нужно обработать изображение средствами С++ без сторонних библиотек:

Разработка методов пороговой фильтрации
Разработка методов геометрической фильтрации
и распознание объекта на изображении
кадры из веб камеры я получил средствами qt QCamera формат bmp.

можно ли средствами С++ обработать изображение? и как это сделать в какую сторону копать подскажите пожалуйста
Ответ:
Сообщение от Семан
а разве OpenCV не считается сторонним?
Стороннее. Так же, как и Qt.
Вопрос: Передать поток с CURL методом POST через CURL

Задача - получить картинку со стороннего сайта первым сервером и передать дальше другому серверу. Желательно минимально ресурсозатратно. Само изображение нужно только на втором сервере! Делаю та как ниже, но пока удается только получить на первом но не передать второму.
PHP:

  1. //Скачивание картинки  
  2.     $ch = ();  //Инициализация cURL
  3.     ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U бла бла");
  4.     ($ch, CURLOPT_URL, $urlPictures);
  5.     ($ch, CURLOPT_RETURNTRANSFER, 1);
  6.     ($ch, CURLOPT_HEADER, 0);
  7.     $output_image = ($ch);
  8.    
  9. //Здесь удается сохранить на первом сервере  
  10. $fh = ($saveDirectoryPC . '/' . $imageName . '.jpg', 'w+');
  11. ($fh, $output_image);
  12.  
  13. //Теперь вызываю другой curl внутри первого и пробую ему отдать поток (изображение), но метод проб и ошибок результатов пока не принес
  14.  $fh2 = ($saveDirectory . '/' . $imageName . '.jpg', 'w+');
  15.  
  16. //Передача потока fh  на сервер для сохранения картинки
  17.     $curl = ();
  18.     ($curl, CURLOPT_URL, 'http://site.com/priem.php');
  19.     ($curl, CURLOPT_RETURNTRANSFER, true);
  20.     ($curl, CURLOPT_POST, true);
  21.     ($curl, CURLOPT_POSTFIELDS, "fh2=$fh2&output_image=$output_image");
  22.     $result_31 = ($curl); //Без этого не работает
  23.     ($curl);
  24.        
  25.     ($fh);
  26.    ($fh2);
  27.     ($ch);


На принимающем следующее:
PHP:

  1. //запись изображения на диск
  2. $fh2 = $_POST['fh2'];
  3. $output_image = $_POST['output_image'];
  4. ($fh2, $output_image);


При этом пути создаются параллельно на двух серверах, но сохраняется изображение только на качающем.
Может я вообще не туда полез, подскажите кто что знает. Заранее спасибо!

(Отредактировано автором: 30 Мая, 2015 - 16:12:21)

Ответ:
Ну да.
Вместо пяти строчек в конфиге хоста сервера ты вылепливаешь какую-то хрень.
Иди читай как настроить проксирование.


-----
Вопрос: простая галерея изображений

Прошу помощи ,wpf только начал изучать. Нужно написать простую галерею.
Я создал форму расположил на ней элементы как нужно было.В папке проэкта создал папку image в ней 4 папки
в каждой по 4 изображения какой метод сделать чтоб по нажатию на item в listboxе слева ставились определённые изображения в image ?
Ответ: