最近邻插值
通过一种计算方法,比对原来图像的位置信息,以最近位置的数据进行填充。
缺点:有时候图像会失真,用该方法作放大处理时,在图象中可能出现明显的块状效应。
双线性插值
公式
y
=
y
0
+
(
x
−
x
0
)
y
1
−
y
0
x
1
−
x
0
=
y
0
+
(
x
−
x
0
)
y
1
−
(
x
−
x
0
)
y
0
x
1
−
x
0
y=y_{0}+\left(x-x_{0}\right) \frac{y_{1}-y_{0}}{x_{1}-x_{0}}=y_{0}+\frac{\left(x-x_{0}\right) y_{1}-\left(x-x_{0}\right) y_{0}}{x_{1}-x_{0}}
y=y0+(x−x0)x1−x0y1−y0=y0+x1−x0(x−x0)y1−(x−x0)y0
通过计算相应位置上的均值进行填充
映射
可以将几何运算想象成一次一个象素地转移到输出图象中。如果一个输入象素被映射到四个输出象素之间的位置,则其灰度值就按插值算法在4个输出象素之间进行分配。
优点:旋转、拉伸、放缩可以使用,解决了漏点的问题。
缺点:出现了马赛克。
练习代码
import cv2
if __name__ == "__main__":
img=cv2.imread('D://2233.jpg',cv2.IMREAD_UNCHANGED)
print('Original Dimensions:',img.shape)
Scale_persent=30
width=int(img.shape[1]*Scale_persent/100)
height=int(img.shape[0]*Scale_persent/100)
dim=(width,height)
resized=cv2.resize(img,dim,interpolation=cv2.INTER_LINEAR)
fx=1.5
fy=1.5
resized1=cv2.resize(resized,dsize=None,fx=fx,fy=fy,interpolation=cv2.INTER_NEAREST)
resized2=cv2.resize(resized,dsize=None,fx=fx,fy=fy,interpolation=cv2.INTER_LINEAR)
print(resized.shape)
cv2.imshow("Resized image", resized)
cv2.imshow("INTER_NEAREST image", resized1)
cv2.imshow("INTER_LINEAR image", resized2)
cv2.waitKey(0)
cv2.destroyAllWindows()
出现的问题及解决方式
问题:
line 4, in <module>
print('Original Dimensions:',img.shape)
AttributeError: 'NoneType' object has no attribute 'shape'
解决方式:最开始时使用了中文目录,从而使图片无法导入,进而出现问题。