前言
本篇汇总了本人在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)