我目前在想出重新缩放和图像的算法时遇到问题。 我目前想要同时实现双线性插值和最近邻。我了解它们在概念上是如何工作的,但是,我似乎无法将其记录到代码中。我仍然被困在最近的邻居上 我在下面为它写了一些伪代码(根据我所知道的(:
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]
我的原始数据集(我获得数据量的地方(存储在带有 [x][y][z] 和 (x, y, z( 的 3D 数组中。我单独读取每个像素,并可以使用Java中的Color.color计算每个像素的颜色。但是,我需要知道如何为每个像素位置 x 和 y (x,y( 获取颜色 (c = [0,1,2](,不包括 z(对于一个视图(,以将每个新像素的 1 个旧像素转换为包含新宽度和高度的新数据集。我已经用Java编写了上面翻译的大部分代码。但我仍然无法理解如何完成工作实现。
提前😊致谢
我对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 循环来考虑通道。
如果我做对了,在这种情况下,您正在插值体积(体素(而不是像素: 让我们有源卷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
则可以vol1
分辨率执行for
循环,并从x1,y1,z1
计算x0,y0,z0
以加快速度。顺便说一句,所有变量都是整数,不需要浮点数...
现在对于颜色编码,以防您的体素是一维数组 ({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];