Перейти к содержимому
Compvision.ru
Smorodov

Устранение размытия изображения

Recommended Posts

Есть вот такая интересная функция, я стащил её у китайцев и адаптировал к opencv :)

Картинка для неё:

motion_fuzzy_lena.bmp

Подозреваю что для других картинок надо настраивать параметры

(

int A = 80;int B = 10;

и Общее расстояние сдвига

const int nTotLen=10;

).

Но как пока не разобрался.

В пояснениях было написано, что устраняет размытие от прямолинейного равномерного движения.

Результат работы:

post-1-0-21428500-1303324861_thumb.png


bool cvMotionRestore(IplImage* Src,IplImage* Dst)
{
BYTE * lpSrc;
//Размеры изображения
LONG lWidth=Src->width;
LONG lHeight=Src->height;
// Изображение количество байтов в строке
LONG lLineBytes=Src->widthStep;
LPBYTE lpDIBBits;
lpDIBBits=(LPBYTE)Src->imageData;
//Переменная цикла
long iColumn;
long jRow;
int i,n,m;
//Временные переменные
int temp1,temp2,totalq,q1,q2,z;
double p,q;
// Назначение коэффициентов
int A = 80;
int B = 10;
//Общее расстояние сдвига
const int nTotLen=10;
// Ширина изображения содержит число длин сдвига ntotlen
int K=((float)lLineBytes/(float)nTotLen);
int error[nTotLen];
for (jRow = 0; jRow < lHeight; jRow++)
{
// Вычислить error[i]
for(i = 0; i < nTotLen; i++)
{
error[i] = 0;
for(n = 0; n < K; n++)
for(m = 0; m <= n; m++)
{
// пиксель начале строки
if(i == 0 && m == 0)
{
temp1=temp2=0;
}
// дифференциальный оператор
else
{
lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + m*nTotLen+i;
temp1=*lpSrc;

lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + m*nTotLen+i-1;
temp2 = *lpSrc;
}

error[i] = error[i] + temp1 - temp2;

}
error[i] = B * error[i] / K;
}

for(iColumn = 0; iColumn < lLineBytes; iColumn++)
{
m = iColumn / nTotLen;
z = iColumn - m*nTotLen;

totalq = 0;
q = 0;

for(n = 0; n <= m; n++)
{
q1 = iColumn - nTotLen*n;

if(q1 == 0) {q = 0;}

// дифференциальный оператор
else
{
q2 = q1 - 1;

lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + q1;
temp1 = *lpSrc;

lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + q2;
temp2 = *lpSrc;

q = (temp1 - temp2) * B;
}

totalq = totalq + q;
}

p = error[z];

// Получить значения f(x,y)
temp1 = totalq + A - p;

// Результат к диапазону 0-255
if(temp1 < 0)
temp1 = 0;

if(temp1 > 255)
temp1 = 255;

Dst->imageData[lLineBytes*jRow + iColumn] = temp1;
}
}
return true;
}
[/code]

  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

вообщем мне кажется, что это не самый крутой метод, ибо видны полоски.

можно поискать по тегам

motion blur, motion debluring, Wiener deconvolution

http://www.owlnet.rice.edu/~elec539/Projects99/BACH/proj2/blind/bd.html

http://www.cse.cuhk.edu.hk/~leojia/projects/motion_deblurring/index.html

http://cs.nyu.edu/~fergus/research/deblur.html

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Некрутость этого метода даже не в том что полоски видны, а в том что он не подбирает ядро обратной свертки (Deconvolution).

PS:

Спасибо, ссылки классные :)

Попробую что-нибудь реализовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Продолжая тему фильтров:

Фильтр Винера (Wiener filter):

wiener.cpp

Настроен для работы с изображением http://www.compvision.ru/forum/index.php?app=core&module=attach§ion=attach&attach_id=330 (ядро свертки - прямоугольник 1х10).

Результат работы программы:

post-1-0-70131100-1304014931_thumb.png

Интелловская редакция алгоритма:

http://software.intel.com/en-us/articles/wiener-filtering-using-intel-advanced-vector-extensions/

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Исходное размытое изображение (размываем там-же в программе):

post-1-0-22312900-1395316306_thumb.png

Результат:

post-1-0-94035600-1395316360_thumb.png

Исходник:

stochastic_deconvolution_opencv.zip

Теория:

StochasticDeconvolution-Gregson2013.pdf

Сайт авторов:

http://www.cs.ubc.ca/labs/imager/tr/2013/StochasticDeconvolution/

  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Deep Convolutional Neural Network for Image Deconvolution.

http://lxu.me/projects/dcnn/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×