图像大小调整双线性插值和最近邻

时间:2020-02-04 20:22:21

标签: java algorithm image-processing graphics

我目前在提出用于重新缩放和图像的算法时遇到问题。 我目前想同时实现双线性插值和最近邻。我了解它们在概念上是如何工作的,但是,我似乎无法将其记录到代码中。我仍然停留在最近的邻居 我已经在下面为它写了一些伪代码(基于我所知道的):

    Resizing Images: Nearest Neighbour
    Use a loop:for j=0 to Yb-1
    for i=0 to Xb-1
    for c=0 to 2
   (floor) y=j*Ya/Yb 
   (floor) x=i*Xa/Xb
    Ib[j][i][c] = Ia[y][x][c]

我的原始数据集(从中获取数据量)存储在3D数组中,其中[x] [y] [z]与(x,y,z)。我分别读取每个像素并可以计算出在Java中使用Color.color为每个像素设置颜色。但是,我需要知道如何获取每个像素位置x和y(x,y)的颜色(c = [0,1,2])(不包括z)(对于一个视图的颜色),以便为每个新像素转换1个旧像素像素到包含新宽度和高度的新数据集中。我已经用Java编写了上面翻译的大部分代码。但是我仍然不明白如何完成可行的实施。

预先感谢?

2 个答案:

答案 0 :(得分:1)

我对Java不是很熟悉。但是这是适用于python的代码。

import cv2
import numpy as np

img = cv2.imread("image.png")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

scaleX = 0.5
scaleY = 0.5

newImg = np.zeros((int(img.shape[0]*scaleX),int(img.shape[1]*scaleY))).astype(np.uint8)

for y in range(newImg.shape[0]):
    for x in range(newImg.shape[1]):
        samplex = x/scaleX
        sampley = y/scaleY
        dx = samplex - np.floor(samplex)
        dy = sampley - np.floor(sampley)

        val = img[int(sampley-dy),int(samplex-dx)]*(1-dx)*(1-dy)
        val += img[int(sampley + 1 - dy),int(samplex-dx)]*(1-dx)*(dy) 
        val += img[int(sampley-dy),int(samplex + 1 - dx)]*(dx)*(1-dy)
        val += img[int(sampley + 1 -dy),int(samplex + 1 - dx)]*(dx)*(dy)

        newImg[y,x] = val.astype(np.uint8)


cv2.imshow("img",newImg)
cv2.waitKey(0)

您可以在它们的for和x for循环中添加一个for循环,以解决频道问题。

答案 1 :(得分:1)

如果我做对了,在这种情况下,您将插入体积(体素)而不是像素: 假设源体积为vol1[xs1][ys1][zs1],目标体积为vol0[xs0][ys0][zs0],其中xs,ys,zs是分辨率,那么最近的邻居将是:

// vol0 <- vol1
for (              x0=0; x0<xs0; x0++)
 for (x1=(x*x1)/x0, y0=0; y0<ys0; y0++)
  for (y1=(y*y1)/y0, z0=0; z0<zs0; z0++)
   {    z1=(z*z1)/z0;
   vol0[x0][y0][z0]=vol1[x1][y1][z1];
   }

最近邻居的颜色保持不变。如果vol0的分辨率小于vol1,则可以以for的分辨率进行vol1循环,并从x0,y0,z0计算x1,y1,z1来加快速度。顺便说一句。所有变量都是整数,不需要浮点数...

如果您的体素是一维数组({r,g,b})而不是标量整数类型,则现在进行颜色编码:

vol0[xs0][ys0][zs0][3] 
vol1[xs1][ys1][zs1][3]

内容将更改为:

// vol0 <- vol1
for (              x0=0; x0<xs0; x0++)
 for (x1=(x*x1)/x0, y0=0; y0<ys0; y0++)
  for (y1=(y*y1)/y0, z0=0; z0<zs0; z0++)
   for (z1=(z*z1)/z0; i=0;  i<3;    i++ )
    vol0[x0][y0][z0][i]=vol1[x1][y1][z1][i];