文章目录
一、边界填充
1.1 为什么要边界填充
使用opencv进行图像处理,常常会面临对边界的处理问题,例opencv中常用的滤波操作cv.blur、cv.erode、cv.dilate等得到的图像与原图像形状一样,为了得到这种效果需要在原图像周围添加虚拟像素。
1.2 边界填充cv2.copyMakeBorder()
函数:cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)
参数名 | 意义 |
---|---|
src | 原图像 |
top,bottem,left,right | 分别表示四个方向上添加的边界的宽度 |
borderType | 边界填充类型,既填充的方式 |
borderType填充类型 | 填充效果 |
---|---|
cv2.BORDER_CONSTANT | 为边界指定一个常量值c进行填充555[abcde]555 |
cv2. BORDER_WRAP | 复制对边的像素填充边界edc[abcde] abc |
cv2.BORDER_REPLECT | 复制边缘的像素扩展边界aaa[abcde]eee |
cv2.BORDER_REFLECT | 通过镜像复制扩展边界cba[abcde]edc |
cv2.BORDER_REFLECT_101 | 通过镜像复制扩展边界,但边界除外dcb[abcde]dcb |
1.3 边界填充cv2.borderInterpolate()
根据不同的填充方法(borderType),如 BORDER_REPLICATE,计算外插像素对应于原图中的1D坐标,一般不单独使用,而在其他函数内部使用,如在copyMakeBorder中使用
二、阈值化
图像处理过程中,将高于或低于某一值的像素置为某值(0、maxval)同时其他像素保持不变。
2.1 固定阈值cv2.threshold()
ret,dst = cv2.threshold(src,thresh,maxval,type)
参数 | 含义 |
---|---|
src | 输入图像 |
thresh | 阈值 |
maxval | 最大值,当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值 |
type | 阈值类型 |
type阈值类型 | 作用 |
---|---|
cv2.THRESH_BINARY | 二值化操作,超过阈值部分取maxval(最大值),小于阈值部分取0 |
cv2.THRESH_BINARY_INV | 二值化取反操作,大于阈值部分取0,小于阈值部分取maxval(最大值) |
cv2.THRESH_TRUNC | 截断操作,大于阈值部分设为阈值,小于阈值部分值不变 |
cv2.THRESH_TOZERO | 化零操作,大于阈值部分不变,小于阈值部分取0 |
cv2.THRESH_TOZERO_INV | 化零取反操作,大于阈值部分取0,小于阈值部分不变 |
cv2.threshold()可以自动决定最优阈值,只需增加cv2.THRESH_OTSU即可。Otsu算法遍历所有可能的阈值,然后对每个阈值结果的两类像素计算方差。
2.2 自适应阈值cv2.adaptiveThreshold()
这种方法中,阈值在整个过程中自动产生变化。自适应阈值根据图片块区域的值来计算对应区域的阈值,从而得到更为合适的结果。当图像中出现较大的明暗差异时,自适应阈值非常有效。
dst = cv2.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, C)
参数 | 含义 |
---|---|
src | 输入图像 |
maxval | 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值 |
thresh_type | 阈值的计算方法,包含以下2种类型:cv2.ADAPTIVE_THRESH_MEAN_C; cv2.ADAPTIVE_THRESH_GAUSSIAN_C.,两种方法逐像素的计算自适应阈值,方法是通过计算每个像素周围的Block Size*Block Size区域的加权平均值,然后减去常数项C |
type | 阈值操作的类型,与固定阈值 相同包含5种 |
Block Size | 阈值计算方法中,图片块的大小 |
C | 阈值计算方法中的常数项 |
二、平滑/模糊
平滑也称模糊,是一种常用的图像处理操作。平湖的目的有很多,通常是为了减少噪声和伪影,在降低图像分辨率的时候,平滑也是十分重要的。
2.1 均值滤波
方框型滤波是一种一般化的形式,简单均值滤波是一种特殊化的格式,两者之间的区别主要是前者可以非归一化形式调用,并且输出图像的深度可以控制,而简单均值滤波深度与原图像一致
2.1.1 简单均值滤波cv.blur()
cv.blur()实现了简单模糊,目标图像中的每个值都是源图像中相应位置一个窗口(结构元素、模板)中像素的平均值。
dst = cv2.blur(src, kernel,anchor=None,borderType=None)
参数 | 含义 |
---|---|
src | 输入图像 |
kernel | 滤波窗口宽度和高度,例(3,3) |
anchor=None | 核与原图像的对齐方式,默认情况下核相对于滤波器居中,既滤波器中心点 |
borderType=None | 边界填充的类型 |
2.1.2 方框型滤波cv.boxFilter()
dst=cv2.boxFilter(src, ddepth, ksize,anchor=None, normalize=None, borderType=None)
参数 | 含义 |
---|---|
src | 输入图像 |
ddepth | 输出图像的深度,-1代表与深度与原图相同 |
kernel | 滤波器窗口宽度和高度,例(3,3) |
anchor=None | 核与原图像的对齐方式,默认情况下核相对于滤波器居中,既滤波器中心点 |
normalize=None | 当normalize=True时,与均值滤波结果相同, normalize=False,表示对加和后的结果不进行平均操作 |
borderType=None | 边界填充的类型 |
2.2 中值滤波cv2.medianBlur()
中值滤波将每个像素替换为围绕这个像素的矩形领域内的中值(中间值)。
均值滤波对较大孤立的异常值非常敏感,少量具有较大偏差的点也会严重影响到均值滤波。中值滤波可以采取中间点的方式消除异常值。
dst=cv2.medianBlurr(src, ksize)
参数 | 含义 |
---|---|
src | 输入图像 |
ksize | 滤波器窗口大小,例3,5,7… |
2.3 高斯滤波cv2.Guassianblur()
应该算是最有用的一种滤波器,高斯滤波使用规范化的高斯核滤波,输出目标图像。
高斯权重sigmaX和sigmaY是基于空间距离计算
dst=cv2.GaussianBlur(src, ksize, sigmaX, sigmaY=None, borderType=None)
参数 | 含义 |
---|---|
src | 输入图像 |
ksize | 滤波器窗口宽度和高度,例(3,3) |
sigmaX | 高斯核在x方向上的值 |
sigmaY=None | 高斯核在y方向上的值,如果只设定了sigmaX值,那么默认x,y的值相等。如果两者都是0那么高斯参数将通过公式确定。 |
borderType=None | 边界填充的类型 |
2.4 双边滤波cv2.cv.bilateralFilter()
双边滤波对每个像素及其邻域内的像素进行了加权平均,其权重由两部分组成:第一部分如高斯滤波;第二部分是高斯权重,不同的是它不是基于空间距离计算出来的而是基于色彩强度差计算出来的。
可以把双边滤波当做是高斯平滑,只是相似度更高的像素权值更高,边缘更明显,对比度更高。
高斯模糊减缓像素在空间上的变化,因此与邻域之间的关系紧密,基于这种特点高斯平滑很好的减弱了噪声,但破坏了边缘信息,最终高斯模糊把边缘也模糊了。
dst=cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace,borderType=None)
参数 | 含义 |
---|---|
src | 输入图像 |
d | 像素邻域的直径 |
sigmaColor | 颜色空间滤波器的sigma值,与高斯滤波器的sigma值相似。参数越大,平滑时所包含的强度(色彩)越大,图像的不连续性将会更显著 |
sigmaSpace | 坐标空间滤波器的sigma值,调用函数时,设置为-1将自动为图像计算sigmaSpac值 |
borderType=None | 边界填充的类型 |