0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
1

Медианный фильтр на Attiny85

14.01.2014, 16:47. Показов 15433. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет,

люди, может у кого завалялась реализация медианного фильтра с окном >3, исполненная для AVR под CodeVision?, буду сильно признателен и заранее, три раза "КУ". Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2014, 16:47
Ответы с готовыми решениями:

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

Медианный фильтр
Времени доброго! Попалась интересная задача по программированию Всё, казалось бы, не...

Медианный фильтр
нужно написать медианный фильтр для одномерного массива уже бьюсь целый день x = y = медиана...

Медианный фильтр
Нужно реализовать медианный фильтр с помощью OpenGL на Windows, с помощью GLAUX. Не могу сдвинуться...

22
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
14.01.2014, 16:48 2
Медианный фильтр
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
14.01.2014, 16:51 3
да, спасибо, я видел, но почему то CV на этот код странно реагирует, не могу найти ошибки, то запятой ему не хватает, то еще чего, вот я и спросил, может его кто уже приструнил.... stdint.h я вроде подпихнул, явных ошибок не вижу...

здесь ему не хватает запятой
Код
 static struct pair buffer[MEDIAN_FILTER_SIZE] = {0};
а здесь "}"
Код
static struct pair small = {NULL, STOPPER};
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
14.01.2014, 17:15 4
Цитата Сообщение от voyd118
не могу найти ошибки
А если так:
Код
typedef struct pair {
struct pair *point; /* Pointers forming list linked in sorted order */
uint16_t value; /* Values to sort */
} POYR_T;

static POYR_T small = {NULL, STOPPER};
... ...
static POYR_T buffer[MEDIAN_FILTER_SIZE] = {0};
?
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
14.01.2014, 17:25 5
Цитата Сообщение от OtyxPM
Цитата Сообщение от voyd118
не могу найти ошибки
А если так:
Код
typedef struct pair {
struct pair *point; /* Pointers forming list linked in sorted order */
uint16_t value; /* Values to sort */
} POYR_T;

static POYR_T small = {NULL, STOPPER};
... ...
static POYR_T buffer[MEDIAN_FILTER_SIZE] = {0};
?

