专业的编程技术博客社区

网站首页 > 博客文章 正文

Python-OpenCV 15. 图像插值与缩放

baijin 2024-10-02 11:16:32 博客文章 8 ℃ 0 评论

学习资源:《机器学习实践指南 案例应用解析 第2版》

一、概念

图像插值就是利用已知邻近像素点的灰度值(或rgb图像中的三色值)来产生未知像素点的灰度值,以便由原始图像再生出具有更高分辨率的图像。
传统插值算法

最临近插值

即将每一个原像素原封不动地复制映射到扩展后对应多个像素中。这种方法在放大图像的同时保留了所有的原图像的所有信息。在传统图像插值算法中,最临近像素插值较简单,容易实现,早期的时候应用比较普遍。但是,该方法会在新图像中产生明显的锯齿边缘和马赛克现象。缩放后的图像的像素值计算如下:
dst(x, y) = (x * src.width / dst.width, y * src.height / dst.height)

双线性插值

双线性插值法具有平滑功能,能有效地克服最临近像素插值的不足,但会退化图像的高频部分,使图像细节变模糊。

高阶插值

在放大倍数比较高时,高阶插值,如双三次插值和三次样条插值等比低阶插值效果好。

二、OpenCV resize函数

通过OpenCV的resize函数可实现插值与缩放。

void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );

参数说明:

  • src 输入,原图像
  • dst 输出,目标图像
  • dsize 输出图像的大小,如果这个参数不为0,表示把原图像缩放到Size(width, height)指定的大小;如果为0 , 原图像缩放之后的大小要通过下面公式计算:

dsize = Size(round(fx*src.cols),round(fy*src.rows))

fx width方向的缩放比例,如果为0,就是按照(double)dsize.width/src.cols来计算
fy height方向的缩放比例,如果为0,会按(double)dsize.height/src.rows来计算
interpolation 插值的方式,有:

  • INTERNEAREST 最邻近插值
  • INTER_LINEAR 双线性插值
  • INTER_AREA 像素关系重采样
  • INTER_CUBIC 4*4像素领域内的双立方插值
  • INTER_LANCZOS4 8*8像素邻域内的Lanczos插值

使用注意事项

  • dsize和fx/fy不能同时为0
  • 正常情况使用默认的双线性插值就够用了
  • 插值效率:最邻近插值>双线性插值>双立方插值>Lanczos插值,效率与效果成反比

示例代码

# -*- coding: utf-8 -*-
# !/usr/bin/python
import cv2

src = cv2.imread("test.jpg")
cv2.imshow("origin", src)

h, w = src.shape[:2]
print(h, w)
dst = cv2.resize(src, (w * 2, h * 2), fx=0.75, fy=0.75, interpolation=cv2.INTER_NEAREST)
cv2.imshow("INTER_NEAREST", dst)

dst = cv2.resize(src, (w * 2, h * 2), interpolation=cv2.INTER_LINEAR)
cv2.imshow("INTER_LINEAR", dst)

dst = cv2.resize(src, (w * 2, h * 2), interpolation=cv2.INTER_CUBIC)
cv2.imshow("INTER_CUBIC", dst)

dst = cv2.resize(src, (w * 2, h * 2), interpolation=cv2.INTER_LANCZOS4)
cv2.imshow("INTER_LANCZOS4", dst)

# 缩小 像素关系重采样
newimg2 = cv2.resize(src, (w // 2, h // 2), interpolation=cv2.INTER_AREA)
cv2.imshow("INTER_AREA", dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表