Python:获得了一个带有意外网格线的输出图像
我正在编写一个函数,将输入图像缩放为 它的输入大小。函数Resize(Mat I,float s)首先填充和Mat的 包含查询点坐标的。然后,我通过以下公式计算查询值: 使用双线性插值 输出图像似乎没有问题,只是上面有一个意外的#形网格。你能为决议提供一些提示吗 输出图像:Python:获得了一个带有意外网格线的输出图像,python,opencv,image-processing,Python,Opencv,Image Processing,我正在编写一个函数,将输入图像缩放为 它的输入大小。函数Resize(Mat I,float s)首先填充和Mat的 包含查询点坐标的。然后,我通过以下公式计算查询值: 使用双线性插值 输出图像似乎没有问题,只是上面有一个意外的#形网格。你能为决议提供一些提示吗 输出图像: 代码: 您将得到一个黑色像素,x是一个整数,y是一个整数 请看下面的代码: x1 = math.floor(x) x2 = math.ceil(x) vq1= (x-x1)*I[y1,x2] + (x2-x)*I[y1,x
代码:
您将得到一个黑色像素,
x
是一个整数,y
是一个整数
请看下面的代码:
x1 = math.floor(x)
x2 = math.ceil(x)
vq1= (x-x1)*I[y1,x2] + (x2-x)*I[y1,x1]
vq2= (x-x1)*I[y2,x2] + (x2-x)*I[y2,x1]
# calc interval between output points
interval = (orig_x-1) / (tar_x-1)
# Setting the query points
for i in range(0, tar_y):
for j in range(0, tar_x):
#set X[i, j] and Y[i,j]
X[i][j] = j * interval
假设:x=85.0
x1=地板(x)
=85
x2=ceil(x)
=85
(x-x1)
=(85-85)
=0
(x2-x)
=(85-85)
=0
vq1=(x-x1)*I[y1,x2]+(x2-x)*I[y1,x1]
=0*I[y1,x2]+0*I[y1,x1]
=0
vq2=(x-x1)*I[y2,x2]+(x2-x)*I[y2,x1]
=0*I[y2,x2]+0*I[y2,x1]
=0
输出[i,j]=(y-y1)*vq2+(y2-y)*vq1
=(y-y1)*0+(y2-y)*0
=0
结果:在整个列中,
x=85.0
输出[i,j]的值为零(我们得到一个黑色列)
同样的结果应用于y=85.0
——我们得到了一个黑行
x
值何时为整数
请看下面的代码:
x1 = math.floor(x)
x2 = math.ceil(x)
vq1= (x-x1)*I[y1,x2] + (x2-x)*I[y1,x1]
vq2= (x-x1)*I[y2,x2] + (x2-x)*I[y2,x1]
# calc interval between output points
interval = (orig_x-1) / (tar_x-1)
# Setting the query points
for i in range(0, tar_y):
for j in range(0, tar_x):
#set X[i, j] and Y[i,j]
X[i][j] = j * interval
interval=(orig_x-1)/(tar_x-1)=255/639
=(3*5*17/(3*3*71)
=85/213
j*interval
=j*85/213
每次
j
是213
的倍数,j*interval
是一个整数(我们得到一个黑色列)。当
j=0
,j=213
,j=426
,j=639
时会发生这种情况,因此有两个黑色列(在边距旁边)。还有两个可见的黑色行(在边距旁边)
建议的解决方案:
将
x2=math.ceil(x)
替换为x2=min(x1+1,原点x-1)
将
y2=math.ceil(y)
替换为y2=min(y1+1,原y-1)
修正回路:
for i in range(0, tar_y):
for j in range(0, tar_x):
#set output[i,j] using X[i, j] and Y[i,j]
x = X[i][j]
y = Y[i][j]
x1 = math.floor(x)
x2 = min(x1 + 1, orig_x-1)
y1 = math.floor(y)
y2 = min(y1 + 1, orig_y-1)
vq1= (x-x1)*I[y1,x2] + (x2-x)*I[y1,x1]
vq2= (x-x1)*I[y2,x2] + (x2-x)*I[y2,x1]
output[i,j] = (y-y1)*vq2 + (y2-y)*vq1
结果:
既然所有编写的图像库都有一个可工作的插值调整函数,为什么您要自己编写呢?@TimRoberts不管OP为什么自己编写这个函数。这可能是出于教育目的或其他任何正当理由。OP有一个限定范围的问题,需要定义答案。不幸的是,OP没有提供答案d原始图像,这将使调试代码更容易一些。我怀疑
floor
和ceil
函数。可能它们正在截断某些像素的坐标,或者可能您的采样间隔有问题。OP,按步骤逐像素调试,应该可以让您清楚地了解问题。无法comp您可能没有注意到他已经在导入opencv、numpy和matplotlib了。默认情况下,output=cv.resize(I,640,480)
执行双线性插值。