opencv resize
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | # -*- coding: utf-8 -*- ''' 今天来看看opencv中的resize方法。 就打个tag: opencv resize 先看看官方定义 void cv::resize ( InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR ) Python: dst = cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]] ) 各个参数可以参考c++版本的数据类型,注意c++和python两者参数顺序有不同。简单解释如下: 参数 类型 是否必须指定 具体含义 src numpy.ndarray 是 原图像 dsize tuple<int> 是 缩放后的图像大小 dst 无所谓 否 目标图像,但是在 Python 里面没有任何意义。一般不传参或者设成 None fx, fy 数值类型 否 x 和 y 方向上的缩放比例 interpolation int 否 插值方式表示代码,本质是一个 int 数值,一般用 OpenCV 内置的参数代号以提高可读性。 具体可以参考官方的这个解释: enum cv::InterpolationFlags { cv::INTER_NEAREST = 0, cv::INTER_LINEAR = 1, cv::INTER_CUBIC = 2, cv::INTER_AREA = 3, cv::INTER_LANCZOS4 = 4, cv::INTER_LINEAR_EXACT = 5, cv::INTER_NEAREST_EXACT = 6, cv::INTER_MAX = 7, cv::WARP_FILL_OUTLIERS = 8, cv::WARP_INVERSE_MAP = 16 } 因此在使用时,可以写代号也可以写出来方法名字。 使用方法从参数来看,可以设置resize后图像的大小,也可以通过设置方法比例进行resize。 从参数列别可以看到,参数src, dsize是必须有的参数,后面的参数都是可选,或者是有默认值的参数。因此,就是你指定了fx,fy,也必须 同时给dsize赋值(可以为None),否则会报错。但是当你指定dsize的大小了,可以不用管fx,fy. 此处要特别注意,从参数顺序就能看到,此处显示x方向再是y方向的,也就是说先是宽度,再是高度。 此处主要还是要看官方的一个地方是参数的设置, To shrink an image, it will generally look best with INTER_AREA interpolation, whereas to enlarge an image, it will generally look best with c::INTER_CUBIC (slow) or INTER_LINEAR (faster but still looks OK). 这里的意思是,如果resize后,图像变小了,推荐插值算法用INTER_AREA,而如果resize后,图像大小变大了,推荐用INTER_LINEAR或者慢点 但是效果更好的方式INTER_CUBIC (slow)。因此,如果你确定大多数图像resize前后都是增大还是减小,那就可以相应选择对应的插值方法。 ''' ''' first, let me see the img shape. When you using img.shape, it is height, width, channel. Remember this. ''' import numpy as np import cv2 img = cv2.imread(r "messi.jpg" ) print ( 'origin image' ,img.shape) # (296, 474, 3) in height, width, channel cv2.imshow( "messi" , img) cv2.waitKey( 0 ) cv2.destroyAllWindows() rimg = cv2.resize(img,dsize = None ,fx = 2 ,fy = 2 ,interpolation = cv2.INTER_LINEAR) # 放大了两倍,此处dsize不可以省略,必须指定的参数 cv2.imshow( "resize messi" , rimg) cv2.waitKey( 0 ) cv2.destroyAllWindows() rwidth = img.shape[ 1 ] * 2 rheight = img.shape[ 0 ] * 2 # 放大了两倍,此处dsize必须是先width再height. rimg2 = cv2.resize(img,dsize = (rwidth, rheight),interpolation = cv2.INTER_LINEAR) cv2.imshow( "resize messi2" , rimg2) cv2.waitKey( 0 ) cv2.destroyAllWindows() # 当dsize和fx,fy不一致,而且两者又都是有效的,优先选择dsize作为参数,而忽略fx,fy。 rwidth = img.shape[ 1 ] * 3 rheight = img.shape[ 0 ] * 3 rimg3 = cv2.resize(img,dsize = (rwidth, rheight),fx = 1 ,fy = 1 ,interpolation = cv2.INTER_LINEAR) cv2.imshow( "resize messi3" , rimg3) print ( 'resize image3: ' ,rimg3.shape) # (888, 1422, 3) cv2.waitKey( 0 ) cv2.destroyAllWindows() # 当resize后,图像变小了,那么插入方式建议INTER_AREA。 rwidth = int (img.shape[ 1 ] * 0.5 ) rheight = int (img.shape[ 0 ] * 0.5 ) rimg4 = cv2.resize(img,dsize = (rwidth, rheight),fx = 1 ,fy = 1 ,interpolation = cv2.INTER_AREA) cv2.imshow( "resize messi4" , rimg4) print ( 'resize image4: ' ,rimg4.shape) # (148, 237, 3) cv2.waitKey( 0 ) cv2.destroyAllWindows() |
Sophie的世界,转载请注明出处,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2014-09-19 parameter server