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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2009, 23:01   #1
osamabengitler
Новичок
Джуниор
 
Регистрация: 20.08.2009
Сообщений: 1
Вопрос Получить изображение с нормализованной яркостью

Задание:

Сформировать результирующее изображение с нормализованной гистограммой распределения яркостей из исходного изображения.

Входные данные:

* файл с исходным черно-белым изображением 8-бит на пиксел в pnm-формате
* файл с параметрами в текстовом формате

Выходные данные:

* файл с обработанным черно-белым изображением 8-бит на пиксел в pnm-формате

Передача вх./вых. данных осуществляется через командную строку, следующим образом:
<программа><параметры><начальное изображение><конечное изобр.>

Описание файла параметров:
Обработка части изображения, находящегося в окне. Область окна обработки (4-ре целых left, top, right, bottom).

Описание файла pnm-формата:
<Тег><\0x0A><ширина><\0x20><высота> <\0x0A><глубина_цвета><\0x0A>
<pixel[0][0]><pixel[0][1]>...<pixel[0][ширина-1]>
...
<pixel[высота-1][0]><pixel[высота-1][1]>...<pixel[высота-1][ширина-1]>

где:
<Тег> ---------------- Строка P5
<pixel[x][y]> -------- Байт кодирующий яркость
<ширина> ----------- строка в текстовом виде (например 768)
<высота> ------------ строка в текстовом виде (например 576)
<глубина_цвета> --- строка в текстовом виде (например 255)

Алгоритм обработки изображения:

* для входного изображения рассчитать гистограмму распределения яркостей H[0..n]
* по расчитанной гистограмме сформировать таблицу перекодировки яркости L[0..n]
L[k]=(n*сумма_от_i=0_до_k H[i])/сумма_от_i=0_до_n H[i] ,где n - глубина цвета.
* каждый пиксел выходного изображения формировать следующим образом:
out[x,y]=L[inp[x,y]]

Среда разработки:Visual C++ Express Edition 2008
Язык: C++

ВОПРОС:
Раньше с изображениями не работал. Как открыть изображение, загрузить его в память(массив или указатель) и преобразовать попиксельно, извлечь информацию о размерах и глубине изображения?

Пробовал для примера работать с потоками над текстовыми файлами.
С изображениями не катит.

Код:
#include "stdafx.h"
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
bool optimization ( string elem1, string elem2 )
{
    return elem1 > elem2;
}
int _tmain(int argc, _TCHAR* argv[])
{

    ifstream s("input.txt");
    ifstream p("param.txt");
    ofstream d("output.txt");
  vector<string> aa;
  vector<string> bb;
  char ee[255];
  string cmdcheck="pnmedit";
  string cmdload;
//input
  cin >>cmdload;
  while(cmdload != cmdcheck){
          cout << "Incorrect command\nEnter correct command\n";
          cin >>cmdload;}
  if (cmdload == cmdcheck && s.is_open() && p.is_open()) 
  {
    while(!s.eof()){
      s.getline(ee, 254);
      aa.push_back(ee);}
    while(!p.eof()){
      p.getline(ee, 254);
      bb.push_back(ee);}
//optimization
    sort(aa.begin(), aa.end(), optimization);
    sort(bb.begin(), bb.end(), optimization);
//output
    for (vector<string>::iterator j=aa.begin(); j!=aa.end(); j++) d<<(*j).c_str()<<endl;
    for (vector<string>::iterator j=bb.begin(); j!=bb.end(); j++) d<<(*j).c_str()<<endl;
  }
  s.close();
  d.close();
  return 0;
}

Вот еще пробовал, но безуспешно.

Код:
#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
  
  int size_x = 768 ;
  int size_y = 576 ; 
  int image_size = size_x*size_y; 
  char* image = 0 ;

  if (4 != argc)
  {
    cout << "Invalid command line\n" ;
    return -1 ;
  }

  ifstream s(argv[1]);
  ifstream p(argv[2]);
  ofstream d(argv[3]);

  image = new char[image_size] ;
  if (0==image)
  {
    cout << "Can't allocate memory\n" ;
    return -1 ;
  } ;

  
  char* line = image ;
  for(int y=0 ; y<size_y ; ++y, line+=size_x) 
  {
    //char* line = &image[y*size_x];
    for(int x=0 ; x<size_x ; ++x)
    {
      //image[y*size_x+x] = 0x56 ;
      image[x] = 0x56 ; // обработка
    }
  } 


 
    d << '\x0A' ;

  return 0;
}
Думаю разборка этого примера поможет не только мне, но и многим начинающим. Заранее всех благодарю.

Последний раз редактировалось Stilet; 21.08.2009 в 09:15.
osamabengitler вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уменьшаем изображение brutos Мультимедиа в Delphi 4 19.05.2009 15:59
Изображение Terran Работа с сетью в Delphi 2 08.02.2008 22:28
Замостить изображение SunKnight Общие вопросы Delphi 5 13.01.2008 14:23
Как получить изображение, если я знаю его хендл? AidarBik Win Api 4 05.11.2007 15:54
Изображение Artem Мультимедиа в Delphi 10 13.07.2007 13:27