Smorodov 579 Жалоба Опубликовано April 20, 2011 Есть вот такая интересная функция, я стащил её у китайцев и адаптировал к opencv Картинка для неё: motion_fuzzy_lena.bmp Подозреваю что для других картинок надо настраивать параметры ( int A = 80;int B = 10; и Общее расстояние сдвига const int nTotLen=10; ). Но как пока не разобрался. В пояснениях было написано, что устраняет размытие от прямолинейного равномерного движения. Результат работы: 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] 2 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 21, 2011 вообщем мне кажется, что это не самый крутой метод, ибо видны полоски. можно поискать по тегам 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 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 21, 2011 Некрутость этого метода даже не в том что полоски видны, а в том что он не подбирает ядро обратной свертки (Deconvolution). PS: Спасибо, ссылки классные Попробую что-нибудь реализовать. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 28, 2011 Продолжая тему фильтров: Фильтр Винера (Wiener filter): wiener.cpp Настроен для работы с изображением http://www.compvision.ru/forum/index.php?app=core&module=attach§ion=attach&attach_id=330 (ядро свертки - прямоугольник 1х10). Результат работы программы: Интелловская редакция алгоритма: http://software.intel.com/en-us/articles/wiener-filtering-using-intel-advanced-vector-extensions/ 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 20, 2014 Еще один замысловатый способ устранения размытия (нужно знать чем размывали, метод не слепой). Исходное размытое изображение (размываем там-же в программе): Результат: Исходник: stochastic_deconvolution_opencv.zip Теория: StochasticDeconvolution-Gregson2013.pdf Сайт авторов: http://www.cs.ubc.ca/labs/imager/tr/2013/StochasticDeconvolution/ 2 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 4, 2016 Deep Convolutional Neural Network for Image Deconvolution. http://lxu.me/projects/dcnn/ Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах