Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.02.2007, 21:15
незарегистрированный

 
Сообщений: n/a

помогите с фильтром
Добре, вообщем в проекте надо сорудить фильтрацию изображения (Сглаживание, Резкость, Оконтуривание).
Мной был написан следующий код:
/***********************************
pBitmap->PixelFormat = pf24bit;
Byte *ptr, *ptrup, *pdown;
int h=pBitmap->Height,
w=pBitmap->Width;
int z=0;
for(int i=0;i<3;i++)
for(int g=0;g<3;g++)
z+=matr[i][g];
for(int y=0; y<h-1; y++)
{
if(y==0)
ptrup =(Byte*)pBitmap->ScanLine[y];
else
ptrup =(Byte*)pBitmap->ScanLine[y-1];
ptr =(Byte*)pBitmap->ScanLine[y];
if(y==(h-2))
pdown =(Byte*)pBitmap->ScanLine[y];
else
pdown =(Byte*)pBitmap->ScanLine[y+1];
for(int x=0; x<w; x++)
{
for(int s=0; s<3; s++)
{
*ptr=(*(ptrup-3)*matr[0][0]+ *ptrup*matr[0][1]+ *(ptrup+3)*matr[0][2]+ *(ptr-3)*matr[1][0] + *ptr*matr[1][1]+ *(ptr+3)*matr[1][2]+ *(pdown-3)*matr[2][0]+ *pdown*matr[2][1]+ *(pdown+3)*matr[2][2])/z;
ptrup++;
ptr++;
pdown++;
}
}
}
}
/****************************
Сглаживание с матрицей (1,1,1);(1,8,1);(1,1,1) проходит просто на ура, но Резкость с матицей (-1,-1,-1);(-1,14,-1);(-1,-1,-1) выдаёт бурду какую-то, с оконтуриванием та же беда (Матрица (1,0,1);(0,-4,0);(1,0,1))... Нашёл в закормах файлик там перед присвоением значение обрабатывалось функцией In0255(), в самом файле функция не объявлена, билдер не признаёт...

З.Ы. Могу переписать весь код по новой и по другому, но это не спортивно, хочу разобратся с этим...
  #2  
Старый 13.02.2007, 19:04
Пользователь

Отправить личное сообщение для M_Gustokashin Посмотреть профиль Найти все сообщения от M_Gustokashin
 
Регистрация: 24.09.2006
Адрес: Москва, Багратионовская
Сообщений: 81

in0255 видимо, должно проверять, что число лежит в пределах от 0 до 255 (один байт). бурда происходит при переполнении. самый простой вариант поставить перед этим проверку на большем типе и обрезать до 255 при превышении этого значения.
матрица для резкости какая-то странная. может так и задумано, но мне кажется, что вместо 14 должно быть 9. но проверка все равно нужна.
  #3  
Старый 14.02.2007, 12:07
незарегистрированный

 
Сообщений: n/a

!
У меня указатели типа Byte т.е. чисто теоретически значение не может быть больше 255 и меньше 0... К тому же я масягой выводил значения на каждом шаге, сколько шагов не было, но значения выходящего за пределы я не нашёл, может тут есть подводный камушек...? Проверку я конечно попробую поставить. Я тоже подумал что In0255 проверяет лежил ли значение в пределах... К матрице, 14 стоит для незначительного повышения яркости изображения, хотя можно и 9 поставить, суть от этого не должна изменится...
  #4  
Старый 15.02.2007, 22:46
незарегистрированный

 
Сообщений: n/a

нашёл ошибку, как я и подозревал была в автоматическом приведении типов, т.е. в отсутствии раоты как надо...

модераторам: тему можно удалить!
  #5  
Старый 08.08.2008, 17:57
гость

 
Сообщений: n/a

Хм, а как быть с нульом в знаменателе?
Хм, а как быть с нульом в знаменателе при матрице с оконтуриванием?
Матрица (1,0,1);(0,-4,0);(1,0,1)) Сумма елементов даёт 0, а в формуле есть деление на z!
  #6  
Старый 07.01.2009, 11:36
Новичок

Отправить личное сообщение для unknown_coder Посмотреть профиль Найти все сообщения от unknown_coder
 
Регистрация: 07.01.2009
Сообщений: 2

Меня тот же вопрос интересует. Как при оконтурировании быть с нулем в знаменателе? И еще хотелос бы узнать про фильтр Гаусса, каким образом в нем формируется ядро свертки и каков должен быть результат его работы? То, что удалось реализовать мне ничем не отличается от фильтра размывания (сглаживания), а в теории сказано, что он должен убирать шум и оставлять резкие границы.
Вот то, как я формирую матрицу свертки:

for (l=-n;l<=n;l++)
for (k=-m;k<=m;k++)
{ kernel[l+n][k+m]=exp(-(pow(l,2)+pow(k,2))/(2*pow(sigma,2)))/(sigma*sqrt(2*M_PI));
}
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра