2011-08-18 2 views
0

Bicubic Interpoloation을 사용하여 이미지를 업 샘플링하려고합니다. opencv의 cvResize() 함수와 일치하는 정확한 값이 필요하지만 다음 코드의 결과와 일치하지 않습니다. cvResize()의 결과, 버그를 수정하고 해결할 수 있습니까? 다음 cpp에서 잘못된 점 이미지 크기 조정을위한 부 큐빅 보간 코드

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

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;

}

답변

0

변경 :

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

변경 :

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

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

에 :

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

편집 또한 변경 :

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

에 :

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

코드의 그 라인을 변경하지만 당신은 아마 코드에 더 많은 버그를 가지고 – pradeepa

+0

:-(차이가 없지만, 적어도이 두 가지 버그가 수정된다. 또한 내가했습니다 두 개 더 버그 수정을 참조하십시오 –

1

당신은 결과가 어떻게 다른 말했다하지 않았습니다. 그것들이 매우 가깝다면, 각 RGB 채널에서 1 또는 2 이내로 말하면, 이것은 라운드 오프 차이로 간단하게 설명 될 수 있습니다.

바이 큐빅 보간을위한 알고리즘이 두 개 이상 있습니다. 돈 미첼과 아룬 네트 라 발리는 분석을했고, 그들 중 다수를 설명하는 하나의 공식으로 내놓았다 : 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

이미지 데이터는 단일 채널 그레이 스케일 데이터이며 각 값을 255로 나눈 값입니다. 값이 opencv와 일치 할 때까지 그리고 크기 변경 후 cvResize 값은 0.289782 0.291181 0.294753 0.302059 ...와 같으며 위 함수의 결과는 0.292048 0.294635 0.298366 0.302356 ...입니다. 제 요구 사항은 opencv를 사용하지 않고 SIFT 알고리즘을 구현하는 것입니다. 따라서이 작은 변화는 알고리즘의 후기 단계에 영향을 미치게됩니다. – pradeepa

+0

OpenCV와 다른 방식으로 가장자리를 처리 할 수 ​​있습니다 - try che 이미지 테두리 안에없는 값들을 cking하는 것. –

관련 문제