CImg 立方子像素位置

Posted

技术标签:

【中文标题】CImg 立方子像素位置【英文标题】:CImg cubic subpixel location 【发布时间】:2015-05-12 15:26:03 【问题描述】:

我试图了解代码在做什么,它使用C++ Image Processing Toolkit 的 CImg.h 文件从图像中提取值。

函数使用如下语句:

float dx(float x, float y, CImg<float> &i) 
    float val = i.cubic_atXY(x + 0.5, y);
    return val;

我认为它试图在坐标 (x+0.5,y) 上找到三次插值子像素。我发现这个函数是在CImg.h文件的第12450行附近定义的,但我真的不知道如何将它翻译成python等其他代码。

使用这种库的人能看懂吗?

【问题讨论】:

【参考方案1】:

cubic_atXY 是一些看起来乏味的代码,但它基本上都是简单的算术运算,在其他编程语言中应该具有类似的语法。唯一不通用的行是这样的,例如:

const Tfloat Ipp = (Tfloat)atXY(px,py,z,c,out_value)

这是一种 C 风格的演员表。它将对atXY() 的调用结果转换为Tfloat。顺便说一下,这看起来像双三次插值。

【讨论】:

这是一个双三次插值,您可以在另一个code 中看到。它进行双三次插值以查看该确切点的值。如我所见,Python 没有从网格中确定该点值的函数。 看看SciPy's Interpolation Functions,它可能有你需要的东西。【参考方案2】:

atXY() 调用是检查用于进行双三次插值的点是否在帧限制内。 卡尔顿所说的功能,我确认,它是一个双三次插值,用于提取图像内任何位置的子像素的值。 我试图将代码翻译成python,最后我执行了以下代码,给出了与CImg.h函数相同的结果。

*考虑到我使用逻辑运算符直接实现atXY() 函数,并且索引 (x,y) 更改为 (y,x),因为 python 使用 (idRow,idCol) 作为矩阵索引

def bicubic(fx, fy, img):

   img = img.astype(float)
   h,w = np.shape(img)

   if(fx < 0 or fx > w-1 or fy < 0 or fy > h-1):
       val = 0
       return val

   x = int(fx)
   y = int(fy)

   dx = fx - x
   dy = fy - y

   px = 0 if x-1<0 else x-1
   py = 0 if y-1<0 else y-1

   nx = x+1 if dx>0 else x
   ny = y+1 if dy>0 else y

   ax = w-1 if x+2>=w else x+2
   ay = h-1 if y+2>=h else y+2

   Ipp = img[py,px]; Icp = img[py,x]; Inp = img[py,nx]; Iap = img[py,ax];
   Ip = Icp + 0.5*(dx*(-Ipp+Inp) + dx*dx*(2*Ipp-5*Icp+4*Inp-Iap) + dx*dx*dx*(-Ipp+3*Icp-3*Inp+Iap))
   Ipc = img[y,px]; Icc = img[y,x]; Inc = img[y,nx]; Iac = img[y,ax];
   Ic = Icc + 0.5*(dx*(-Ipc+Inc) + dx*dx*(2*Ipc-5*Icc+4*Inc-Iac) + dx*dx*dx*(-Ipc+3*Icc-3*Inc+Iac))
   Ipn = img[ny,px]; Icn = img[ny,x]; Inn = img[ny,nx]; Ian = img[ny,ax];
   In = Icn + 0.5*(dx*(-Ipn+Inn) + dx*dx*(2*Ipn-5*Icn+4*Inn-Ian) + dx*dx*dx*(-Ipn+3*Icn-3*Inn+Ian))
   Ipa = img[ay,px]; Ica = img[ay,x]; Ina = img[ay,nx]; Iaa = img[ay,ax];
   Ia = Ica + 0.5*(dx*(-Ipa+Ina) + dx*dx*(2*Ipa-5*Ica+4*Ina-Iaa) + dx*dx*dx*(-Ipa+3*Ica-3*Ina+Iaa))

   val = Ic + 0.5*(dy*(-Ip+In) + dy*dy*(2*Ip-5*Ic+4*In-Ia) + dy*dy*dy*(-Ip+3*Ic-3*In+Ia))
   return val

【讨论】:

以上是关于CImg 立方子像素位置的主要内容,如果未能解决你的问题,请参考以下文章

使用 CImg 编辑 RGB 像素数据 - Visual C++ 2008

CImg基本像素操作

使用CImg将图像文件转换为像素矢量?

CUDA:每个线程计算的最佳像素数(灰度)

遍历画布像素并找到每个白色像素的 x、y、位置

Silverlight 图形像素侧位置?