第一课:
import cv2 as cv
import numpy as np
#均值模糊,作用:去噪声
def blur_demo(image):
dst= cv.blur(image,(3,3))
cv.imshow("blur_win",dst)
#去掉椒盐噪声
def median_blur(image):
dst =cv.medianBlur(image,5)
cv.imshow("median_blur_win",dst)
def custom_blur_demo(image):
#kernel = np.array([[1,1,1],[1,1,1],[1,1,1]],np.float32)/9
#kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)
kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)
dst = cv.filter2D(image,-1,kernel)
cv.imshow("custom_blur_demo",dst)
src = cv.imread("E:/opencv/picture/test3.jpg")
cv.imshow("initial_win",src)
blur_demo(src)
median_blur(src)
custom_blur_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
分析:
1. 均值滤波:cv.blur(src,ksize):去噪声
注:这里的ksize是个(x,y)形式
卷积过程:
6*6上面是个3*3的窗口,从上向下移动,黄色的每个像素点值之和取平均值赋给中心红色像素作为它卷积处理之后的的新的像素值,每次移动一个像素格!
2. 中值滤波:cv.median_blur(srcm,ksize):对于去椒盐噪声很有用
注:这里的ksize是个x数值形式
举个例子:我们在图像中去3*3的矩阵,里面有9个像素点,我们将9个像素进行排序,最后将这个矩阵的中心点赋值为这九个像素的中值。
3. 用户自定义模糊
所用函数:filter2D()
函数原型: filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst
src参数表示待处理的输入图像。
ddepth参数表示目标图像深度,输入值为-1时,目标图像和原图像深度保持一致
kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵。修改kernel矩阵即可实现不同的模糊
分析:
1. kernel的大小应该是奇数,这样它才有一个中心点
2. 滤波器矩阵所有的元素之和应该要等于1,这是为了保证滤波前后图像的亮度保持不变。
3. 我们也可以用filt2D的方法实现均值滤波。
如
kernel = np.array([[1,1,1],[1,1,1],[1,1,1]],np.float32)/9
注意:这里kernel的运算一定要除以9哦。
4. 当然也有其它的kernel可以用于其它图像处理
kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)
该kernel用于锐化图像。
第二课:
import cv2 as cv
import numpy as np
def clamp(pv):
if pv>255:
return 255
else:
return pv
def gaussian_noise(image):
h,w,ch= image.shape
for row in range(h):
for col in range(w):
s = np.random.normal(0, 20, 3)
b = image[row, col, 0]
g = image[row, col, 1]
r = image[row, col, 2]
image[row,col,0] =clamp(b +s[0])
image[row, col, 1] = clamp(g + s[1])
image[row, col, 2] = clamp(r + s[2])
cv.imshow("gaussian_win",image)
src = cv.imread("E:/opencv/picture/lena.jpg")
cv.imshow("initial_win",src)
gaussian_noise(src)
dst = cv.GaussianBlur(src,(0,0),2)
cv.imshow("dst_win",dst)
cv.waitKey(0)
cv.destroyAllWindows()
分析:
1. 如何在图像中制造噪声?
答:在源图像的每个像素上加上个随机值就会出现噪声线性。
这里我们还是使用逐个像素点改变像素值的办法来处理的,用了两层for嵌套:
for row in range(h):
for col in range(w):
接着就是要改变像素值了,我们使用了随机数指令:
s = np.random.normal(0,15,3)
该指令分析如下:
numpy.random.normal(loc=0.0, scale=1.0, size=None)
参数一:概率分布的均值,对应着整个分布的中心center
参数二:概率分布的标准差,对应于分布的宽度,scale越大越矮胖,反之越瘦高
参数三:输出值shape,默认是输出一个值,因为这里我们要改变各个像素点各个通道的数值,所以这里设置为3。
这块的源码是这样的:
def guess_noise(image):
h,w= image.shape[0:2]
for row in range(h):
for col in range(w):
s = np.random.normal(0,15,3)
b = image[row,col,0]
g = image[row,col,1]
r = image[row,col,2]
image[row,col,0] = b+s[0]
image[row,col,1] = g+s[1]
image[row,col,2] = r+s[2]
cv.imshow("noise_win",image)
2. 高斯模糊: 加强版的均值模糊(均值模糊只是线性模糊)
高斯模糊实质上就是一种均值模糊,只是高斯模糊是按照加权平均的,距离越近的点权重越大,距离越远的点权重越小。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
api指令:
GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
参数一:待处理的输入图像
参数二:高斯滤波器模板大小。其中ksize.width和ksize.height可以不同,但它们必须是正数和奇数。或者它们可以是(0,0),然后从第三个参数计算出来。
参数三:表示X方向上的高斯内核标准差
参数四:表示Y方向上的高斯内核标准差。如果参数四为0,则设置为等于参数三,如果这两个参数均为零,则分别从ksize.width和ksize.height计算得到。
注:若ksize不为(0,0)则按照ksize计算,后面的参数三,参数四无意义。若ksize为(0,0)则根据后面的参数三计算ksize
故一般来说设置成cv.GaussianBlur(src,(0,0),3)
或者是dst = cv.GaussianBlur(src,(3,3),0)
都行
第三课、高斯双边模糊
import cv2 as cv
import numpy as np
def bl_demo(image):
dst = cv.bilateralFilter(image,0,100,15)
cv.imshow("dst_win",dst)
def shift_demo(image):
dst = cv.pyrMeanShiftFiltering(image,10,50)
cv.imshow("shift_demo",dst)
src = cv.imread("E:/opencv/picture/lena.jpg")
cv.imshow("inital_win",src)
#bl_demo(src)
shift_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
1. 高斯双边模糊:加强版的高斯模糊,保留了边界信息
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) → dst
双边滤波器可以去除无关噪声,同时保持较好的边缘信息。 但是,其速度比绝大多数滤波器都慢。 在局部上,就是在灰度值差异不大的区域平滑,在灰度值差异比较大的边界地区保留边界。所以双边滤波器作用于每个像素的同时,必然会受到领域像素点的距离、灰度值差的权重影响。
参数一:输入源
参数二:一般写0就行
参数三(作用于色差):色彩空间的sigma参数,该参数较大时,各像素邻域内相距较远的颜色会被混合到一起,从而造成更大范围的半相等颜色)。
这个参数决定多少差值之内的像素会被计算,而大于这个差值的,我们就认为是边缘区域需要保留该区域像素值。color差异一般我们希望它大一点。
参数四(作用于距离):坐标空间的sigma参数,该参数较大时,只要颜色相近,越远的像素会相互影响。space差异一般我们希望它小一点。
2. 偏移高斯模糊