图像滤波:即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
图像滤波
图像滤波的目的 a、消除图像中混入的噪声 b、为图像识别抽取出图像特征
均值滤波,用blur函数
方框滤波:进行归一化处理后,和均值滤波相同。当normalize为零时,不进行归一化处理。当normalize为一时,进行归一化处理(默认)。目标图像深度通常于原始图像一样,值为-1。
高斯滤波:
注意:ksize:核大小必须为单数 sigmaX、sigmaY:控制权重
中值滤波:
两种边缘保留滤波:
biateraFilter:能在保持边界清晰的情况下有效的去除噪音
filter2D:对2D图像实施低通滤波。去除噪音,模糊图像
膨胀和腐蚀
膨胀、腐蚀时用到的kernel的形状一般有下面三种:
矩形: MORPH_RECT
交叉形: MORPH_CROSS
椭圆形: MORPH_ELLIPSE
图像腐蚀:调用erode函数
图像膨胀:调用dialate
开运算:先通过图像腐蚀,后经过图像膨胀可以图像去噪。iteration表示次数
闭运算:先是先通过图像膨胀,后经过图像腐蚀
梯度运算:图像膨胀-图像腐蚀
图像礼帽(图像顶帽):原始图像-开运算图像,得到噪声图像
图像黑帽:闭运算-原始图像
求梯度
梯度简单来说就是求导。Sobel,Scharr是求一阶导数或二阶导数。Scharr是对Sobel的优化。Laplacian是求二阶导数。
Sobel算子:当一个像素右边的值减去左边的值不为零,该像素为边界。
计算梯度的函数:
ddepth通常取cv2.CV_64F。
dx=0,dy=1计算y轴的边界,dx=1,dy=0计算x轴的边界。满足条件dx>=0&&dy>=0&&dx+dy=1
将图像中的负值转为正:
将一个图像的边缘提取出来:如果没有converScaleAbs,所有的负值都会被截断为0.换句话就是把边界丢掉。
Scharr算子:比sobel算子精准,使用方法基本一样
计算梯度调用函数:cv2.Scharr(src,ddpetch,dx,dy)
des=cv2.Scharr(src,ddpetch,dx,dy) 等价于des=cv2.Sobel(src,ddpetch,dx,dy,-1)
为图像扩边:cv2.copyMakeBorder()
src:原图图像
top,bottom,left,right分别表示在原图四周扩充边缘的大小
borderType:扩充边缘的类型,就是外插的类型,OpenCV中给出以下几种方式
* BORDER_REPLICATE
* BORDER_REFLECT
* BORDER_REFLECT_101
* BORDER_WRAP
* BORDER_CONSTANT
canny函数提取图片边缘
cv2.canny(img,threshold1,threshold2) img代表原始图像,threshold1、threshold2为阈值。两个阈值越小,得出图像边缘越详细。反之,边框越边缘。
提取原理步骤:1、高斯模糊 - GaussianBlur 2、灰度转换 - cvtColor 3、计算梯度 – Sobel/Scharr 4、非最大信号抑制5、高低阈值输出二值图像