Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
serik13
3 / 3 / 1
Регистрация: 04.01.2011
Сообщений: 71
#1

Задача на с++ Черно-белая графика - C++

16.09.2011, 18:33. Просмотров 1742. Ответов 1
Метки нет (Все метки)

Нужно решить на с++
заранее спасибоо!

Одна из базовых задач компьютерной графики – обработка черно-белых изображений. Изображения можно представить в виде прямоугольников шириной w и высотой h, разбитых на w×h единичных квадратов, каждый из которых имеет либо белый, либо черный цвет. Такие единичные квадраты называются пикселями. В памяти компьютера сами изображения хранятся в виде прямоугольных таблиц, содержащих нули и единицы.

Во многих областях очень часто возникает задача комбинации изображений. Одним из простейших методов комбинации, который используется при работе с черно-белыми изображениями, является попиксельное применение некоторой логической операции. Это означает, что значение пикселя результата получается применением этой логической операции к соответствующим пикселям аргументов. Логическая операция от двух аргументов обычно задается таблицей истинности, которая содержит значения операции для всех возможных комбинаций аргументов. Например, для операции «исключающее ИЛИ» эта таблица выглядит так.

Первый аргумент Второй аргумент Результат
0 0 0
0 1 1
1 0 1
1 1 0

Требуется написать программу, которая вычислит результат попиксельного применения заданной логической операции к двум черно-белым изображениям одинакового размера.
Формат входных данных

Первая строка входного файла содержит два целых числа w и h (1 ≤ w, h ≤ 100). Последующие h строк описывают первое изображение и каждая из этих строк содержит w символов, каждый из которых равен нулю или единице. Далее следует описание второго изображения в аналогичном формате. Последняя строка входного файла содержит описание логической операции в виде четырех чисел, каждое из которых – ноль или единица. Первое из них есть результат применения логической операции в случае, если оба аргумента – нули, второе – результат в случае, если первый аргумент – ноль, второй – единица, третье – результат в случае, если первый аргумент – единица, второй – ноль, а четвертый – в случае, если оба аргумента – единицы.
Формат выходных данных
В выходной файл необходимо вывести результат применения заданной логической операции к изображениям в том же формате, в котором изображения заданы во входном файле.

Пример входных и выходных данных
bw.in bw.out
5 3
01000
11110
01000
10110
00010
10110
0110 11110
11100
11110

Краткие методические рекомендации по решению задачи
Решение данной задачи в основном заключается в непосредственной аккуратной реализации операции, описанной в условии задачи. Для хранения заданной логической операции можно использовать массив целочисленного типа d[0..1,0..1], элемент которого d[i,j] хранит результат логической операции с первым аргументом i и вторым аргументом j. Таким образом, значение пикселя результата с координатами (x, y) будет равно d[a[x,y],b[x,y]], где a[1..h,1..w] и b[1..h,1..w] – целочисленные матрицы, хранящие исходные изображения.
При реализации решения особое внимание следует уделить этапу считывания исходных изображений и описания логической операции из входного файла, а также выводу результата работы программы в выходной файл.
В чем подвох?
Скажу по секрету, что у меня есть решения задач участников из Волгоградской области, по которым я могу сделать вывод, что многие из них не смогли считать данные из файла bw.in. Обратите внимание, что во входном файле, пробелы между символами есть только в первой строке. Во всех остальных строках, между символами нет пробелов.
Текст программы на Паскале одного из участников олимпиады:
Pascal
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
Var 
  P, Q : array [1..100,1..100] of boolean;
  O : array [False..True, False..True] of char;
  x, y, w, h : byte;
  c : char;
  f : text;
begin
  Assign(f,'bw.in');
  Reset(f);
  Readln(f,w,h);
  for y:=1 to h do
    begin
      for x:=1 to w do
        begin 
          read(f,c);
          if c='1' then 
            P[x,y]:=True 
          else 
            P[x,y]:=False;
        end;
       Readln (f);
    end;
  for y:=1 to h do
    begin
      for x:=1 to w do
        begin 
          read(f,c);
          if c='1' then 
            Q[x,y]:=True 
          else Q[x,y]:=False;
        end;
      Readln (f);
    end;
  Read(f, O[False,False], O[False,True], O[True,False], O[True,True]);
  Close(f);
 
  Assign(f,'bw.out');
  Rewrite(f);
  for y:=1 to h do
    begin 
      for x:=1 to w do 
        Write(f, O[P[x,y],Q[x,y]]);
      Writeln(f);
    end;
  Close(f);
end.
1
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2011, 18:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Задача на с++ Черно-белая графика (C++):

Черно-белая графика (Задача)
Одна из базовых задач компьютерной графики – обработка черно-белых изображений....

на С++ Черно-белая графика
Нужно решить на С++ Каждый элемент квадратной матрицы размеренности N x N...

Dev C++ задача на построение графика функции
Недавно начал изучать C++, до этого пытался выучить Си. Следовательно, хочу...

Цветной BMP в черно-белый
Всем привет! Я выделяю из изображения один цветовой канал и нужно сохранить его...

Загрузить черно-белое изображение в массив
Здравствуйте, помогите с решением задачи: как загрузить бинарное...

Черно-белое изображение в одномерный массив
Подскажите как преобразовать изображение 256х256х8. В одномерный массив?

1
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.09.2011, 10:55 #2
Лучший ответ Сообщение было отмечено serik13 как решение

Решение

Могу предложить мой исходник решения
Не для слабонервных
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
#include <fstream>
#define m(t) for (i = 0; i < n; ++i)     for (j = 0; j < m; ++j)  v >> t[i][j];
#define f(q, w, e) if (a[i][j] - q && b[i][j] - w)     a[i][j] = c[e];
int main(){
    char a[100][100], b[100][100], c[4];
    int n, m, i, j;
    std::fstream v("input.txt");
    std::ofstream o("output.txt");
    v >> m >> n;
    m(a)
    m(b)
    v >> *c >> c[1] >> c[2] >> c[3];
    for (i = 0; i < n; ++i){
        for (j = 0; j < m; ++j){
            f(49, 49, 0)
            else 
                f(49, 48, 1)
            else 
                f(48, 49, 2)
            else
                a[i][j] = c[3];
            o << a[i][j];
        }
        o << '\n';
    }
        
            
}


Вот чуть более читабельный вариант, который в итоге превратился в то, что под катом.
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
#include <iostream>
int main(){
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    char a[100][100], b[100][100], c[4];
    int n, m;
    std::cin >> m >> n;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < m; ++j)
            std::cin >> a[i][j];
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < m; ++j)
            std::cin >> b[i][j];
    std::cin >> c[0] >> c[1] >> c[2] >> c[3];
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < m; ++j){
            if (a[i][j] == '0' && b[i][j] == '0')
                a[i][j] = c[0];
            else if (a[i][j] == '0' && b[i][j] == '1')
                a[i][j] = c[1];
            else if (a[i][j] == '1' && b[i][j] == '0')
                a[i][j] = c[2];
            else
                a[i][j] = c[3];
            std::cout << a[i][j];
        }
        std::cout << std::endl;
    }
        
            
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2011, 10:55
Привет! Вот еще темы с решениями:

Как сделать черно белый скрин в WinXP
В Windows 7 задаю количетсво цветов к примеру черно былый и скрин делаеться...

Программа для сжатия черно-белых изображений
Одной из самых часто встречаемых задач в информатике является задача сжатия...

Определить, может ли белая фигура пойти на поле
Пожалуйста помогите, очень презнателен... 1. Поле шахматной доски...

Черно-белая картинка
Здравствуйте подскажите пожалуйста как правильно прописать фильтр grayscale...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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