Python |
您所在的位置:网站首页 › 易建联年薪nba › Python |
基本图像处理
缩放scale旋转rotate裁剪crop填充pad平移translate翻转flip 图像的仿射变换Affine transformation
基本图像处理
1. 缩放scale
缩放通过cv2.resize()实现 函数说明: cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst参数说明: src - 原图 dst - 目标图像。当参数dsize不为0时,dst的大小为size;否则,它的大小需要根据src的大小,参数fx和fy决定。dst的类型(type)和src图像相同 dsize - 目标图像大小。当dsize为0时,它可以通过以下公式计算得出: 所以,参数dsize和参数(fx, fy)不能够同时为0 fx - 水平轴上的比例因子。当它为0时,计算公式如下: fy - 垂直轴上的比例因子。当它为0时,计算公式如下: interpolation - 插值方法。共有5种: INTER_NEAREST - 最近邻插值法 INTER_LINEAR - 双线性插值法(默认) INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取也叫缩小图像(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。 INTER_CUBIC - 基于4x4像素邻域的3次插值法 INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值 缩小图像 用INTER_AREA更好,放大图像用 INTER_CUBIC更好; 代码示范: import cv2 # 读取一张照片 img = cv2.imread('tiger_tibet_village.jpg') # 缩放成200x200的图像 img_200x200 = cv2.resize(img, (200, 200)) # 不直接指定缩放后大小,通过fx和fy指定缩放比例,0.5则长宽都为原来一半 # 等效于img_200x300 = cv2.resize(img, (300, 200)),注意指定大小的格式是(宽度,高度) # 插值方法默认是cv2.INTER_LINEAR,这里指定为最近邻插值 img_200x300 = cv2.resize(img, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST) cv2.imwrite('resized_200x200.jpg', img_200x200) cv2.imwrite('resized_200x300.jpg', img_200x300) 2. 旋转rotateopencv中对图像的旋转主要是先通过getRotationMatrix2D函数得到图像的旋转矩阵,然后再通过仿射变换函数warpAffine得到旋转后的图像。 函数说明: cv2.getRotationMatrix2D(center, angle, scale) cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst参数说明: getRotationMatrix2D: center–表示旋转的中心点angle–表示旋转的角度degreesscale–图像缩放因子warpAffine: src – 输入的图像M – 2 X 3 的变换矩阵.dsize – 输出的图像的size大小dst – 输出的图像flags – 输出图像的插值方法borderMode – 图像边界的处理方式borderValue – 当图像边界处理方式为BORDER_CONSTANT 时的填充值代码示范: img = cv2.imread('messi5.jpg',0) rows,cols = img.shape #90度旋转 M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1) dst = cv2.warpAffine(img,M,(cols,rows))图示: 裁剪是利用array自身的下标截取实现 代码示范: img = cv2.imread('rotation.jpg') print img.shape #裁剪 crop_img = img[20:100, 20:160] cv2.imwrite('crop_img.jpg', crop_img)图示: 原图: 裁剪后图像: 填充通过函数copyMakeBorder实现: 函数说明: cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, dst[, value]]) → dst参数说明: src – 输入的图像 dst – 输出的图像 top,bottom,left,right – 分别表示在原图四周扩充边缘的像素值 borderType –图像边界的处理方式 常见的borderType: BORDER_REPLICATE :复制法,复制最边缘像素BORDER_REFLECT_101:对称法,以最边缘像素为轴,对称BORDER_CONSTANT:常量法,以一个常量参数值(自定参数value给定)填充扩充的边界value – 当图像边界处理方式为BORDER_CONSTANT 时的填充值 代码示范: # 在上张图片的基础上,上下各填充50像素,填充值为128,生成新的的图像 pad_img = cv2.copyMakeBorder(crop_img, 50, 50, 0, 0, cv2.BORDER_CONSTANT, value=(128, 128, 128)) cv2.imwrite('pad_img.jpg', pad_img)图示: 原图: 填充后图像: 平移通过自定义平移矩阵以及函数warpAffine实现: 代码示范: img = cv2.imread('messi5.jpg',0) rows,cols = img.shape # 平移矩阵M:[[1,0,x],[0,1,y]] M = np.float32([[1,0,100],[0,1,50]]) dst = cv2.warpAffine(img,M,(cols,rows))图示: 翻转通过函数flip实现: 函数说明: cv2.flip(src, flipCode[, dst]) → dst参数说明: src – 输入的图像dst – 输出的图像flipCode – 翻转模式,flipCode==0垂直翻转(沿X轴翻转),flipCode>0水平翻转(沿Y轴翻转),flipCode |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |