Open CV系列学习笔记(六)模糊操作 2021-01-31

news/2024/7/8 3:12:30

Open CV系列学习笔记(六)模糊操作

什么是模糊操作?

模糊操作的作用是在图片时减低噪声。
模糊操作有均值模糊,中值模糊,高斯模糊和自定义模糊
模糊操作的基本原理:
1、基于离散卷积
2、定义好每一个卷积核
3、不同的卷积核得到不同的卷积效果
4、模糊是卷积的一种表象

卷积原理:
在这里插入图片描述

一、均值模糊

CV2.BLUR
原型:blur(src, ksize, dst=None, anchor=None, borderType=None)

作用:对图像进行算术平均值模糊

参数:ksize:卷积核的大小。dst,若填入dst,则将图像写入到dst矩阵。borderType:填充方式

假设我们传入的kszie=(ksize_h, ksize_w),那么均值模糊的卷积核就是:
在这里插入图片描述
在这里插入图片描述
代码:

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

运行结果:
在这里插入图片描述

二、中值模糊

CV2.MEDIANBLUR
原型:mediaBlur(src, ksize, dst=None)

作用:对图像进行中值模糊

参数:ksize:卷积核的大小。dst,若填入dst,则将图像写入到dst矩阵。

(其实只是用了类似卷积核的这个矩阵,计算方式就是取中间位置的数)

medianBlur函数,输入的ksize是一个int型整数,不同于blur中的size。它的卷积核是个ksize*ksize的矩阵。

medianBlur中值模糊就是以滑动的方式从原矩阵取出ksize*ksize个数,然后进行排序,结果就是中间位置的数。
代码:


def median_blur_demo(image):#中值模糊(去除椒盐噪声)
    dst = cv.medianBlur(image,5)
    cv.imshow("median_blur_demo",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)
    cv.imshow("custom_blur_demo",dst)

运行结果:(图像锐化)
在这里插入图片描述
完整代码;

import cv2 as cv
import numpy as np


def blur_demo(image):#均值模糊(去除随机噪声)
    dst = cv.blur(image,(5,5))
    cv.imshow("blur_demo",dst)


def median_blur_demo(image):#中值模糊(去除椒盐噪声)
    dst = cv.medianBlur(image,5)
    cv.imshow("median_blur_demo",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)
    cv.imshow("custom_blur_demo",dst)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("E:/picture/3.bmp")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
custom_blur_demo(src)

cv.waitKey(0)

cv.destroyAllWindows()

四、自定义模糊

正态分布
在这里插入图片描述
正态分布中,越接近中心点,取值越大,越远离中心,取值越小。
计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。正态分布显然是一种可取的权重分配模式。
高斯函数
如何反映出正态分布?则需要使用高函数来实现。
上面的正态分布是一维的,而对于图像都是二维的,所以我们需要二维的正态分布。
在这里插入图片描述
正态分布的密度函数叫做"高斯函数"(Gaussian function)。它的一维形式是:在这里插入图片描述

其中,μ是x的均值,σ是x的方差。因为计算平均值的时候,中心点就是原点,所以μ等于0。
在这里插入图片描述

根据一维高斯函数,可以推导得到二维高斯函数:

在这里插入图片描述

有了这个函数 ,就可以计算每个点的权重了。
在这里插入图片描述
在这里插入图片描述

代码:

import cv2 as cv
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]   #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)


print("--------HEllow Python-------")
src = cv.imread("E:/picture/IM_0000.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)

t1 = cv.getTickCount()
gaussian_noise(src)
t2 = cv.getTickCount()
time = (t2-t1)/cv.getTickFrequency()
print("用时 : %s"%(time*1000))
dst = cv.GaussianBlur(src, (5, 5), 0)#高斯滤波
cv.imshow("Gaussian Blur", dst)
cv.waitKey(0)

cv.destroyAllWindows()

结果:
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/3711227.html

相关文章

转贴C/C++用移位实现乘除法运算,提高运行效率

用移位实现乘除法运算 aa*4; bb/4; 可以改为&#xff1a; aa<<2; bb>>2; 说明&#xff1a; 除2 右移1位 乘2 左移1位 除4 右移2位 乘4 左移2位 除8 右移3位 乘8 左移3位 ... ... 通常如果需要乘以或除以2的n次方&#xff0c;都可以用移位的方法代替。 大部分…

Open CV系列学习笔记(七)边缘保留滤波(EPF) 2021-02-01

Open CV系列学习笔记&#xff08;七&#xff09;边缘保留滤波(EPF) 高斯双边 双边滤波&#xff08;Bilateral filter&#xff09;是一种非线性的滤波方法&#xff0c;是结合图像的空间邻近度和像素值相似度的一种折中处理&#xff0c;同时考虑空域信息和灰度相似性&#xff0c…

c++位运算,|,~,^,,

关键字&#xff1a;c位运算 什么是位(bit)&#xff1f; 很简单&#xff0c;位(bit)就是单个的0或1&#xff0c;位是我们在计算机上所作一切的基础。计算机上的所有数据都是用位来存储的。一个字节(BYTE)由八个位组成&#xff0c;一个字(WORD)是二个字节或十六位&#xff0c;一…

Open CV系列学习笔记(八)图像直方图 2021-02-02

Open CV系列学习笔记&#xff08;八&#xff09;图像直方图 什么是图像直方图 图像直方图由于其计算代价较小&#xff0c;且具有图像平移、旋转、缩放不变性等众多优点&#xff0c;广泛地应用于图像处理的各个领域&#xff0c;特别是灰度图像的阈值分割、基于颜色的图像检索以…

关于PInvoke 和COM Interop

关于PInvoke 和COM Interop.1. 平台调用利用平台调用这种服务&#xff0c;托管代码可以调用在动态链接库 (DLL)&#xff08;如 Win32 API 中的 DLL&#xff09;中实现的非托管函数。此服务将查找并调用导出的函数&#xff0c;然后根据需要跨越互用边界封送其参数&#xff08;整…

51单片机板子在Keil中找不到Device设备该怎么办

之前我遇到这个问题是下载了五六个版本的KEIL想找相应的版本内置有STC15F2K60S2的芯片&#xff0c;但下载安装了好多版本也不行&#xff0c;也在网上找了很多解决方案&#xff0c;但大多都是都是MDK的PACK下载&#xff0c;直到有一天看到STC—ISP当中内置有相当方便的STC仿真器…

Open CV系列学习笔记(九)直方图应用 2021-02-03

Open CV系列学习笔记&#xff08;九&#xff09;直方图应用 直方图均衡化 在统计学中&#xff0c;直方图&#xff08;英语&#xff1a;Histogram&#xff09;是一种对数据分布情况的图形表示&#xff0c;是一种二维统计图表&#xff0c;它的两个坐标分别是统计样本和该样本对…

解决多线程代码

http://www.cnblogs.com/shanyou/archive/2008/10/25/1319283.html 解决多线程代码中的 11 个常见的问题 http://msdn.microsoft.com/zh-cn/magazine/cc817398.aspx 并行编程方面的设计注意事项 http://msdn.microsoft.com/zh-cn/magazine/cc872852.aspx 识别并发问题的工具和方…