我目前在提出用于重新缩放和图像的算法时遇到问题。 我目前想同时实现双线性插值和最近邻。我了解它们在概念上是如何工作的,但是,我似乎无法将其记录到代码中。我仍然停留在最近的邻居 我已经在下面为它写了一些伪代码(基于我所知道的):
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编写了上面翻译的大部分代码。但是我仍然不明白如何完成可行的实施。
预先感谢?
答案 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];