- 前言
- 一、图片读写
- 二、调整大小和填充
- 三、滤波
- 四、边缘提取
- 五、腐蚀和膨胀,开闭运算
前言
本篇汇总了本人在OpenCV使用过程中总结的关于图片的一些函数使用经验及Bug处理经验,会根据后续使用情况逐步更新。
一、图片读写
import cv2 # 读取图片 img = cv2.imread(filename='./input.jpg', flag=1) ''' filename:打开的图像文件路径名 flag:打开方式,一般默认彩色图片,可以不写。支持以下参数: cv2.IMREAD_COLOR 加载彩色图片,这个是默认参数,可以直接写1。 cv2.IMREAD_GRAYSCALE 以灰度模式加载图片,可以直接写0。 cv2.IMREAD_UNCHANGED 包括alpha(包括透明度通道),可以直接写-1 ''' # 展示图片 cv2.imshow(winname='img_show', img=img) cv2.waitKey(delay=0) # 没有该函数会无法看到展示图片 ''' delay:表示延迟时间。不设置或设为0表示直到用户按任意键才会继续,大于0的数字表示等待时间(ms)。 ''' # 保存图片 cv2.imwrite(filename='./output.jpg', img=img, paras=[cv2.CV_IMWRITE_JPEG_QUALITY, 95]) ''' filename:保存的文件路径名 img:要保存的图像数据 paras:可选参数,图片的编码参数,支持以下参数: cv2.CV_IMWRITE_JPEG_QUALITY:设置 .jpeg/.jpg 格式的图片质量,取值为 0-100(默认值 95),数值越大则图片质量越高; cv2.CV_IMWRITE_WEBP_QUALITY:设置 .webp 格式的图片质量,取值为 0-100; cv2.CV_IMWRITE_PNG_COMPRESSION:设置 .png 格式图片的压缩比,取值为 0-9(默认值 3),数值越大则压缩比越大。 返回值:函数可返回bool类型返回值,表示是否保存成功。 '''二、调整大小和填充
import cv2 # 读取图片 img = cv2.imread(filename='./input.jpg', flag=1) # 调整图片大小 img_resize = cv2.resize(src=img, dsize=(512, 512), dst=None, fx=None, fy=None, interpolation=cv2.INTER_LINEAR) ''' src:输入图片 dsize:输出图片尺寸,dsize和(fx,fy)选一赋值即可 dst:输出图片,也可以作为返回值输出 fx:水平轴缩放比例因子 fy:垂直轴缩放比例因子 interpolation:插值类型,可选以下参数: cv2.INTER_LINEAR 双线性插值(默认) cv2.INTER_NEAREST 最近邻插值 cv2.INTER_AREA 使用像素区域关系进行重采样 cv2.INTER_CUBIC 4x4像素领域的双三次插值 cv2.INTER_LANCZOS4 4x4像素领域的Lanczos插值 ''' # 填充图片 img_pad = cv2.copyMakeBorder(src=img_resize, top=10, bottom=10, left=10, right=10, borderType=cv2.BORDER_CONSTANT, dst=None, value=(0, 0, 0)) ''' src:输入图片 top:图片上方填充大小 bottom:图片下方填充大小 left:图片左侧填充大小 right:图片右侧填充大小 boarderType:填充方式,支持以下参数: cv2.BORDER_CONSTANT 常数填充,需要value值 cv2.BORDER_REFLECT 边界元素镜像填充 cv2.BORDER_DEFAULT 类似上面的边界元素镜像填充,略有改动 cv2.BORDER_REPLICATE 重复边界元素填充 cv2.BORDER_WRAP 镜像互换填充,类似图片平铺 dst:输出图片,也可以作为返回值输出 value:填充值,尽在borderType=cv2.BORDER_CONSTANT时需要。 ''' # 展示图片 cv2.imshow(winname='img_resize', img=img_resize) cv2.imshow(winname='img_pad', img=img_pad) cv2.waitKey(delay=0)三、滤波
import cv2 # 读取图片 img = cv2.imread(filename='./input.jpg', flag=1) # 均值滤波 img_blur = cv2.blur(src=img, ksize=(3, 3), dst=None, anchor=None, borderType=None) ''' src:输入图片 ksize:卷积核大小(元组) dst:输出图片,也可以作为返回值输出 anchor:锚点,默认值 Point(-1,-1) 表示锚点位于内核中央 borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT ''' # 方盒滤波 img_box = boxFilter(src=img, ddepth=-1, ksize=(5, 5), dst=None, anchor=None, normalize=None, borderType=None) ''' src:输入图片 ddepth:输出图像深度,默认为-1,即和原图相同 ksize:卷积核大小(元组) dst:输出图片,也可以作为返回值输出 anchor:锚点,默认值 Point(-1,-1) 表示锚点位于核中央 normalize:是否进行核区域归一化,bool类型 borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT ''' # 高斯滤波,去除高斯噪声 img_gaussian = cv2.Gaussianblur(src=img, ksize=(5, 5), sigmaX=None, dst=None, sigmaY=None, borderType=None) ''' src:输入图片 ksize:卷积核大小(元组) sigmaX:在水平轴上的标准差σ dst:输出图片,也可以作为返回值输出 sigmaY:在垂直轴上的标准差σ borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT ''' # 中值滤波,去除椒盐噪声和斑点噪声 img_median = cv2.medianBlur(src=img, ksize=5, dst=None) ''' src:输入图片 ksize:卷积核大小(int) dst:输出图片,也可以作为返回值输出 ''' # 双边滤波 img_bilateral = cv2.bilateralFilter(src=img, d=3, sigmaColor=None, sigmaSpace=None, dst=None, borderType=None) ''' src:输入图片 d:像素的领域直径 sigmaColor:灰度值相似性高斯函数标准差σ sigmaSpace:空间高斯函数标准差σ dst:输出图片,也可以作为返回值输出 borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT ''' # 展示图片 cv2.imshow(winname='img_blur', img=img_blur) cv2.imshow(winname='img_box', img=img_box) cv2.imshow(winname='img_gaussian', img=img_gaussian) cv2.imshow(winname='img_median', img=img_median) cv2.imshow(winname='img_bilateral', img=img_bilateral) cv2.waitKey(delay=0)四、边缘提取
import cv2 # 读取图片 img = cv2.imread(filename='./input.jpg', flag=1) # Canny 算子 img_canny = cv2.Canny(src=img, thresh1=50, thresh2=200) ''' src:输入图片 thresh1:最小阈值 thresh2:最大阈值 ''' # Sobel 算子 img_sobel = cv2.Sobel(src=img, ddepth=-1, dx=1, dy=0, ksize=3, scale=1, delta=0, borderType=None) ''' src:输入图片 ddepth:输出图像深度,默认为-1,即和原图相同 dx:在水平轴上的求导阶数 dy:在垂直轴上的求导阶数 ksize:卷积核大小(int),必须为奇数。-1表示使用Scharr算子 scale:梯度计算数值的放大系数,默认为1 delta:计算结果都加上delta,默认为0 borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT ''' # Laplacian 算子 img_laplacian = cv2.Laplacian(src=img, ddepth=-1, ksize=3, scale=1, delta=0, borderType=None) ''' src:输入图片 ddepth:输出图像深度,默认为-1,即和原图相同 ksize:卷积核大小(int),必须为奇数。-1表示使用Scharr算子 scale:梯度计算数值的放大系数,默认为1 delta:计算结果都加上delta,默认为0 borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT ''' # 展示图片 cv2.imshow(winname='img_canny', img=img_canny) cv2.imshow(winname='img_sobel', img=img_sobel) cv2.imshow(winname='img_laplacian', img=img_laplacian) cv2.waitKey(delay=0)五、腐蚀和膨胀,开闭运算
import cv2 # 读取图片 img = cv2.imread(filename='./input.jpg', flag=1) # 腐蚀操作 img_erode = cv2.erode(src=img, kernel=cv2.getStructuringElement(cv2.MORPH_RECT, (1,3)), anchor=None, iterations=1, borderType=None, borderValue=None) ''' src:输入图片 kernel:腐蚀所采用的结构类型,可使用cv2.getStructuringElement()生成,也可自定义numpy数组 anchor:锚点,默认值 Point(-1,-1) 表示锚点位于核中央 iterations:迭代次数,默认为1 borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT borderValue:填充值 ''' ''' cv2.getStructuringElement(shape, ksize) shape:结构类型,支持以下参数: cv2. MORPH_RECT 矩形结构元素,所有元素值都是1 cv2. MORPH_CROSS 十字形结构元素,对角线元素值都是1 cv2. MORPH_ELLIPSE 椭圆形结构元素 ksize:卷积核大小(元组) ''' # 膨胀操作 img_dilate = cv2.dilate(src=img_erode, kernel=cv2.getStructuringElement(cv2.MORPH_RECT, (1,3)), anchor=None, iterations=1, borderType=None, borderValue=None) ''' 参数含义与erode相同 ''' ''' 开运算:先腐蚀再膨胀,去除白噪点 闭运算:先膨胀再腐蚀,去除黑噪点 也可使用cv2.morphologyEx函数实现 cv2.morphologyEx(src, op, kernel) src:输入图片 op:操作方式,支持以下参数: cv2.MORPH_OPEN 开运算(open) ,先腐蚀后膨胀的过程。开运算可以用来消除小黑点,在纤细点处分离物体、平滑较大物体的边界的 同时并不明显改变其面积。 cv2.MORPH_CLOSE 闭运算(close),先膨胀后腐蚀的过程。闭运算可以用来排除小黑洞。 cv2.MORPH_GRADIENT 形态学梯度(morph-grad),可以突出团块(blob)的边缘,保留物体的边缘轮廓。 cv2.MORPH_TOPHAT 顶帽(top-hat),将突出比原轮廓亮的部分。 cv2.MORPH_BLACKHAT 黑帽(black-hat),将突出比原轮廓暗的部分。 kernel:腐蚀所采用的结构类型,可使用cv2.getStructuringElement()生成,也可自定义numpy数组 ''' # 展示图片 cv2.imshow(winname='img_erode', img=img_erode) cv2.imshow(winname='img_dilate', img=img_dilate) cv2.waitKey(delay=0)



