OpenCV图像插值算法
最近邻插值算法
最近邻插值是指将图像中的点对应到源图像中,找最相邻的整数点,作为插值后的输出。
一个例子:将一个33的图像放大为44的图像:
\begin{array}{c} f(0,0)=h(0,0) \ f(0,1)=h(0,0.75)=h(0,1) \ f(0,2)=h(0,1.50)=h(0,2) \ f(0,3)=h(0,2.25)=h(0,2) \ …\ \end{array}
其中的每一个点套用公式:srcX=dstX* (srcWidth/dstWidth) , srcY = dstY (srcHeight/dstHeight)
例如点(0,0):(0*(3/4),0*(3/4))=>(0x0.75,0x0.75)=>(0,0),其他点同理即可。
双线性插值
假如我们想得到未知函数f在点P= (x,y) 的值,假设我们已知函数f在Q11 = (x1,y1)、Q12 = (x1,y2),Q21 = (x2,y1) 以及Q22 = (x2,y2) 四个点的值。
首先在x方向进行线性插值,得到R1和R2;然后在y方向进行线性插值,得到P,这样就得到所要的结果f(x,y)。
假设四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就是:f(x,y)=f(0,0)(1-x)(1-y)+f(1,0)x(1-y)+f(0,1)(1-x)y+f(1,1)xy
基于OpenCV的实现
用python实现:
import cv2
if __name__ == "__main__":
img = cv2.imread('D:/image/111.jpg', cv2.IMREAD_UNCHANGED)
print('Original Dimensions : ', img.shape)
scale_percent = 30 # percent of original size
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)
# resize image
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 Dimensions : ', resized.shape)
cv2.imshow("Resized image", resized)
cv2.imshow("INTER_NEAREST image", resized1)
cv2.imshow("INTER_LINEAR image", resized2)
cv2.waitKey(0)
cv2.destroyAllWindows()