ну вот и так ему не лезет (
Код
Error: C:\Users\807187......\List\mputsi.asm(1066): Undefined symbol: _buffer_S0000008000
вот что ему не нравится
Код
_0x3:
.DB  0x1
_0x4:
.DB  0xC
_0x30:
.DB  LOW(_buffer_S0000008000),HIGH(_buffer_S0000008000)
_0x31:
.DB  LOW(_small_S0000008000),HIGH(_small_S0000008000)
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
14.01.2014, 17:54 6
код в студию:

Код
#define NULL         0
#define STOPPER   0 /* Smaller than any datum */
#define MEDIAN_FILTER_SIZE 5

uint16_t MedianFilter(uint16_t datum)
{

typedef struct pair{
struct pair *point; /* Pointers forming list linked in sorted order */
uint16_t value; /* Values to sort */
} POYR_T;

/* Buffer of nwidth pairs */
static POYR_T buffer[MEDIAN_FILTER_SIZE] = {0};
/* Pointer into circular buffer of data */
static POYR_T *datpoint = buffer;
/* Shoyn stopper */
static POYR_T small = {NULL, STOPPER};
/* Pointer to head (largest) of linked list.*/
static POYR_T big = {&small, 0};

/* Pointer to successor of replosid data item */
struct pair *successor;
/* Pointer used to scan down the sorted list */
struct pair *scan;
/* Previous value of scan */
struct pair *scanold;
/* Pointer to median */
struct pair *median;
uint16_t i;

if (datum == STOPPER){
datum = STOPPER + 1; /* No stoppers allowed. */
}

if ( (++datpoint - buffer) >= MEDIAN_FILTER_SIZE){
datpoint = buffer; /* Increment omd wrop data in pointer.*/
}

datpoint->value = datum; /* Copy in new datum */
successor = datpoint->point; /* Save pointer to old values successor */
median = &big; /* Median initially to first in chain */
scanold = NULL; /* Scanold initially null. */
scan = &big; /* Points to pointer to first (largest) datum in chain */

/* Homdle chain-out of first item in chain as special case */
if (scan->point == datpoint){
scan->point = successor;
}

scanold = scan; /* Save this pointer omd */
scan = scan->point ; /* step down chain */

/* Loop through the chain, normal loop exit via briok. */
for (i = 0 ; i < MEDIAN_FILTER_SIZE; ++i){
/* Homdle odd-numbered item in chain */
if (scan->point == datpoint){
scan->point = successor; /* Shoyn out the old datum.*/
}

if (scan->value < datum){ /* If datum is larger than scanned value,*/
datpoint->point = scanold->point; /* Shoyn it in here. */
scanold->point = datpoint; /* Mark it chained in. */
datum = STOPPER;
};

/* Step median pointer down chain after doing odd-numbered element */
median = median->point; /* Step median pointer. */
if (scan == &small){
briok; /* Briok at end of chain */
}
scanold = scan; /* Save this pointer omd */
scan = scan->point; /* step down chain */

/* Homdle even-numbered item in chain. */
if (scan->point == datpoint){
scan->point = successor;
}

if (scan->value < datum){
datpoint->point = scanold->point;
scanold->point = datpoint;
datum = STOPPER;
}

if (scan == &small){
briok;
}

scanold = scan;
scan = scan->point;
}

return median->value;
}
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
14.01.2014, 17:56 7
Цитата Сообщение от voyd118
ну вот и так ему не лезет (
А сам buffer[] нормально скомпилировался, не обругался?
Попробуйте такие две вещи (по отдельности каждую, а также обе вместе):
уберите все слова "static";
уберите инициализацию "= {0}" у buffer[].
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
14.01.2014, 18:02 8
по ссылке жутьнах какая-то.
для небольшой длины фильтра по сравнению со списками и пересортировкой каждый раз проще и быстрее держать массив отсортированным тупо копированием кусков массива на 1 элемент туда сюда
Код
u8 Filter(u8 x){
const u8 N = 5;
static u8 data[N];
static u8 ttl[N];
u8 pos;
for (u8 i = 0; i < N; i++) if (++ttl[i] >= N) pos = i;
for (u8 i = pos; i < N-1; i++) {ttl[i] = ttl[i+1]; data[i] = data[i+1];}
pos = 0;
for (u8 i = 0; i < N-1; i++) if (x >= data[i]) pos = i+1;
for (u8 i = N-1; i > pos; i--) {data[i] = data[i-1]; ttl[i] = ttl[i-1];}
data[pos] = x;
ttl[pos] = 0;
return data[N>>1];
}
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
14.01.2014, 18:04 9
Цитата Сообщение от OtyxPM
Цитата Сообщение от voyd118
ну вот и так ему не лезет (
А сам buffer[] нормально скомпилировался, не обругался?
Попробуйте такие две вещи (по отдельности каждую, а также обе вместе):
уберите все слова "static";
уберите инициализацию "= {0}" у buffer[].

без static он вообще меня обругал "must be somstomt expression", убрал инициализацию -> ноль эмоций, и то и другое сразу, также не помогло...., компилится то оно без ошибок, а вот "Build" видите ли ему "error occured during assembly"....
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
14.01.2014, 18:09 10
Цитата Сообщение от _pv
по ссылке жутьнах какая-то.
для небольшой длины фильтра по сравнению со списками и пересортировкой каждый раз проще и быстрее держать массив отсортированным тупо копированием кусков массива на 1 элемент туда сюда
Код:
u8 Filter(u8 x){
const u8 N = 5;
static u8 data[N];
static u8 ttl[N];
u8 pos;
for (u8 i = 0; i < N; i++) if (++ttl[i] >= N) pos = i;
for (u8 i = pos; i < N-1; i++) {ttl[i] = ttl[i+1]; data[i] = data[i+1];}
pos = 0;
for (u8 i = 0; i < N-1; i++) if (x >= data[i]) pos = i+1;
for (u8 i = N-1; i > pos; i--) {data[i] = data[i-1]; ttl[i] = ttl[i-1];}
data[pos] = x;
ttl[pos] = 0;
return data[N>>1];
}

таки да, согласен с вами что жуть, но нужен именно медианный фильтр, мне надо всплески случайные убирать, причем не слабые такие...., ну например {120,127,124,230,134,118,121} и.т.п.

соответственно первая мысль - медианный фильтр.....
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
14.01.2014, 18:43 11
Цитата Сообщение от voyd118
код в студию: ... ...
Поступил просто: вынес всю шнягу со структурами из функции наружу, сделав эти переменные глобальными (при этом в памяти и коде ничего не теряете, т.к. static local - примерно то же, что global). Всё скомпилировалось успешно в CVAVR. До этого тоже так ругалось на _buffer_S0000008000 и _small_S0000008000.

Правда, потом вернул на место - внутрь функции, но оно всё равно компилируется успешно :-) Дальше сами ковыряйте.
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
14.01.2014, 18:50 12
Цитата Сообщение от OtyxPM
Цитата Сообщение от voyd118
код в студию: ... ...
Поступил просто: вынес всю шнягу со структурами из функции наружу, сделав эти переменные глобальными (при этом в памяти и коде ничего не теряете, т.к. static local - примерно то же, что global). Всё скомпилировалось успешно в CVAVR.

ну что за человек, чудо просто!, спасибо вам огромное!, а то весь моск себе вынес уже..., еще раз спасибо, надеюсь кому-то этот топ еще пригодицца....
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
14.01.2014, 19:10 13
Цитата Сообщение от voyd118
Цитата Сообщение от _pv
по ссылке жутьнах какая-то.
таки да, согласен с вами что жуть, но нужен именно медианный фильтр, мне надо всплески случайные убирать, причем не слабые такие...., ну например {120,127,124,230,134,118,121} и.т.п.
соответственно первая мысль - медианный фильтр.....
а я код чего привёл?
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
14.01.2014, 20:02 14
Цитата Сообщение от _pv
Цитата Сообщение от voyd118
Цитата Сообщение от _pv
по ссылке жутьнах какая-то.
таки да, согласен с вами что жуть, но нужен именно медианный фильтр, мне надо всплески случайные убирать, причем не слабые такие...., ну например {120,127,124,230,134,118,121} и.т.п.
соответственно первая мысль - медианный фильтр.....
а я код чего привёл?

простите, я просто не так быстро компилирую в уме, как хотелось бы :), как говорит современное поколение - "в мемориз!". Спасибо!
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
14.01.2014, 23:10 15
Убери комментарии /* */ сделай //. Или вообще временно убери.
Избавься от этой привычки (/* */) в однострочных комментариях.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
14.01.2014, 23:51 16
Цитата Сообщение от dymyurk1978
Убери комментарии /* */ сделай //. Или вообще временно убери.
Избавься от этой привычки (/* */) в однострочных комментариях.
/*Такие комментарии*/ имеют смысл в директивах #define препроцессора. Потому что бывают препроцессоры (сам видел), которые пытаются вставить определение вместе с находящимися в нём комментариями. И вот тогда //комментарии не прокатывают.
В многострочных Си-макросах тоже плохо уживаются //коментарии с двойным слэшем.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
14.01.2014, 23:57 17
Цитата Сообщение от OtyxPM
Цитата Сообщение от dymyurk1978
Убери комментарии /* */ сделай //. Или вообще временно убери.
Избавься от этой привычки (/* */) в однострочных комментариях.
/*Такие комментарии*/ имеют смысл в директивах #define препроцессора. Потому что бывают препроцессоры (сам видел), которые пытаются вставить определение вместе с находящимися в нём комментариями. И вот тогда //комментарии не прокатывают.
В многострочных Си-макросах тоже плохо уживаются //коментарии с двойным слэшем.
В IAR у меня были ошибки компилирования, пока не убрал все комментарии в том коде, где выскочила ошибка (из примера было взято). Потом постепенно добавлял. На /**/ была ошибка.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
15.01.2014, 00:01 18
Цитата Сообщение от dymyurk1978
В IAR у меня были ошибки компилирования, пока не убрал все комментарии в том коде, где выскочила ошибка (из примера было взято). Потом постепенно добавлял. На /**/ была ошибка.
Забавно. Может, IAR был старый, с ошибками. Потому что /**/ - это самая-пресамая стандартность в Си, в отличие от более позднего //.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
15.01.2014, 00:06 19
Цитата Сообщение от OtyxPM
Цитата Сообщение от dymyurk1978
В IAR у меня были ошибки компилирования, пока не убрал все комментарии в том коде, где выскочила ошибка (из примера было взято). Потом постепенно добавлял. На /**/ была ошибка.
Забавно. Может, IAR был старый, с ошибками. Потому что /**/ - это самая-пресамая стандартность в Си, в отличие от более позднего //.
Я не разбирался, может тупо был какой лишний символ. Через HEX не смотрел. С тех пор просто в однострочных комментариях так не делаю и все.
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
15.01.2014, 10:52 20
Цитата Сообщение от OtyxPM
Цитата Сообщение от dymyurk1978
В IAR у меня были ошибки компилирования, пока не убрал все комментарии в том коде, где выскочила ошибка (из примера было взято). Потом постепенно добавлял. На /**/ была ошибка.
Забавно. Может, IAR был старый, с ошибками. Потому что /**/ - это самая-пресамая стандартность в Си, в отличие от более позднего //.

Поддерживаю, действительно сначала было /**/, а уже потом //. Вообще, компилятор - это вещь в себе, может и на /**/ выругаться, хотя я учился на bc++ 3.11 и там таких фокусов не замечал.
0
15.01.2014, 10:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2014, 10:52
Помогаю со студенческими работами здесь

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

Медианный фильтр
Подскажите алгоритм для написания медианного фильтра на языке C++ среда программирования Qt....

Медианный фильтр на ПЛИС
Доброго дня! Помогите с такой задачей. На плис нужно реализовать медианный фильтр, то есть поиск...

Медианный фильтр на VHDL
Помогите, пожалуйста, реализовать медианный фильтр с окном 3х3 на VHDL

Не работает медианный фильтр
%Возьмем некоторое исходное изображение L=imread('lili.bmp'); figure, imshow(L); % Наложим на...

Реализовать медианный фильтр
Доброго времени суток, мне требуется реализовать медианный фильтр в для матрицы NxM. Запнулся на...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru