Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сглаживающий фильтр 
:(
    Опции темы
koder
Дата 29.1.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 30.4.2005
Где: Moscow

Репутация: нет
Всего: 2



Как реализовать это?
Цитата

Создаем двухмерный массив необходимого размера;
Генерируем в этот массив (во все ячейки) случайные значения;
Проходимся простым сглаживающим фильтром:

  • Берем точку (все по порядку);
  • Вокруг этой точки берем значения всех восьми точек + значение выбранной точки;
  • Суммируем все эти девять значений;
  • Делим полученное значение на 9 (количество точек - простое усреднение);
  • Полученный результат записываем в исходную точку;
  • Пробегам весь массив;

Далее заполняем случайными значениями еще несколько точек в исходном массиве (примерное количество точек всего - tsize*tsize, нужно заполнить tsiza*10 точек), конкретная точка выбирается случайным образом;
Заново проходимся сглаживающим фильтром.

--------------------
THE TRUTH IS OUT THERE
PM WWW ICQ   Вверх
maxim1000
Дата 29.1.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 24
Всего: 110



на каком языке?


--------------------
qqq
PM WWW   Вверх
koder
Дата 29.1.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 30.4.2005
Где: Moscow

Репутация: нет
Всего: 2



Желательно на Pascal!
--------------------
THE TRUTH IS OUT THERE
PM WWW ICQ   Вверх
cardinal
Дата 29.1.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 15
Всего: 99



Цитата(koder @ 29.1.2006, 08:41 Найти цитируемый пост)

Как реализовать это?

Сначала я бы увеличил размер массива на (tsize+2)*(tsize+2), чтобы дальше проще было. А что проще ты поймешь когда нарисуешь квадрат размера 10x10 например (на клетчатой бумажке), выберешь любую точку и закрасишь каким-нибудь цветом восемь квадратиков вокруг выбранного. Их значения тебе и надо суммировать.
Если (x,y) это координата выбранной точки, то (x-1,y) это точка слева, (x-1,y-1) слева сверху и т.д. Получишь в суммировании восемь строк кода и потом в цикле все этой сделаешь и будет тебе результат...

Если что непонятно напишу поподробней, а если и так понятно, то дальше писать лень... smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
koder
Дата 29.1.2006, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 30.4.2005
Где: Moscow

Репутация: нет
Всего: 2



А я бы ни чего бы не увеличивал! И крутил бы массив не увеличивая размер)
--------------------
THE TRUTH IS OUT THERE
PM WWW ICQ   Вверх
cardinal
Дата 29.1.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 15
Всего: 99



Тогда, когда ты будешь на левом краю (например), ты должен будешь это проверять и не прибавлять значения (x-1, y-1),(x-1, y) и (x-1, y+1), а так этих проверок не будет... К тому же в углах не будет лишнего геморра.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 29.1.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 24
Всего: 110



Цитата(cardinal @ 29.1.2006, 17:20 Найти цитируемый пост)

Тогда, когда ты будешь на левом краю (например), ты должен будешь это проверять

или просто сначала пройтись по краю, а потом делать цикл уже по внутренней части и ничего не проверять...


--------------------
qqq
PM WWW   Вверх
SoWa
Дата 29.1.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 3
Всего: 74



И еще надо создать второй массив. Чтобы каши не было. Т.е. в исходном считаешь, а в новый пишешь.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
cardinal
Дата 29.1.2006, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 15
Всего: 99



Цитата(maxim1000 @ 29.1.2006, 16:21 Найти цитируемый пост)

или просто сначала пройтись по краю, а потом делать цикл уже по внутренней части и ничего не проверять...

Да, это тоже выход из положения. Причем не очень даже плохой, т.к. создавать второй массив большего размера (для исходнодного) в таком случае не надо. А второй массив для результата это конечно нужно.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
koder
Дата 29.1.2006, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 30.4.2005
Где: Moscow

Репутация: нет
Всего: 2



Код

#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

const int m_size=5;
int matrix[m_size][m_size];//мы в Матрице 8-)

void smooth(int i, int j)//сглаживает единственный элемент массива
{
    int count=0;//кол-во клеток
    int sum=0;//сумма
    for (int x=i-1;x<=i+1;x++)
    {
        for (int y=j-1;y<=j+1;y++)
        {
            if (!x || !y || x>=m_size || y>=m_size)
                continue;//такой клетки не существует

            sum+=matrix[x][y];
            count++;
        }
    }

    matrix[i][j]=sum/count;//count нулем быть не может
}

void print_matrix()//выводит массив
{
    for (int i=0;i<m_size;i++)
    {
        for (int j=0;j<m_size;j++)
            printf("%3d ", matrix[i][j]);

        printf("\n");
    }
}

int main()
{
    //забиваем массив случайными значениями
    for (int i=0;i<m_size;i++)
        for (int j=0;j<m_size;j++)
            matrix[i][j]=rand()%100;//от нуля до ста

    print_matrix();

    printf("\n");

    //сглаживаем
    for (int i=0;i<m_size;i++)
        for (int j=0;j<m_size;j++)
            smooth(i,j);

    print_matrix();

    //TODO: здесь надо будет добавить несколько
    //случайных значений и еще раз сгладить...

    getch();

    return 0;
}


Может такой вариант подойдет?
--------------------
THE TRUTH IS OUT THERE
PM WWW ICQ   Вверх
cardinal
Дата 29.1.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 15
Всего: 99



Цитата(koder @ 29.1.2006, 19:09 Найти цитируемый пост)

Может такой вариант подойдет?

Я не понял, ты задавал вопрос или я? Тебе подойдет или кому? smile

А во-вторых то ли мне глючит, то ли ты не обнуляешь ни count, не sum при перепрыгивании на след. точку...

А цикл сделан хреново (см. выше)...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
koder
Дата 29.1.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 30.4.2005
Где: Moscow

Репутация: нет
Всего: 2



count и sum обнуляется, как только попадаем в процедуру..)) их надо обнулять только в начале процедуры! А так рабочий алгоритм? Есть варианты оптимизации?
--------------------
THE TRUTH IS OUT THERE
PM WWW ICQ   Вверх
cardinal
Дата 29.1.2006, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 15
Всего: 99



Цитата(koder @ 29.1.2006, 20:50 Найти цитируемый пост)

count и sum обнуляется, как только попадаем в процедуру.

Понял, извини, не заметил, что ты поточечно обрабатываешь матрицу. Если надобности в этом нет, то это очень плохая реализация, т.к. сложно сделать что-то медленней чем такое вот поточечное обрабатывание. smile
Цитата(koder @ 29.1.2006, 20:50 Найти цитируемый пост)

А так рабочий алгоритм?

Ну так вручную сделай то, что нужно с какой-нибудь матрицей типа 3x4, а потом сделай обработку с помощью твоей проги и сравни...
Цитата(koder @ 29.1.2006, 20:50 Найти цитируемый пост)

Есть варианты оптимизации?

Если бы ты внимательней читал предыдущие посты, то ты бы уже знал, что есть.
От этого сравнения
Код

if (!x || !y || x>=m_size || y>=m_size)
                continue;//такой клетки не существует

можно полностью избавиться!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
koder
Дата 30.1.2006, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 30.4.2005
Где: Moscow

Репутация: нет
Всего: 2



Напиши свой вариант)
--------------------
THE TRUTH IS OUT THERE
PM WWW ICQ   Вверх
cardinal
Дата 30.1.2006, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 15
Всего: 99



Это тебе надо или мне?

Ты давно читал подпись админа? Вот она:
Цитата

Только действия приближают Ваш успех! Только работая Вы добьетесь намеченного!

smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0796 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.