Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:获得了一个带有意外网格线的输出图像_Python_Opencv_Image Processing - Fatal编程技术网

Python:获得了一个带有意外网格线的输出图像

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

我正在编写一个函数,将输入图像缩放为 它的输入大小。函数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,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)
执行双线性插值。