import cv2
import numpy as np
IMG_PATH ="./picaqu.jpg"
NUM2 =2048
NUM1 =int(NUM2 *283/500)deffunction(img):
height, width, channels = img.shape
emptyImage = np.zeros((NUM1, NUM2, channels), np.uint8)
value =[0,0,0]
sh = NUM1 / height
sw = NUM2 / width
for i inrange(NUM1):for j inrange(NUM2):
x = i / sh
y = j / sw
p =(i +0.0)/ sh - x
q =(j +0.0)/ sw - y
x =int(x)-1
y =int(y)-1for k inrange(3):if x +1< NUM1 and y +1< NUM2:
value[k]=int(
img[x, y][k]*(1- p)*(1- q)+ img[x, y +1][k]* q *(1- p)+ img[x +1, y][k]*(1- q)* p + img[x +1, y +1][k]* p * q)
emptyImage[i, j]=(value[0], value[1], value[2])return emptyImage
img = cv2.imread(IMG_PATH)
zoom = function(img)
cv2.imwrite("./Bilinear Interpolation.jpg", zoom)# cv2.waitKey(0)print('完成')
(2)結果
五、雙立方插值
將圖像由500x283增大爲2048x1160
(1)代碼
import cv2
import numpy as np
IMG_PATH ="./picaqu.jpg"
NUM2 =2048
NUM1 =int(NUM2 *283/500)defS(x):
x = np.abs(x)if0<= x <1:return1-2* x * x + x * x * x
if1<= x <2:return4-8* x +5* x * x - x * x * x
else:return0deffunction(img, m, n):
height, width, channels = img.shape
emptyImage = np.zeros((m, n, channels), np.uint8)
sh = m / height
sw = n / width
for i inrange(m):for j inrange(n):
x = i / sh
y = j / sw
p =(i +0.0)/ sh - x
q =(j +0.0)/ sw - y
x =int(x)-2
y =int(y)-2
A = np.array([[S(1+ p), S(p), S(1- p), S(2- p)]])if x >= m -3:
m -1if y >= n -3:
n -1if x >=1and x <=(m -3)and y >=1and y <=(n -3):
B = np.array([[img[x -1, y -1], img[x -1, y],
img[x -1, y +1],
img[x -1, y +1]],[img[x, y -1], img[x, y],
img[x, y +1], img[x, y +2]],[img[x +1, y -1], img[x +1, y],
img[x +1, y +1], img[x +1, y +2]],[img[x +2, y -1], img[x +2, y],
img[x +2, y +1], img[x +2, y +1]],])
C = np.array([[S(1+ q)],[S(q)],[S(1- q)],[S(2- q)]])
blue = np.dot(np.dot(A, B[:,:,0]), C)[0,0]
green = np.dot(np.dot(A, B[:,:,1]), C)[0,0]
red = np.dot(np.dot(A, B[:,:,2]), C)[0,0]# ajust the value to be in [0,255]defadjust(value):if value >255:
value =255elif value <0:
value =0return value
blue = adjust(blue)
green = adjust(green)
red = adjust(red)
emptyImage[i, j]= np.array([blue, green, red], dtype=np.uint8)return emptyImage
img = cv2.imread(IMG_PATH)
zoom = function(img, NUM1, NUM2)
cv2.imwrite("./cubic.jpg", zoom)print('完成')