0
点赞
收藏
分享

微信扫一扫

七、模糊操作

悲催博士僧 2022-03-26 阅读 24
pythonOpenCV

一、模糊操作基本原理

1,基于离散卷积
2,定义好每一个卷积核
3,不同卷积核得到不同的卷积效果
4,模糊是卷积的一种表象

二、1*3卷积核举例

每次右移一格,进行对应相乘再求和。1*3的卷积核左右两边的元素并没有处理而是照搬下来。卷积核一般都奇数。
在这里插入图片描述

三、均值模糊

对随机噪声有很好的去噪效果

1,基于平均值的均值模糊

cv2.blur(image,(5,5))需要传入目标图像,定义卷积核大小

import cv2
import numpy as np


def blur(image):
    dst = cv2.blur(image,(5,5))
    cv2.imshow("blur",dst)

src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
blur(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述

2,基于权重的高斯模糊

①概念公式

Ⅰ一维高斯正态分布
在这里插入图片描述在这里插入图片描述
Ⅱ二维高斯公式
在这里插入图片描述在这里插入图片描述
Ⅲ实际上图像是个二维的,若采用二维卷积核去计算的话很耗时,一般采用两个一维卷积核去操作运算
例如二维卷积核在这里插入图片描述
可由在这里插入图片描述在这里插入图片描述
两个一维卷积核来等效替代

②高斯噪声

实际上就是多个随机点分别对应加上原图像上

import cv2
import numpy as np


def clamp(pv):
    if pv>255: return 255
    
    if pv<0: return 0
    else : return pv


def gaussian_noise(image):
    h,w,c = 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])
    cv2.imshow("noise",image)
            
        
src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
t1 = cv2.getTickCount()
gaussian_noise(src)
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()# s
print("time is %s"%(time*1000))# ms


cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述

在这里插入图片描述

③高斯模糊

cv2.GaussianBlur(src,(0,0),15)15表示公式中的σ的值

import cv2
import numpy as np

        
src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
dst = cv2.GaussianBlur(src,(0,0),15)
cv2.imshow("GaussianBlur",dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述

④使用高斯模糊消除高斯噪声
import cv2
import numpy as np


def clamp(pv):
    if pv>255: return 255
    
    if pv<0: return 0
    else : return pv


def gaussian_noise(image):
    h,w,c = 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])
    cv2.imshow("noise",image)
            
        
src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)


t1 = cv2.getTickCount()
gaussian_noise(src)#给图像加入高斯噪声
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()# s
print("time is %s"%(time*1000))# ms

#dst = cv2.GaussianBlur(src,(0,0),15)
dst = cv2.GaussianBlur(src,(5,5),0)#对加入高斯噪声的图像进行高斯模糊操作
cv2.imshow("GaussianBlur",dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述
在这里插入图片描述

二、中值模糊

中值模糊一般用于消除椒盐噪声
cv2.medianBlur(image,5)需要传入目标图像,卷积核大小

import cv2
import numpy as np


def median_blur(image):
    dst = cv2.medianBlur(image,5)
    cv2.imshow("median_blur",dst)

src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\l.png")
cv2.imshow("image",src)
median_blur(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述

三、自定义模糊

cv2.filter2D(image,-1,kernel=kernel1)需要传入目标图像,自定义卷积核

import cv2
import numpy as np

'''
之所以有的需要除以25和除以9,是因为所有的卷积核之和为1才行
'''
def custom_blur(image):
    kernel1 = np.ones([5,5],np.float32)/25 #需要满足卷积核之和为1故需要除以25
    dst1 = cv2.filter2D(image,-1,kernel=kernel1)
    cv2.imshow("custom_blur_1",dst1)
    
    kernel2 = np.array([[1,1,1],[1,1,1],[1,1,1]],np.float32)/9 #需要满足卷积核之和为1故需要除以9
    dst2 = cv2.filter2D(image,-1,kernel=kernel2)
    cv2.imshow("custom_blur_2",dst2)
    
    
    kernel3 = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)#这个卷积核实际上就是图像的锐化
    dst3 = cv2.filter2D(image,-1,kernel=kernel3)
    cv2.imshow("custom_blur_3",dst3)
    
    
src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
custom_blur(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述

举报

相关推荐

0 条评论