Что не так в следующем коде интерполяции cpp Bucubic для изменения размера изображения - PullRequest
0 голосов
/ 18 августа 2011

Я пытаюсь сэмплировать изображение с помощью бикубической интерполяции, мне нужны точные значения, соответствующие функции cvResize () opencv, но результаты следующего кода не совпадают с результатами cvResize (), можете ли вы взглянуть ипомогите мне исправить ошибку.

Image *Image::resize_using_Bicubic(int w, int h) {
    float dx,dy;
    float x,y;
    float tx, ty;
    float i,j,m,n;</p>

<code>Image *result=new Image(w, h);
tx = (float)this->m_width/(float)w;
ty = (float)this->m_height/(float)h;
for(i=0; i< w; i++)
{
    for(j=0; j< h; j++)
    {
        x = i*tx;
        y = j*ty;
        dx = float(i-x)-(int)(i-x);
        dy = float(j-y)-(int)(j-y);
        float temp=0.0;
        for(m=-1;m<=2;m++)
        {
            for(n=-1;n<=2;n++)
            { 

                int HIndex,WIndex;
                HIndex=(y+n);
                WIndex=(x+m);

                if (HIndex<0) {
                    HIndex=0;
                }
                else if(HIndex>this->getHeight())
                {
                    HIndex=this->getHeight()-1;

                }
                if (WIndex<0) {
                    WIndex=0;
                }
                else if(WIndex>this->getWidth())
                {
                    WIndex=this->getWidth()-1;

                }


                temp+=this->getPixel(HIndex,WIndex)*R(m-dx)*R(dy-n);
            }
        }

        result->setPixel(j, i, temp);
    }
}
return result;
</code>

}

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Вы не сказали, насколько отличаются результаты.Если они очень близки, скажем, в пределах 1 или 2 в каждом канале RGB, это можно объяснить просто разностями округления.

Существует более одного алгоритма для бикубической интерполяции.Дон Митчелл и Арун Нетравали провели анализ и разработали единую формулу для описания их ряда: http://www.mentallandscape.com/Papers_siggraph88.pdf

Редактировать: Еще одна вещь, отдельные коэффициенты фильтра должны быть суммированыи используется для деления окончательного значения в конце, чтобы нормализовать значения.И я не уверен, почему у вас есть m-dx для одного и dy-n для другого, разве они не должны быть одинаковыми?

r=R(m-dx)*R(dy-n);
r_sum+=r;
temp+=this->getPixel(HIndex,WIndex)*r;
. . .
result->setPixel(j, i, temp/r_sum);
0 голосов
/ 18 августа 2011

Изменение:

            else if(HIndex>this->getHeight())

до:

            else if(HIndex >= this->getHeight())

и изменить:

            else if(WIndex>this->getWidth())

до:

            else if(WIndex >= this->getWidth())

EDIT

Также изменить:

    for(m=-1;m<=2;m++)
    {
        for(n=-1;n<=2;n++)

до:

    for(m = -1; m <= 1; m++)
    {
        for(n = -1; n <= 1; n++)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...