Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Swan_explorer
0 / 0 / 0
Регистрация: 13.04.2013
Сообщений: 10
#1

Задача на изображения - C++

15.04.2013, 22:52. Просмотров 872. Ответов 12
Метки нет (Все метки)

Доброе время суток программисты. Я в программировании новичок. Мне предстоит решить такую задачу:

Страшный вирус режет фотографию на 4 частей и перемешивает ее.
На вход на стандартном потоке ввода подаются 4 имен файлов, содержащих
куски одного исходного изображения в формате jpg в случайном порядке.Нужно вывести эти же имена файлов в том порядке, в котором они составляют исходное изображение. Исходное изображение имеет размер 1024x768 пикселей, фрагменты - 256x768 пикселей.

Посоветуйте пожалуйста какую литературу нужно прочитать для решения этого задания. НА что нужно заострить внимание.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2013, 22:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача на изображения (C++):

Задача по кодировке изображения - Графика и игры
Графический файл, кодированный с использованием цветовой палитры из 65536 цветов занимает объем 12288 КБайт. В какое минимальное количество...

Задача вычисление энтропии изображения. Canvas. Ошибка в коде - JavaScript
Задача состоит в вычислении энтропии изображения Формула вычисления энтропии: Entropy=-\sum_{k=0}^K{P(k)}{log_2}{P(k)} где...

Отрисовка изображения поверх канвы (изображения) и вращение изображения - C++ Builder
Здравствуйте. Столкнулся с 2умя проблемами при работе с изображениями средствами C++ Builder. Хочу сделать одну интересную штуку, но...

Как добиться качественного рисования изображения поверх изображения picturebox? - C#
есть код: PictureBox p = (PictureBox)sender; p.SizeMode = PictureBoxSizeMode.Normal; ...

Как изменить параметры изображения, чтоб другие изображения не менялись - HTML, CSS
Не знаю как правильно сформулировать вопрос для поисковиков. Как в css изменить параметры конкретных изображений, чтоб остальные...

Проверить формат изображения, разрешение по ширине и переименовать файл изображения - PHP БД
Подскажите, пожалуйста, какой-нибудь скриптик для решения данной задачи: имеется форма из нескольких текстовых полей и 1 поля загрузки...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 722
15.04.2013, 23:17 #2
я внимательно вчитался в условие задачи... и даже сам кодировал/декордировал jpg и вейвлетный jpeg 2000, и я даже так растерялся... как её решить

первое что на ум пришло - искать информационную энтропию каждого куска, потом остортировать их по значению энтропии (тот что с сигнатурой jpg - в начало, остальные за ним), но это тоже не решение, т.к. после арифметического сжатия ничерта не останется от энтропии...

второе - видимо надо разжимать jpg и глядеть наибольшее соответствие цветов между нижней и верхней границей каждого из 4-х кусков, а потом их отсортировать по наибольшей корреляции, т.к. 768 пискеслей точно хватит определить порядок кусков если там не чистое небо или море ) лучшего решения я не придумал...

как литературу по сжатиям рекомендую почитать это - http://compression.ru/book/
но для решения это задачи это видимо не нужно, достаточно второго способа

Добавлено через 10 минут
да подумав ещё) есть 1 шанс на милиарды миллиардов разжать файл jpg из 4 кусоков 2-мя разными способами... так что смело можно переставлять куски - всего 16 вариантов, пока не разожмётся в корректное изображение
Swan_explorer
0 / 0 / 0
Регистрация: 13.04.2013
Сообщений: 10
15.04.2013, 23:24  [ТС] #3
Abit, насколько я понимаю, то стандартный поток ввода это через fstreaсm нужно читать файл, не так ли? И если да то как я могу распознать его содержимое для дальнейшей расшифровки. И у меня возникла такая идея насчет попиксельного сравнения границы одного куска изображения с боковой границей другого изображения и по колличеству сродных значений пикселов вынести вердикт и постепенно сравнивать остальные изображения.

Добавлено через 2 минуты
И постепенно должна получиться последовательность изображений.

Добавлено через 1 минуту
Напишите пожалуйста.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.04.2013, 07:32 #4
А откуда известна, что она должна расти, или падать с права на лево? Вот если линия пересекает границу фрагментов, а за границей этой линии вдруг нет, или она выше/ниже, то соседний фрагмент не тот и надо искать другую перестановку. Или если в небе вдруг по границе слишком резкий перепад цвета.
Swan_explorer
0 / 0 / 0
Регистрация: 13.04.2013
Сообщений: 10
16.04.2013, 10:08  [ТС] #5
Скажите, пожалуйста. Как нужно разжимать JPEG файл, для корреляции. Если можно с фрагментом кода.
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
16.04.2013, 10:56 #6
OpenCV умеет практически всё.
Как вариант, можно построить контур и уже имея контур искать его сходимости.
Или, вариант даже с перебором. На каждый вариант вычисляем контур, а потом каким-нибудь банальным обходом в ширину получаем оценку удачности данной перестановки.
Не знаю, может есть дофига фильтров, которые сделают задачу лучше.
Ещё подумал немного плохой способ, который завалиться на простейшем вырожденном случае, но всё же:
вычисляется средний цвет на каждой границе и для каждой границе ищется лучший стык - в смысле, чтобы примерно соответствовал лучшему. Но это банально не сработает, если ровно по границе проходит какой-нибудь резкий (горизонт, например).
Swan_explorer
0 / 0 / 0
Регистрация: 13.04.2013
Сообщений: 10
16.04.2013, 21:45  [ТС] #7
Напишите, пожалуйста. Как с помощью OpenСV добраться до определенного значения пикселя в картинке. Заранее благодарю!
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
16.04.2013, 23:11 #8
Цитата Сообщение от Swan_explorer Посмотреть сообщение
Напишите, пожалуйста. Как с помощью OpenСV добраться до определенного значения пикселя в картинке. Заранее благодарю!
Вы математик, чтобы писать алгоритмы самому? OpenCV - набор библиотек для работы с изображением. Обращаться к пикселям не надо. Впрочем, вот. Это ещё один плюс OpenCV - отличная документация.
Swan_explorer
0 / 0 / 0
Регистрация: 13.04.2013
Сообщений: 10
17.04.2013, 00:50  [ТС] #9
AnyOne697, спасибо. Но сейчас я представляю решение этого задания с помощь сравнения значений пикселов. Спасибо за ссылку. Интересно разобраться с этим, но я чувствую, что как новичку мне opencv наверное не осилить. Но стоит попробовать.
MrCold
854 / 752 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
17.04.2013, 01:18 #10
Swan_explorer, можно задание объяснить ?
У вас есть целое изображение и 4 куска этого изображения .
вывести имена файлов (кусков) в том порядке, в котором они составляют исходное изображение
Так ?
Или же исходное изображение не известно. Его нужно "составить" ?

и Хорошо бы вам указать среду в которой работаете ( Visual Studio, C++ Builder и т.д)
Swan_explorer
0 / 0 / 0
Регистрация: 13.04.2013
Сообщений: 10
18.04.2013, 13:20  [ТС] #11
MrCold, да совершенно верно. Cейчас работаю в Visual Studio.

Добавлено через 1 час 23 минуты
Цитата Сообщение от MrCold Посмотреть сообщение
Или же исходное изображение не известно. Его нужно "составить" ?
MrCold, Исходные куски изображения подаются стандартным потоком ввода. И таким образом после вычисления выводиться имена файлов последовательности, которые в правильном порядке составляют изображение.

