【이미지 처리 100개 노크에 도전】Q.26. Bi-linear 보간
사용한 라이브러리
【화상 처리 100개 노크】 독자적인 화상 입출력 클래스를 만든다
Q.26. Bi-linear 보간
Bi-linear 보간으로 이미지를 1.5배로 확대해라.
바이리니어 보간은 때때로 사용하고 있습니다만, 식의 도출은 한 적이 없었기 때문에 이 기회에 생각해 보겠습니다.
첫째, 간단을 위해 1 차원으로 생각합니다.
위의 그림에서 $x=i$ 위치의 함수값 $I(i)$ 및 $x=i+1$ 위치의 함수값 $I(i+1)$를 알고 있습니다. 이 사이의 위치 $ x $에서 함수 값을 추정하는 것이 목적입니다. 추정량은 $x$의 함수가 되는 것입니다. $x=i,i+1$의 값을 구속조건으로 하는 것만으로는 조건을 만족하는 함수는 얼마든지 존재하는 것입니다만, 가장 간단한 것은 1차 함수입니다. 1차 함수에 한정하면, 구속 조건을 만족하는 함수는
I(x) = \{I(i+1)-I(i)\}(x-i) + I(i)
밖에 없습니다. 2차원으로 생각합니다.
위 그림의 직선 A에서 선형 보간을 생각하면
I(y;x=i) = \{I(i,j+1)-I(i,j)\}(y-j) + I(i,j)
됩니다. 마찬가지로 직선 B에서
I(y;x=i+1) = \{I(i+1,j+1)-I(i+1,j)\}(y-j) + I(i+1,j)
됩니다. 점선의 왼쪽 점을 $I(y;x=i)$ 로, 오른쪽 점을 $I(y;x=i+1)$ 로 합니다. 이 두 점 사이의 점 $(x,y)$ 의 값은 이러한 선형 보간으로 합니다.
I(x,y) = \{I(y;x=i+1)-I(y;x=i)\}(x-i) + I(y;x=i)
이것에 구체적인 식을 넣어 주면 바이 리니어 보간의 식이됩니다. 100개 노크의 문제문에 한하지 않고, 거리로 가중치 한다는 설명이 많습니다만, 여기서 말하는 거리는 2차원 유클리드 거리가 아닌 것에 주의가 필요합니다.
int main()
{
PPM ppm("imori.pnm");
int width = ppm.Get_width();
int height = ppm.Get_height();
double a = 1.5;
int Width = width * a, Height = height * a;
PPM ppm2(Width, Height);
auto LI = [&](double x, double Il, double Ir)
{
return (Ir - Il) * (x - (int)x) + Il;
};
for(int J=0; J<Height; J++)
for (int I = 0; I < Width; I++)
{
double x = I / a;
double y = J / a;
int i = x, j = y;
double dx = x - i, dy = y - j;
if (i + 1 < width && j + 1 < height)
{
double Ir = LI(y, ppm(i + 1, j, 'r'), ppm(i + 1, j + 1, 'r'));
double Il = LI(y, ppm(i, j, 'r'), ppm(i, j + 1, 'r'));
ppm2(I, J, 'r') = LI(x, Il, Ir);
}
else ppm2(I, J, 'r') = ppm(i, j, 'r');
if (i + 1 < width && j + 1 < height)
{
double Ir = LI(y, ppm(i + 1, j, 'g'), ppm(i + 1, j + 1, 'g'));
double Il = LI(y, ppm(i, j, 'g'), ppm(i, j + 1, 'g'));
ppm2(I, J, 'g') = LI(x, Il, Ir);
}
else ppm2(I, J, 'g') = ppm(i, j, 'g');
if (i + 1 < width && j + 1 < height)
{
double Ir = LI(y, ppm(i + 1, j, 'b'), ppm(i + 1, j + 1, 'b'));
double Il = LI(y, ppm(i, j, 'b'), ppm(i, j + 1, 'b'));
ppm2(I, J, 'b') = LI(x, Il, Ir);
}
else ppm2(I, J, 'b') = ppm(i, j, 'b');
}
ppm2.Flush("out.ppm");
return 0;
}
끝이 처리가 좋은 가감입니다만, 괜찮습니다.
Reference
이 문제에 관하여(【이미지 처리 100개 노크에 도전】Q.26. Bi-linear 보간), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jajagacchi/items/f179e681071943fd3096
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Bi-linear 보간으로 이미지를 1.5배로 확대해라.
바이리니어 보간은 때때로 사용하고 있습니다만, 식의 도출은 한 적이 없었기 때문에 이 기회에 생각해 보겠습니다.
첫째, 간단을 위해 1 차원으로 생각합니다.
위의 그림에서 $x=i$ 위치의 함수값 $I(i)$ 및 $x=i+1$ 위치의 함수값 $I(i+1)$를 알고 있습니다. 이 사이의 위치 $ x $에서 함수 값을 추정하는 것이 목적입니다. 추정량은 $x$의 함수가 되는 것입니다. $x=i,i+1$의 값을 구속조건으로 하는 것만으로는 조건을 만족하는 함수는 얼마든지 존재하는 것입니다만, 가장 간단한 것은 1차 함수입니다. 1차 함수에 한정하면, 구속 조건을 만족하는 함수는
I(x) = \{I(i+1)-I(i)\}(x-i) + I(i)
밖에 없습니다. 2차원으로 생각합니다.
위 그림의 직선 A에서 선형 보간을 생각하면
I(y;x=i) = \{I(i,j+1)-I(i,j)\}(y-j) + I(i,j)
됩니다. 마찬가지로 직선 B에서
I(y;x=i+1) = \{I(i+1,j+1)-I(i+1,j)\}(y-j) + I(i+1,j)
됩니다. 점선의 왼쪽 점을 $I(y;x=i)$ 로, 오른쪽 점을 $I(y;x=i+1)$ 로 합니다. 이 두 점 사이의 점 $(x,y)$ 의 값은 이러한 선형 보간으로 합니다.
I(x,y) = \{I(y;x=i+1)-I(y;x=i)\}(x-i) + I(y;x=i)
이것에 구체적인 식을 넣어 주면 바이 리니어 보간의 식이됩니다. 100개 노크의 문제문에 한하지 않고, 거리로 가중치 한다는 설명이 많습니다만, 여기서 말하는 거리는 2차원 유클리드 거리가 아닌 것에 주의가 필요합니다.
int main()
{
PPM ppm("imori.pnm");
int width = ppm.Get_width();
int height = ppm.Get_height();
double a = 1.5;
int Width = width * a, Height = height * a;
PPM ppm2(Width, Height);
auto LI = [&](double x, double Il, double Ir)
{
return (Ir - Il) * (x - (int)x) + Il;
};
for(int J=0; J<Height; J++)
for (int I = 0; I < Width; I++)
{
double x = I / a;
double y = J / a;
int i = x, j = y;
double dx = x - i, dy = y - j;
if (i + 1 < width && j + 1 < height)
{
double Ir = LI(y, ppm(i + 1, j, 'r'), ppm(i + 1, j + 1, 'r'));
double Il = LI(y, ppm(i, j, 'r'), ppm(i, j + 1, 'r'));
ppm2(I, J, 'r') = LI(x, Il, Ir);
}
else ppm2(I, J, 'r') = ppm(i, j, 'r');
if (i + 1 < width && j + 1 < height)
{
double Ir = LI(y, ppm(i + 1, j, 'g'), ppm(i + 1, j + 1, 'g'));
double Il = LI(y, ppm(i, j, 'g'), ppm(i, j + 1, 'g'));
ppm2(I, J, 'g') = LI(x, Il, Ir);
}
else ppm2(I, J, 'g') = ppm(i, j, 'g');
if (i + 1 < width && j + 1 < height)
{
double Ir = LI(y, ppm(i + 1, j, 'b'), ppm(i + 1, j + 1, 'b'));
double Il = LI(y, ppm(i, j, 'b'), ppm(i, j + 1, 'b'));
ppm2(I, J, 'b') = LI(x, Il, Ir);
}
else ppm2(I, J, 'b') = ppm(i, j, 'b');
}
ppm2.Flush("out.ppm");
return 0;
}
끝이 처리가 좋은 가감입니다만, 괜찮습니다.
Reference
이 문제에 관하여(【이미지 처리 100개 노크에 도전】Q.26. Bi-linear 보간), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jajagacchi/items/f179e681071943fd3096텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)