21、图像平滑,中值滤波
让临近的像素按照大小排列,取排列像素集中位于中间位置的值作为中值滤波后的像素值。
medianBlur函数
dst=cv2.medianBlur(src,ksize) src,源文件 ,ksize,核大小,必须是比1大的奇数,如3,5,7等
r=cv2.medianBlur(o,3)
22、形态学变换,图像腐蚀
形态学转换主要针对的是二值图像,图像里只有0和1两个元素的值,0就是黑色的,1就是白色的。所谓的腐蚀,是针对它的前景色,即那些像素点的值为1的像素点,腐蚀的是白色。两个输入对象。对象1:二值原始图像。对象2:卷积核,关键的数组。 卷积核的中心点逐个像素扫描原始图像,被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,其值才为1,否则值为0。
函数erode
dst=cv2.erode( src, kernel, iterations ) dst ,处理结果 src,源图像 kernel,卷积核 iterations,迭代次数,默认情况下,迭代次数是1,根据需要可以进行多次腐蚀操作
kernel=np.ones( (5,5), np.uint8 ) ones表示我们要生成一个里面都是1的5行5列的数组,np.uint8表示数据类型整型
import cv2
import numpy as np
o=cv2.imread("image\erode.bmp",cv2.IMREAD_UNCHANGED)
kernel=np.ones((5,5),np.uint8)
erosion=cv2.erode(o,kernel,iterations=9)
cv2.imshow("original",o)
cv2.imshow("erosion",erosion)
23、形态学转换,图像膨胀
腐蚀操作的逆操作,图像被腐蚀后,去除了噪声,但是会压缩图像。对腐蚀过的图像,进行膨胀处理,可以去除噪声,并保持原有形状。卷积核的中心点逐个像素扫描原始图像,被扫描到的原始图像中的像素点,当卷积核对应的元素值只要有一个为1时,其值就为1,否则值为0。
函数dilate
dst = cv2.dilate( src, kernel, iterations )
kernel = np.ones((5,5),np.uint8) np.uint8表示无符号的8位整数,最小值0,最大值是2的8次幂
dilation = cv2.dilate(o,kernel)
24、形态学转换,开运算
先腐蚀,再膨胀,是对原始图像的去掉噪声并保持原有图像不变。开运算( image )=膨胀( 腐蚀( image ) )
函数morphologyEx,形态学扩展函数,已经封装了不同运算,使用不同参数即可实现对应效果
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) opening,开运算结果 img,源图像 cv2.MORPH_OPEN,开运算 kernel卷积核(同前边的腐蚀膨胀卷积核)
k = np.ones((5,5),np.uint8)
r = cv2.morphologyEx(o,cv2.MORPH_OPEN,k)
25、形态学转换,图像闭运算
先膨胀,后腐蚀,它有助于关闭前景物体内部的小孔,或物体上的小黑点。闭运算( image )=腐蚀( 膨胀( image ) ),卷积核kernel数组越大,效果越明显。
函数morphologyEx
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) cv2.MORPH_CLOSE,闭运算
k = np.ones((5,5),np.uint8)
r = cv2.morphologyEx(o,cv2.MORPH_CLOSE,k)
26、形态学转换,图像梯度
原始图像,得到原始图像的膨胀图像和原始图像的腐蚀图像,用膨胀图像-腐蚀图像,得到轮廓图像 。 梯度( image )=膨胀( image )-腐蚀( image )
函数morphologyEx
result = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) cv2.MORPH_GRADIENT, 梯度
k = np.ones((5,5),np.uint8)
r = cv2.morphologyEx(o,cv2.MORPH_CLOSE,k)
27、形态学转换,图像礼帽(顶帽tophat)
礼帽图像=原始图像-开运算图像,得到噪声图像。礼帽( image )= image - 开运算( image )
函数morphologyEx
result = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) cv2.MORPH_TOPHAT, 礼帽
k = np.ones((5,5),np.uint8)
r = cv2.morphologyEx(o,cv2.MORPH_CLOSE,k)
28、形态学转换,图像黑帽
黑帽图像=闭运算图像-原始图像,得到图像内部的小孔,或前景色中的小黑点
函数morphologyEx cv2.MORPH_BLACKHAT, 黑帽
k = np.ones((5,5),np.uint8)
r = cv2.morphologyEx(o,cv2.MORPH_CLOSE,k)
29、图像梯度,sobel算子
计算不同方向的梯度 G = |Gx| + |Gy|
-1 0 1 p1 p2 p3
Gx = -2 0 2 * p4 p5 p6
-1 0 1 p7 p8 p9
P5x = (p3-p1) + 2*(p6-p4) + (p9-p7) 右边这一列减去左边这一列,差值越大,说明这是一个边界
-1 -2 -1 p1 p2 p3
Gy = 0 0 0 * p4 p5 p6
1 2 1 p7 p8 p9
P5y = (p7-p1) + 2*(p8-p2) + (p9-p3) 下边这一列减去上边这一列,差值越大,说明这是一个边界
整体的梯度值先计算平方和再计算平方根: G=(Gx^2 +Gy^2)开平方根 为了简化直接用 G = |Gx| + |Gy| ,即直接计算两个方向上的梯度的绝对值的和就可以了
P5sobel = |p5x|+|p5y|,这是针对p5这点的,实际上每一点都是这样去计算的。
30、图像梯度,sobel算子函数及其使用
dst = cv2.Sobel( src, ddepth, dx, dy, [ksize] ) ddepth,处理结果图像深度,通常情况下,可以将该参数的值设置为-1,让处理结果与原始图像保持一致。实际操作中,计算梯度值可能会出现负数。通常处理的图像是np.uint8类型,如果结果也是该类型,所有负数会自动截断为0,发生信息丢失。所以,通常计算时,使用更高的数据类型cv2.CV_64F,取绝对值后,再转换为np.uint8(cv2.CV_8U)类型。 dx,x轴方向,计算x方向的边界 dy,y轴方向,计算y方向的边界 ksize,核大小
水平梯度、边界:某列其右侧像素值与左侧像素值的差值不为零,是边界;其余列,右侧像素值与左侧像素值的差值均为零,不是边界,差值为负数处理为0,为了边界能取到,取绝对值
垂直梯度、边界:某行其下一行像素值与上一行侧像素值的差值不为零,是边界;其余行,其下一行像素值与上一行像素值的差值均为零,不是边界,差值取绝对值(提示:256色位图中,白色点像素值255,黑色点像素值0)
vdst = cv2.convertScaleAbs( src [, alpha[, beta]]) #转回unit8,将负数的值取绝对值转换正值,将原始图像src转换为256色位图
公式:目标图像 = 调整 (原始图像*alpha + beta)alpha是系数,beta是修正值
计算sobel结果,分别计算dx和dy后相加
计算y轴方向的梯度,dx=0,dy=1 x轴与之相反。
白色图像像素255,黑色像素是0。水平梯度上某元素左侧与右侧差值为0则不是边界,差值不为0是边界,边界值为负数处理为0计算不出来,所以边界取绝对值。
dst = cv2.addWeighted( src,alpha,src2,beta,gamma ) X轴方向的梯度和Y轴方向上的梯度相加