OpenCV—图像插值算法
一、插值算法原理介绍
- 最近邻插值算法
这是图像插值里面最简单的一种插值算法,在目标图像中待求的像素点由距离其最近的邻像素灰度确定。
f(i+m,j+n)表示待求像素点灰度,其中i,j为正整数,m,n为(0,1)之间的数。如果f(i+m,j+n)离左上角更近,那么其灰度值就为(i,j)
这种方法计算量小,但是效果不佳,很容易导致图像灰度的不连续。 - 双线性插值算法
双线性插值,类比于线性插值y=ax+b,双线性就可以理解为两个变量的插值函数的线性插值,本质上是做两个方向的线性插值。如下图。
为了能够求出P点的灰度值,需要先求出R1和R2的值,在通过R1和R2求得P点,已知函数 f = P 在 Q11 = (x1, y1)、Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四个点的值。首先,在x方向做一次线性插值,得到两个表达式:
在 y 方向进行线性插值,得到
,
都为权值,衡量P点离谁更近,则表示其权重越大。
二、OpenCV使用插值算法
- opencv调用API实现图片放缩
import cv2
def opencvInterpolation():
img = cv2.imread('./koala.jpg')
# 图片缩小一半
width = int(img.shape[1]*50/100)
height = int(img.shape[0]*50/100)
whsize = (width , height)
minSize = cv2.resize(img, whsize,cv2.INTER_AREA)
cv2.imshow("img:", img)
cv2.imshow("minsize:",minSize)
cv2.waitKey(0)
cv2.destroyAllWindows()
fx = 1.5
fy = 1.5
resized1 = cv2.resize(minSize, dsize=None, fx=fx, fy=fy, interpolation=cv2.INTER_NEAREST)
resized2 = cv2.resize(minSize, dsize=None, fx=fx, fy=fy, interpolation=cv2.INTER_LINEAR)
print('Resized Dimensions : ', minSize.shape)
cv2.imshow("Resized image", minSize)
cv2.imshow("INTER_NEAREST image", resized1)
cv2.imshow("INTER_LINEAR image", resized2)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
opencvInterpolation()
参考:https://www.cnblogs.com/yibeimingyue/p/11485732.html