Добавлено через 14 часов 10 минут
Напишите, пожалуйста программ, в которой с помощью OpenCV можно загрузить изображения, чтобы можно было работать с ним. Потому что я нашел алгоритм сравнения значений пикселов, а как подгрузить картинку для того, чтобы сравнивать ее значения - не знаю.
MrCold
854 / 752 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
18.04.2013, 15:02 #12
Цитата Сообщение от Swan_explorer Посмотреть сообщение
Потому что я нашел алгоритм сравнения
Так в алгоритме то вся и сложность
Цитата Сообщение от Swan_explorer Посмотреть сообщение
Но сейчас я представляю решение этого задания с помощь сравнения значений пикселов
Считать изображение в матрицу пикселов и на WinApi + GDI+ можно,
а вот что с ним делать ?
Кликните здесь для просмотра всего текста
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <Windows.h>
#include <gdiplus.h>
#include <Gdiplusheaders.h>
#pragma comment(lib, "Gdiplus.lib")
 
 
int main()
{
 
         Gdiplus::GdiplusStartupInput startupInput;
         ULONG_PTR gdiplusToken;
         Gdiplus::GdiplusStartup(&gdiplusToken, &startupInput, NULL);
 
         Gdiplus::Color **matrixColor = NULL;
         Gdiplus::Bitmap *image = new Gdiplus::Bitmap(L"Image.jpg");                                
         UINT width  = image->GetWidth();
         UINT height = image->GetHeight();
 
          matrixColor = new Gdiplus::Color*[ width];
          for (int i = 0; i < width ; i++)
          {
            matrixColor[i] = new Gdiplus::Color[ height];
          }
 
          ///////////////////////////////////////////////////
          //  Get Matrix Colors
          //////////////////////////////////////////
 
                  for (int i = 0; i < width; i++)
                  {
                    for (int j = 0; j < height; j++)
                      {
                          image->GetPixel( i, j, &matrixColor[i][j]);
                      }
                  }
 
 
          ///////////////////////////////////////////////////
          //  Print Matrix ALPHA R G B
          //////////////////////////////////////////
       for (int i = 0; i < width ; i++)
                  {
                    for (int j = 0; j < height ; j++)
                      {
                       std::cout << (UINT)matrixColor[i][j].GetA() 
                           << ' '  << (UINT)matrixColor[i][j].GetR() 
                             << ' '  << (UINT)matrixColor[i][j].GetG() 
                                << ' ' << (UINT)matrixColor[i][j].GetB() << std::endl;
                      }
                  }
 
 
          //  delete Matrix 
          //////////////////////////////////////////
      for (int i = 0; i < width ; i++)
          {
           delete [] matrixColor[i];
          }
      delete [] matrixColor;
 
          delete image;
      Gdiplus::GdiplusShutdown(gdiplusToken);
 
 
   system("pause");
   return 0;
}
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
18.04.2013, 21:50 #13
Цитата Сообщение от Swan_explorer Посмотреть сообщение
Напишите, пожалуйста программ, в которой с помощью OpenCV можно загрузить изображения, чтобы можно было работать с ним. Потому что я нашел алгоритм сравнения значений пикселов, а как подгрузить картинку для того, чтобы сравнивать ее значения - не знаю.
Пожалуйста.
Цитата Сообщение от MrCold Посмотреть сообщение
Цитата Сообщение от Swan_explorer Посмотреть сообщение
Потому что я нашел алгоритм сравнения
Так в алгоритме то вся и сложность
Плюсую. Не совсем понятно, в чём сложность сравнивать значения пикселей и тем более не понял, какой именно алгоритм.

Не по теме:

Если используете несколько форумов, то о своих успехах принято сообщать в другие форумы, чтобы темы вовремя закрывались, форум обогащался и участников не посещали мысли, что они общаются в общем то нискем.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2013, 21:50
Привет! Вот еще темы с ответами:

Визуальное перелистывание изображения при переходе от одного изображения к другому - C#
Здравствуйте,нужна помощь,как можно в C#,windows form создать приложение которое делает визуальное перелистывание изображения при переходе...

Как убрать разводы фонового изображения и повысить качество изображения ? - Windows 7
Не знаю как описать проблему, поэтому просто выкладываю скрин. Установил офф драйвер видеокарты с офф сайта производителя. p.s....

как вставить изображения на фон изображения так чтоб оно было 2м фоном - HTML, CSS
Добрый день подскажите как вставить изображения на изображения в сss 2.1 . У меня есть фон картинка и мне нужно вставить еще одну картинку...

Определить отношение линейных размеров изображения в первом случае к размерам изображения во втором - Оптика
Предмет располагается на двойном фокусном расстоянии от собирающей линзы. Линзу заменяют на рассеивающую с таким же по модулю фокусным...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.04.2013, 21:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru