Есть вот такая интересная функция, я стащил её у китайцев и адаптировал к 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]