在仿射变换中,比如 resize
其实已经用到了插值 interpolation
。一个图片从 100×100 放大到 200*200 的时候,就会产生新的像素点(下图中的红色点),新的像素点值是多少,这就是插值要做的事情。
OpenCV
4.x 版本支持的插值算法有很多,如下图
这里仅列出常用的几种
- cv2.INTER_LINEAR:双线形插值法,默认值
- cv2.INTER_NEAREST:最近邻插值法,找到与之距离最相近的邻居(原来就存在的像素点),赋值与其相同
- cv2.INTER_AREA:区域插值法,基于局部像素的重采样。常用于图像抽取,如果是图像放大的话,效果和最近邻插值法差不多
- cv2.INTER_CUBIC:基于 4*4 像素邻域的3次插值法
- cv2.INTER_LANCZOS4:兰索斯插值法,由相邻的 8*8 像素计算得出,公式类似于双线性插值
示例
import cv2
image = cv2.imread('lenna.png')
cv2.imshow("original image", image)
h, w = image.shape[:2]
dst = cv2.resize(image, (w*2, h*2), fx=0.75, fy=0.75, interpolation=cv2.INTER_NEAREST)
cv2.imshow("INTER_NEAREST", dst)
dst = cv2.resize(image, (w*2, h*2), interpolation=cv2.INTER_LINEAR)
cv2.imshow("INTER_LINEAR", dst)
dst = cv2.resize(image, (w*2, h*2), interpolation=cv2.INTER_AREA)
cv2.imshow("INTER_AREA", dst)
dst = cv2.resize(image, (w*2, h*2), interpolation=cv2.INTER_CUBIC)
cv2.imshow("INTER_CUBIC", dst)
dst = cv2.resize(image, (w*2, h*2), interpolation=cv2.INTER_LANCZOS4)
cv2.imshow("INTER_LANCZOS4", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()