图像缩放用于对图像进行缩小或扩大,当图像缩小时需要对输入图像重采样去掉部分像素,当图像扩大时需要在输入图像中根据算法生成部分像素,二者都会利用插值算法来实现。
OpenCV支持的插值算法包括如下表格中的前6种,后面几种不是插值算法,而是补充的标记:
相关插值算法比较(参考《OpenCV图像缩放resize各种插值方式的比较》):
关于具体算法的介绍请参考以下资料:
图像缩放使用函数resize,可以将图像按照指定大小或缩放因子进行缩放。
dst = resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
经测试验证:
下面的案例是读取两张大小不同的图像,相互参照以各种插值方法进行缩放,并比较哪种插值方法和不带插值实参的结果一致:
import cv2
import numpy as np
from opencvPublic import preparePreviewImg,previewImgList,readImgFile,cmpMatrix
def main(largeImg,smallImg):
interMethod = [cv2.INTER_NEAREST,cv2.INTER_LINEAR,cv2.INTER_CUBIC,cv2.INTER_AREA,cv2.INTER_LANCZOS4,cv2.INTER_LINEAR_EXACT]
interMethodInf = ['INTER_NEAREST', 'INTER_LINEAR', 'INTER_CUBIC', 'INTER_AREA', 'INTER_LANCZOS4','INTER_LINEAR_EXACT']
information = "老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号"
largeImg = readImgFile(largeImg, False) #自定义读入图片文件的函数,具体功能请参考:https://blog.csdn.net/LaoYuanPython/article/details/111351901
smallImg = readImgFile(smallImg, False)
preparePreviewImg('largeImg',largeImg)
preparePreviewImg('smallImg', smallImg)
imgNoInterMethod = cv2.resize(smallImg,largeImg.shape[0:2])
preparePreviewImg('未指定放大算法' , imgNoInterMethod)
for mi in zip(interMethod,interMethodInf):
m,i = mi
imgM = cv2.resize(smallImg,largeImg.shape[0:2],fx=0.8,fy=0.8,interpolation=m)
preparePreviewImg('放大算法:'+i, imgM)
if cmpMatrix(imgNoInterMethod,imgM):
print(f"图像放大时未指定插值算法的结果与插值算法为{i}的结果相同")
previewImgList()
imgNoInterMethod = cv2.resize(largeImg, smallImg.shape[0:2])
preparePreviewImg('未指定放大算法', imgNoInterMethod)
for mi in zip(interMethod, interMethodInf):
m, i = mi
imgM = cv2.resize(largeImg, smallImg.shape[0:2], interpolation=m )
preparePreviewImg('缩小算法:' + i, imgM)
if cmpMatrix(imgNoInterMethod,imgM):
print(f"图像缩小时未指定插值算法的结果与插值算法为{i}的结果相同")
print(f"\n更多学习资料请参考:\n {information}")
previewImgList()
cv2.waitKey(0)
main(r'f:\pic\咖啡狗.jpg',r'f:\pic\咖啡狗小图.JPG')
上述代码中从opencvPublic 导入的preparePreviewImg、previewImgList、readImgFile、cmpMatrix相关函数功能请参考《https://blog.csdn.net/LaoYuanPython/article/details/111351901 OpenCV-Python图形图像处理:自用的一些工具函数功能及调用语法介绍》的说明。
图像放大时未指定插值算法的结果与插值算法为INTER_LINEAR的结果相同
图像缩小时未指定插值算法的结果与插值算法为INTER_LINEAR的结果相同
更多学习资料请参考:
老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号
由于预览图像高度太大被缩小了,放大一点看输入的两张图像,小的在右上角很小的地方:
下面是未指定放大算法的结果预览图:
其他的图像效果差异不是很大,就不展示了。
本节简单介绍了与图像缩放相关的插值算法、并详细介绍OpenCV图像缩放的函数resize相关的语法、参数以及应用案例。不同的插值算法对资源的开销不同,最终效果也会不一致,大家进行图像缩放时,如无特殊要求,插值算法使用默认值即可。
更多OpenCV-Python的介绍请参考专栏《OpenCV-Python图形图像处理》相关文章。
老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏都适合有一定Python基础但无相关知识的小白读者学习。
付费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。