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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2007, 19:44   #1
CombaSoft
Новичок
Джуниор
 
Регистрация: 16.07.2007
Сообщений: 2
По умолчанию Алгоритм Гауссовского размытия...

...помогите найти пожалста. Нужен именно сам алгоритм - готовый код не нужный.
CombaSoft вне форума Ответить с цитированием
Старый 17.07.2007, 08:57   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Можете преобразовать в delphi
Код:
public static bool Smooth(Bitmap b, int nWeight)
{
ConvMatrix m = new ConvMatrix();
m.SetAll(1);
m.Pixel = nWeight;
m.Factor = nWeight + 8;

return BitmapFilter.Conv3x3(b, m);
}


public static bool GaussianBlur(Bitmap b, int nWeight)
{
ConvMatrix m = new ConvMatrix();
m.SetAll(1);
m.Pixel = nWeight;
m.TopMid = m.MidLeft = m.MidRight = m.BottomMid = 2;
m.Factor = nWeight + 12;

return BitmapFilter.Conv3x3(b, m);
}



public class ConvMatrix
{
public int TopLeft = 0, TopMid = 0, TopRight = 0;
public int MidLeft = 0, Pixel = 1, MidRight = 0;
public int BottomLeft = 0, BottomMid = 0, BottomRight = 0;
public int Factor = 1;
public int Offset = 0;

public void SetAll(int nVal)
{
TopLeft = TopMid = TopRight = MidLeft = Pixel = MidRight = BottomLeft = BottomMid = BottomRight = nVal;
}
}

public static bool Conv3x3(Bitmap b, ConvMatrix m)
{
if (0 == m.Factor) return false;

Bitmap bSrc = (Bitmap)b.Clone();

BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
BitmapData bmSrc = bSrc.LockBits(new Rectangle(0, 0, bSrc.Width, bSrc.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int stride = bmData.Stride;
int stride2 = stride * 2;
System.IntPtr Scan0 = bmData.Scan0;
System.IntPtr SrcScan0 = bmSrc.Scan0;

unsafe
{
byte * p = (byte *)(void *)Scan0;
byte * pSrc = (byte *)(void *)SrcScan0;

int nOffset = stride - b.Width*3;
int nWidth = b.Width - 2;
int nHeight = b.Height - 2;

int nPixel;

for(int y=0;y < nHeight;++y)
{
for(int x=0; x < nWidth; ++x )
{
nPixel = ( ( ( (pSrc[2] * m.TopLeft) + (pSrc[5] * m.TopMid) + (pSrc[8] * m.TopRight) +
(pSrc[2 + stride] * m.MidLeft) + (pSrc[5 + stride] * m.Pixel) + (pSrc[8 + stride] * m.MidRight) +
(pSrc[2 + stride2] * m.BottomLeft) + (pSrc[5 + stride2] * m.BottomMid) + (pSrc[8 + stride2] * m.BottomRight)) / m.Factor) + m.Offset);

if (nPixel < 0) nPixel = 0;
if (nPixel > 255) nPixel = 255;

p[5 + stride]= (byte)nPixel;

nPixel = ( ( ( (pSrc[1] * m.TopLeft) + (pSrc[4] * m.TopMid) + (pSrc[7] * m.TopRight) +
(pSrc[1 + stride] * m.MidLeft) + (pSrc[4 + stride] * m.Pixel) + (pSrc[7 + stride] * m.MidRight) +
(pSrc[1 + stride2] * m.BottomLeft) + (pSrc[4 + stride2] * m.BottomMid) + (pSrc[7 + stride2] * m.BottomRight)) / m.Factor) + m.Offset);

if (nPixel < 0) nPixel = 0;
if (nPixel > 255) nPixel = 255;

p[4 + stride] = (byte)nPixel;

nPixel = ( ( ( (pSrc[0] * m.TopLeft) + (pSrc[3] * m.TopMid) + (pSrc[6] * m.TopRight) +
(pSrc[0 + stride] * m.MidLeft) + (pSrc[3 + stride] * m.Pixel) + (pSrc[6 + stride] * m.MidRight) +
(pSrc[0 + stride2] * m.BottomLeft) + (pSrc[3 + stride2] * m.BottomMid) + (pSrc[6 + stride2] * m.BottomRight)) / m.Factor) + m.Offset);

if (nPixel < 0) nPixel = 0;
if (nPixel > 255) nPixel = 255;

p[3 + stride] = (byte)nPixel;

p += 3;
pSrc += 3;
}
p += nOffset;
pSrc += nOffset;
}
}

b.UnlockBits(bmData);
bSrc.UnlockBits(bmSrc);

return true;
}
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 17.07.2007, 14:36   #3
CombaSoft
Новичок
Джуниор
 
Регистрация: 16.07.2007
Сообщений: 2
По умолчанию

Я надеялся увидеть изложение алгоритма Гауссовского размытия + пример реализации.
Но и на этом спасибо - попробую перевести в Делфи.
CombaSoft вне форума Ответить с цитированием
Старый 18.07.2007, 10:22   #4
Net
;-)
Пользователь
 
Регистрация: 18.07.2007
Сообщений: 69
По умолчанию

Всем привет.

В инете по запросу повсюду один и тот же алгоритм.
Перевел его на асм, упростив до не могу. В среднем, разогнал в 3.5 раза, в основном из-за перевода на асм-код, но была еще одна алгоритмическая оптимизация.

Держи код (дельфовый на асме) и демку. в демке есть также код чисто паскалевский, неоптимизированный.

Заодно провериться хоть, работает ли этот код не только на моем компе

p.s. Да, я еще жестоко по размеру оптимизировал. Скомпиленый 7-й делфи dcu получается 1938 байт. сам код 800 с чем-то.
Вложения
Тип файла: rar Gaussian Blur Optimization.rar (172.3 Кб, 113 просмотров)

Последний раз редактировалось Net; 18.07.2007 в 10:24.
Net вне форума Ответить с цитированием
Старый 18.07.2007, 10:34   #5
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Net плюсадин
пыщь
JTG вне форума Ответить с цитированием
Старый 05.11.2008, 21:49   #6
iframe
Новичок
Джуниор
 
Регистрация: 05.11.2008
Сообщений: 1
По умолчанию

в Delphi 2009 видимо не прописана функция _exp в модуле System, поэтому код из Gaussian Blur Optimization.rar не компилируется.

Сделал очень просто. Заменил строчку call System.@Exp на кусок кода из исходника в Delphi 7:

Код:
        {       e**x = 2**(x*log2(e))   }

        FLDL2E              { y := x*log2e;      }
        FMUL
        FLD     ST(0)       { i := round(y);     }
        FRNDINT
        FSUB    ST(1), ST   { f := y - i;        }
        FXCH    ST(1)       { z := 2**f          }
        F2XM1
        FLD1
        FADD
        FSCALE              { result := z * 2**i }
        FSTP    ST(1)
может пригодится кому. я маялся с этим час-два, блин)
iframe вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм SunKnight Работа с сетью в Delphi 5 29.04.2008 15:24
Алгоритм Rifler Паскаль, Turbo Pascal, PascalABC.NET 3 30.03.2008 01:33
Алгоритм сравнения f3nix Общие вопросы Delphi 1 16.02.2008 11:12
Просто алгоритм:) Sota Общие вопросы C/C++ 14 11.02.2008 10:45
Алгоритм Дейкстры Dimon88 Помощь студентам 2 03.11.2007 17:13