今天稍微学学模糊有关知识,发出来记录以一下。
模糊
#像的模糊是图像处理中比较常用和简单的处理手段之一。那么使用这种手段的原因就是为了给图像进行去噪,便于后面的处理。
#模糊处理的背后的原理其实就是卷积计算。
#单的说,拿一个小方格在图像这个方格上进行滑动,这样我们就可以得到一个新的图像了。
#根据原理的不同,模糊方式有很多种。
#(度娘yyds)
均值模糊
#适用于去随机噪声
#均值滤波从字面意思上就是取平均值,也就是黄色小方格上的系数全是1,与黄色窗体覆盖下的像素值相乘,再去除以9(卷积和大小为3*3),得到平均值,赋值给#中心像素。
# 它的 缺点是在去噪的同时,不能很好的保留图像细节,因为全用均值代替了。
def blur_demo(image):#均值模糊
dst = cv.blur(image,(100,300))# 前一个为水平方向模糊,后一个为竖直方向模糊
cv.imshow(" blur_demo",dst)
中值模糊
#适用于去除椒盐噪点(就是小斑点)
#字面意思的话,就是取中间的值来代替中心像素。和均值滤波类似,只不过均值滤波是取平均值,中值滤波取中间的那个值。中值滤波可以有效的去除椒盐噪声#(比如说你在清水中,撒点盐,这些就是椒盐噪声。对应到图像上,在一副黑色图像上,有很多小白点,这些就是椒盐噪声)。
#(突然很想吃烧烤。。)
def median_blur_demo(image): #中值模糊
det = cv.medianBlur(image,5)
cv.imshow("Median_Blur",det)
自定义模糊
适用于图像增强,锐化
def custom_demo(image): # 自定义模糊
kernel = np.ones([5, 5], np.float32)/25 # 保证值不会溢出
# 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) # 该参数起到锐化效果
dst = cv.filter2D(image, -1, kernel=kernel) # 第二个参数为目标图像深度,-1则表示和原图像一样
cv.imshow("custom_demo", dst)
高斯模糊
#高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,滤波高斯就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
#相对于均值滤波,更好的保留图像的细节。因为高斯函数的特性,会有一定的权重配比。
#**手动加高斯噪音**
def gaussian_noise(image): # 高斯噪声
h, w, c = image.shape # image.shape[0], 图片垂直尺寸;image.shape[1], 图片水平尺寸;image.shape[2], 图片通道数
for row in range(h):
for col in range(w):
s = np.random.normal(0, 20, 3) # 产生一个正态分布
'''
numpy.random.normal(loc=0,scale=1.0,size=shape)
参数loc(float):正态分布的均值,对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布
参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦
参数size(int 或者整数元组):输出的shape,默认为None,这里设置为3,表示输出3个值
'''
b = image[row, col, 0] # blue;row高度,col宽度,0表示通道0,蓝色
g = image[row, col, 1] # green;1表示通道1,绿色
r = image[row, col, 2] # red
image[row, col, 0] = clamp(b + s[0]) # 在通道0上加上一个高斯噪声
image[row, col, 1] = clamp(g + s[1]) # 在通道1上加上一个高斯噪声
image[row, col, 2] = clamp(r + s[2]) # 在通道2上加上一个高斯噪声
cv.imshow("gaussian_noise image", image)
def clamp(pv):
if pv >255:
return 255
if pv <255:
return 0
else :
return pv**
opencv高斯模糊
gaussian_noise(src) #手动高斯模糊
dst = cv.GaussianBlur(src, (5, 5), 0) # opencv的高斯模糊API
'''
def GaussianBlur(src: Any, ksize: Any, sigmaX: Any, dst: Any = None, sigmaY: Any = None, borderType: Any = None)
src: 输入图片,可以使是任意通道数,该函数对通道是独立处理的
ksize: 高斯内核大小。ksize.width和ksize.height允许不相同但他们必须是正奇数。或者等于0,由参数sigma决定。
sigmaX: 高斯内核在X方向的标准偏差。
sigmaY: 高斯内核在Y方向的标准偏差。如果sigmaY为0,他将和sigmaX的值相同,如果他们都为0,那么他们由ksize.width和ksize.height计算得出。
borderType:用于判断图像边界的模式。
'''
《毛玻璃效果》
双边模糊
#双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。
#双边滤波避免了边缘信息丢失,保留了图像的轮廓不变。
def bi_demo(image): # 双边模糊
dst = cv.bilateralFilter(image, 0, 100, 15)
'''
def bilateralFilter(src: Any, # 原图数据
d: Any, # 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
sigmaColor: Any, # 颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
sigmaSpace: Any, # 坐标空间中滤波器的sigma值,如果该值较大,则意味着越远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace无关,否则d正比于sigmaSpace
dst: Any = None, # 这里也可以输出图像
borderType: Any = None) # 用于推断图像外部像素的某种边界模式
'''
cv.imshow("bi_demo image", dst)
(百度真滴香)