目录

  • 前言
  • 模糊操作
  • 模糊操作的基本原理
  • 三种模糊方式(参考:[搞懂三种模糊操作](https://www.pythonheidong.com/blog/article/134327/28172079273cc0f07581/))
  • 均值模糊
  • 中值模糊
  • 高斯模糊
  • 高斯噪声
  • 通过高斯模糊处理图片
  • 代码
  • 参考文章


前言

这部分是关于模糊操作的,因为自己也是新手,所以会对很多基础知识进行讲解。大佬勿喷~

模糊操作

模糊操作的基本原理

1、

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

关键词解释:

  1. 离散卷积:离散卷积是两个离散序列之间按照一定的规则将它们的有关序列值分别两两相乘再相加的一种特殊的运算。
  2. 卷积核:卷积核就是图像处理时,给定输入图像,输入图像中一个小区域中像素加权平均后成为输出图像中的每个对应像素,其中权值由一个函数定义,这个函数称为卷积核。

java基于opencv 实现模糊检测 opencv模糊技术包括_java基于opencv 实现模糊检测



  1. 上面两个边缘的数值是直接往下拉的。具体原因以后再深究。

2、 滤波器
滤波器有高通滤波器(HPF)和低通滤波器(LPF)两种。
高通滤波器:根据像素与周围的像素的亮度差值来提升改像素的亮度。主要作用是锐化。
低通滤波器:在像素与周围像素的亮度差值小于一个特定值时,平滑改像素的亮度。主要作用是去噪和模糊化。
下面要说的均值模糊、中值模糊、高斯模糊都属于低通滤波器。

3、噪声:主要有三种:
椒盐噪声(Salt & Pepper):含有随机出现的黑白亮度值。
脉冲噪声:只含有随机的正脉冲和负脉冲噪声。
高斯噪声:含有亮度服从高斯或正态分布的噪声。高斯噪声是很多传感器噪声的模型,如摄像机的电子干扰噪声。

三种模糊方式(参考:搞懂三种模糊操作

均值模糊

cv2.blur
原型:blur(src, ksize, dst=None, anchor=None, borderType=None)
作用:对图像进行算术平均值模糊
参数:ksize:卷积核的大小。dst,若填入dst,则将图像写入到dst矩阵。borderType:填充方式

中值模糊

cv2.medianBlur
原型:mediaBlur(src, ksize, dst=None)
作用:对图像进行中值模糊
参数:ksize:卷积核的大小。dst,若填入dst,则将图像写入到dst矩阵。

medianBlur函数,输入的ksize是一个int型整数,不同于blur中的size。它的卷积核是个ksizeksize的矩阵。
medianBlur中值模糊就是以滑动的方式从原矩阵取出ksize
ksize个数,然后进行排序,结果就是中间位置的数。
它没有填充方式的参数,它的默认填充方式为:(这个很重要)
BORDER_REPLICATE
Python: cv.BORDER_REPLICATE
aaaaaa|abcdefgh|hhhhhhh

关于上面两种处理方法的代码:

# 滤波器有高通滤波器(HPF)和低通滤波器(LPF)两种。
#
# 高通滤波器:根据像素与周围的像素的亮度差值来提升改像素的亮度。主要作用是锐化。
# 低通滤波器:在像素与周围像素的亮度差值小于一个特定值时,平滑改像素的亮度。主要作用是去噪和模糊化。
# 下面要说的均值模糊、中值模糊、高斯模糊都属于低通滤波器。

# 均值模糊
# 中值模糊
# 自定义模糊
import numpy as np
import cv2 as cv

def blur_demo(image):
    dst = cv.blur(image,(15,15))#均值模糊操作
    cv.imshow("blur_demo",dst)

def mediam_blur_demo(image):#中值模糊,对椒盐噪声去噪较好
    dst = cv.medianBlur(image,5)
    cv.imshow("medianBlur",dst);

def custom_blur_demo(image):#将图像与内核卷积
    #kernel = np.ones([5,5],np.float32)/25
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)  # 锐化算子
    dst = cv.filter2D(image,-1,kernel=kernel)# 二维滤波器
    #使用自定义内核对图像进行卷积。该功能将任意线性滤波器应用于图像。支持就地操作。当光圈部分位于图像外部时,该功能会根据指定的边框模式插入异常像素值。
    # filter2D(src, ddepth(图像深度,-1表示默认和src一样深度), kernel, dst=None, anchor=None(锚点,卷积核中心), delta=None, borderType=None)
    cv.imshow("custom_blur_demo",dst)


src = cv.imread("../images/lena.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)#创建一个窗口来放src
# API详解:原型:void nameWindow(const string& winname,int flags = WINDOW_AUTOSIZE) ;
# 参数1:新建的窗口的名称。自己随便取。
# 参数2:窗口的标识,一般默认为WINDOW_AUTOSIZE 。
# WINDOW_AUTOSIZE 窗口大小自动适应图片大小,并且不可手动更改。(上面图1就是使用的它)
# WINDOW_NORMAL 用户可以改变这个窗口大小(上面图2就是使用的它)
# WINDOW_OPENGL 窗口创建的时候会支持OpenGL
cv.imshow("input image", src)  # 将src图片放入该创建的窗口中
# blur_demo(src)
custom_blur_demo(src)
cv.waitKey(0)  # 等有键输入或者1000ms后自动将窗口消除,0表示只用键输入结束窗口

cv.destroyAllWindows()

高斯模糊

原理:运用了高斯的正态分布的密度函数对中心点旁边的点分配权重,从而达到模糊的效果。严禁来说是把要模糊的像素色值统计,用数学上加权平均的计算方法(高斯函数)得到色值,对范围、半径等进行模糊。
作用:肯定是处理具有较大高斯噪声的图片。那什么是高斯噪声?

高斯噪声

高斯噪声是指高绿密度函数服从高斯分布的一类噪声。特别的,假设一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称这个噪声为高斯白噪声。

效果图

java基于opencv 实现模糊检测 opencv模糊技术包括_卷积核_02

通过高斯模糊处理图片

效果图

java基于opencv 实现模糊检测 opencv模糊技术包括_opencv_03

代码
import numpy as np
import cv2 as cv

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

def gaussion_noise(image):
    h,w,c = image.shape#高,宽,通道的元组
    for row in range(0,h,1):
        for col in range(w):
            s = np.random.normal(0,20,3)
            b = image[row,col,0]#blue
            g = image[row,col,1]#green
            r = image[row,col,2] # red
            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("noise image",image)

src = cv.imread("../images/lena.jpg")
cv.namedWindow("src",cv.WINDOW_AUTOSIZE)
cv.imshow('src', src)

t1 = cv.getTickCount()
gaussion_noise(src)
t2 = cv.getTickCount()
t = (t2-t1)/cv.getTickFrequency()
print("time cosume:%s"%(t+1000))

dst = cv.GaussianBlur(src,(5,5),15)#
cv.imshow("Gaussian blur",dst)
cv.waitKey(0)  # 等有键输入或者1000ms后自动将窗口消除,0表示只用键输入结束窗口
cv.destroyAllWindows()

参考文章

  1. OpenCV 学习:8 高斯滤波GaussianBlur