opencv+python (2)

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轴方向上的梯度相加

原文地址:https://www.cnblogs.com/lely/p/9230608.html