2019-03-17 01:28:24 qq_40061319 阅读数 126
  • 机器学习之概率与统计推断

    本课程讲解机器学习算法所需概率和统计推断知识。概率部分包括概率公理及推论、条件概率、贝叶斯公式、随机变量及其概率函数(CDF/pdf)、常用概率分布及其均值、方差;统计推断部分包括大数定律和中心极限定理、极大似然估计、贝叶斯估计,估计的评价、偏差-方差平衡。课程还会讲解假设检验的基本概念。

    20297 人正在学习 去看看 AI100讲师

数字图像处理 均值滤波器

自写函数

%%自写滤波
I = double(imread('Fig3.35(a).jpg'));
[m,n] = size(I);
A3 = zeros(m,n);
A5 = zeros(m,n);
for i = 3:m-3
    for j = 3:n-3
        A3(i,j) = ( I(i-1,j-1)+I(i-1,j)+I(i-1,j+1)+I(i,j-1)+I(i,j)+I(i,j+1)+I(i+1,j-1)+I(i+1,j)+I(i+1,j+1))/9;
        A5(i,j)= ( I(i-2,j-2)+I(i-2,j-1)+I(i-2,j)+I(i-2,j+1)+I(i-2,j+2)+...
               I(i-1,j-2)+I(i-1,j-1)+I(i-1,j)+I(i-1,j+1)+I(i-1,j+2)+...
               I(i,j-2)+I(i,j-1)+I(i,j)+I(i,j+1)+I(i,j+2)+...
               I(i+1,j-2)+I(i+1,j-1)+I(i+1,j)+I(i+1,j+1)+I(i+1,j+2)+...
               I(i+2,j-2)+I(i+2,j-1)+I(i+2,j)+I(i+2,j+1)+I(i+2,j+2))/25;
    end
end
subplot(1,3,1),imshow(uint8(I));title('原图像');
subplot(1,3,2),imshow(uint8(A3));title('3X3均值滤波器');
subplot(1,3,3),imshow(uint8(A5));title('5X5均值滤波器');`

在这里插入图片描述

系统函数

%%系统滤波
I = double(imread('Fig3.35(a).jpg'));
[m,n] = size(I);
A3 = zeros(m,n);
A5 = zeros(m,n);
H1 = fspecial('average',[3,3]);
H2 = fspecial('average',[5,5]);
A3 = imfilter(I,H1);
A5 = imfilter(I,H2);
subplot(1,3,1),imshow(uint8(I));title('原图像');
subplot(1,3,2),imshow(uint8(A3));title('3X3均值滤波器');
subplot(1,3,3),imshow(uint8(A5));title('5X5均值滤波器');

在这里插入图片描述

参考文件

题目:均值滤波和中值滤波 在自己的证件照中加入椒盐噪声、高斯白噪声。
分别用33、55、7*7的均值滤波器和中值滤波器进行滤波。
处理过程

  1. 用imnoise函数在图像中分别加入椒盐噪声和高斯白噪声;
  2. 均值滤波:用fspecial函数创建各模板大小的均值滤波器,并用imfilter函数进行滤波。
    中值滤波:直接用matlab提供的medfilt2中值滤波器进行滤波即可。
    处理结果 程序清单 (1)

%%均值滤波

rgb=imread('photo.jpg');
 J1=imnoise(rgb,'salt & pepper',0.02);  %%添加噪声
 J2=imnoise(J1,'gaussian',0,0.01);		%%添加噪声
  h1=fspecial('average',[3,3]); 		%%平均滤波算子
  h2=fspecial('average',[5,5]); 
  h3=fspecial('average',[7,7]); 
  rgb1=imfilter(J2,h1); 			    %% 用算子使用平均滤波
  rgb2=imfilter(J2,h2);
  rgb3=imfilter(J2,h3); figure; 
  subplot(2,3,1);imshow(rgb) title('原图像'); 
  subplot(2,3,2);imshow(J2) title('加入噪声后的图像'); 
  subplot(2,3,4);imshow(rgb1) title('3*3均值滤波图像'); 
  subplot(2,3,5);imshow(rgb2) title('5*5均值滤波图像'); 
  subplot(2,3,6);imshow(rgb3) title('7*7均值滤波图像'); 

%%(2)中值滤波

	 rgb=imread('photo.jpg'); 
	J1=imnoise(rgb,'salt & pepper',0.02);  
	J2=imnoise(J1,'gaussian',0,0.01);   
	J3=rgb2gray(J2);
    rgb1=medfilt2(J3,[3 3]);
	rgb2=medfilt2(J3,[5 5]); 
	rgb3=medfilt2(J3,[7 7]); 

2019-08-30 13:12:16 qq_17592003 阅读数 380
  • 机器学习之概率与统计推断

    本课程讲解机器学习算法所需概率和统计推断知识。概率部分包括概率公理及推论、条件概率、贝叶斯公式、随机变量及其概率函数(CDF/pdf)、常用概率分布及其均值、方差;统计推断部分包括大数定律和中心极限定理、极大似然估计、贝叶斯估计,估计的评价、偏差-方差平衡。课程还会讲解假设检验的基本概念。

    20297 人正在学习 去看看 AI100讲师

[Matlab]实现对图像的均值滤波

软件环境 matlab R2017a

搜了不少关于使用滤波器的文章,都是直接调用现有函数,我在这里简单实现了均值滤波器


问题背景:实现复杂明暗条件下的图像二值化

例如要把这张图片二值化,用于后续识别 使用全局的阈值划分,可能会得到以下结果 一个更极端的例子
在这里插入图片描述 左下角的区域被错误处理 在这里插入图片描述

显然,我们希望得到如下结果
在这里插入图片描述
要得出这样的结果就需要对暗处进行补偿、降低过曝处亮度,因此有了滤波器的方案


理论基础

均值滤波器相关理论

  1. 基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点的均值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点
  2. 方法是用某种结构的二维滑动窗口,将板内像素均值设为中心点的值

方案实施

  1. 举一个使用3*3的正方形窗口的例子,中心点取整个窗口中所有点的均值,实际常用图片宽度的1/16作为窗口半径

关于边界点的均值,提供3种处理方法供参考

  • 可以将矩阵向外扩充一圈,其值可以由某种算法产生(例如全填0或者是通过当前边界已有的值计算出)
  • 可以只计算窗口内有值的像素
  • 不改变(如下图)
    在这里插入图片描述
  1. 对第一张灰度图片全部做如此运算后可以得到一个带有各区域明暗信息的图片
    在这里插入图片描述

  2. 如果我们对它取反,这个图片就成为了一个亮度补偿数据,与原图片相加,可以得到在这里插入图片描述
    至此,我们的目的基本达到了,后续只需做简单处理可得到对比度更高的图像


matlab代码

clear;clc;
I = im2double(rgb2gray(imread('C:\Users\Bob Xiao\Desktop\3.png')));
% I(1,1)
[rows, cols] = size(I);
add = floor(cols/16);
windowSize = add*2+1;
newImg = padarray(I, [add,add]);    %填充边界之后的图片

bgImg = zeros(rows,cols);
for i=add+1:add+rows
    for j=add+1:add+cols
        myWin = newImg(i-add:i+add,j-add:j+add);
        bgImg(i-add,j-add) = AvgWin(myWin);
    end
end

pImg = I + bgImg;
            
figure(1);
subplot(2,2,1);
imshow(I);
subplot(2,2,2);
imshow(newImg);
subplot(2,2,3);
imshow(bgImg);
subplot(2,2,4);
imshow(pImg);

function [M] = AvgWin(IN)
% 传入一个矩阵,求均值
avg = mean(mean(IN));
M = avg;
end

写在后面:这个算法的时间复杂度非常高,达O(mnp2),(其基本操作:求窗口均值,内部的时间复杂度为O(n^2)),因而不适合实际应用。
Note:另有积分图方法,只需遍历一次图片,时间复杂度仅为O(mn)。

2019-11-21 20:09:43 qq_41398808 阅读数 153
  • 机器学习之概率与统计推断

    本课程讲解机器学习算法所需概率和统计推断知识。概率部分包括概率公理及推论、条件概率、贝叶斯公式、随机变量及其概率函数(CDF/pdf)、常用概率分布及其均值、方差;统计推断部分包括大数定律和中心极限定理、极大似然估计、贝叶斯估计,估计的评价、偏差-方差平衡。课程还会讲解假设检验的基本概念。

    20297 人正在学习 去看看 AI100讲师

均值滤波器中,模板内像素的权重都为一,其只是简单的像素加法平均

而,加权均值滤波器,对模板中的像素点赋予不同的权重,求的是像素的加权平均,典型的模板,例如高斯模糊,其模板权重呈现钟型的高斯分布:

                                                                                          \begin{bmatrix} 1 & 2 & 1\\ 2& 4 & 2\\ 1&2 &1 \end{bmatrix}

下面使用上式表示的模板,实现:

图像数据 :

导入,要使用的库:

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

 读取图像数据并可视化:

img = Image.open('Fig0333(a)(test_pattern_blurring_orig).tif')
plt.axis('off')
plt.imshow(img, cmap = 'gray')
plt.show()

滤波过程:

定义滤波模板:

kernel = [[1,2,1], [2,4,2], [1,2,1]]

 滤波函数:

def rejector2(img, m, n, kernel):
    num_sum = [sum(i) for i in kernel]
    num_sum = sum(num_sum)
    img_data = np.array(img)
    img_new = [[] for _ in range(np.shape(img_data)[0])]
    a = m // 2
    b = n // 2
    for i in range(np.shape(img_data)[0]):
        for j in range(np.shape(img_data)[1]):
            num = 0
            x = 0
            for k in range(i-a, i+a+1, 1):
                y = 0
                for l in range(j-b, j+b+1, 1):
                    c = k>=0 and k<np.shape(img_data)[0]
                    d = l>=0 and l<np.shape(img_data)[1]
                    #依然使用0填充
                    if c and d:
                        #计算模板中像素的加权之和
                        num += img_data[k][l] * kernel[x][y]
                    y += 1
                x += 1
            #求平均值
            num = num / num_sum
            img_new[i].append(int(num))
    return img_new

 测试结果,可视化:

img_new = rejector2(img, len(kernel), len(kernel[0]), kernel)

plt.figure(figsize=(25,25))
plt.subplot(131)
plt.axis('off')
plt.imshow(img_new, cmap = 'gray')

plt.subplot(132)
plt.axis('off')
plt.imshow(new_img[0], cmap = 'gray')

plt.subplot(133)
plt.axis('off')
plt.imshow(img, cmap = 'gray')
plt.show()

 左侧为加权均值滤波,中间为平滑线性滤波,右侧为原图像

2019-08-14 21:35:48 EngineerHe 阅读数 330
  • 机器学习之概率与统计推断

    本课程讲解机器学习算法所需概率和统计推断知识。概率部分包括概率公理及推论、条件概率、贝叶斯公式、随机变量及其概率函数(CDF/pdf)、常用概率分布及其均值、方差;统计推断部分包括大数定律和中心极限定理、极大似然估计、贝叶斯估计,估计的评价、偏差-方差平衡。课程还会讲解假设检验的基本概念。

    20297 人正在学习 去看看 AI100讲师

图像处理常见滤波器–均值滤波、方框滤波、高斯滤波(上)

滤波,是用来将信号中特定波段频率踢出的操作,而用在图像的处理之中,则便是将图像之中的像素点进行一系列的基本运算的结果,用来提取,或者说是展现隐藏在图像之中的数学信息的手段。

什么是线性滤波?

一个二维的滤波器矩阵(或者叫卷积核),一个需要处理的二维图像,对于二维图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值,就这样,完成了一次滤波过程。

滤波器的数学表达形式:

M×NM \times N 的图像 ff 上,使用 m×nm \times n 的滤波器
g(x,y)=s=aat=bbw(s,t)f(x+s,y+t) {\rm{g}}(x,y) = \sum\limits_{s = - a}^a {\sum\limits_{t = - b}^b {w(s,t)f(x + s,y + t)} }
其中,m=2a+1m=2a+1n=2b+1n=2b+1w(s,t)w(s,t) 是滤波器系数,f(x,y)f(x,y) 是图像值;

空间滤波器也可以写成简化的形式:
R=w1z1+w1z1+...+wmnzmn=i=1mnwizi R = w_1z_1 + w_1z_1 + ... + w_{mn}z_{mn} = \sum\limits_{i = 1}^{mn} w_iz_i
其中,ww 是滤波器系统,zz 是与该系数对应图像灰度值,mnmn 为滤波器中包含的像素点总数

均值滤波

均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。均值滤波其实就是对目标像素及周边像素取平均值后再填会目标像素来实现滤波目的的方法。

不足之处:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

均值滤波的权重系数模板:
K=1Kw×Kh[111111111] K = \frac{1}{{{K_w} \times {K_h}}}\left[ {\begin{array}{ccc} 1&1& \cdots &1\\ 1&1& \cdots &1\\ \vdots & \vdots & \vdots & \vdots \\ 1&1& \cdots &1 \end{array}} \right]
因为模板的权值都是1,所以整个图像的滤波也可以表示成下面式子的样子:
g(x,y)=1Mf(x,y)(x,y)N g(x,y) = \frac{1}{M}\sum {{\rm{f}}(x,y)\begin{array}{ccc} {}&{(x,y) \in N} \end{array}}
式子中g(x,y)g(x,y)为均值滤波后的图像,f(x,y)f(x,y)为原始图像,MM为模板中包括当前像素在内的像素个数,NN 为模板领域像素点集合。下图也更好的解释了滤波的过程(其实就是卷积),即 40+107+5+198+226+223+37+68+1939\frac {40+107+5+198+226+223+37+68+193}{9}

在这里插入图片描述

话不多说,用代码实现以下,这个在opencv里面有相应的库函数,直接调用就可以了,但是为了更好的理解什么事平滑滤波,这里先使用自己写的代码实现以下,然后和opencv里的库函数做对比,以验证实现的是否正确。

代码

# -*- coding: utf-8 -*-
"""
Created on Wed Aug 14 11:05:54 2019

@author: shengzhanhe
@e-mail: shengzhanhe@gmail.com
"""

import cv2
import numpy as np

def mean_filter(img_path, kernel_size):
    k_w, k_h = kernel_size
    img = cv2.imread(img_path)
    img_w, img_h, channel = img.shape
    
    # 这里为了可以提取到边框的信息,并且保持和原图大小想到,采用边界补零的操作
    res_b = np.zeros([img_w+k_w-1, img_h+k_h-1])
    res_g = np.zeros([img_w+k_w-1, img_h+k_h-1])
    res_r = np.zeros([img_w+k_w-1, img_h+k_h-1])
    # 把图像中每一个通道分离出来,放在相应的地方
    res_b[(k_w-1)//2:(1-k_w)//2, (k_h-1)//2:(1-k_h)//2] = cv2.split(img)[0]
    res_g[(k_w-1)//2:(1-k_w)//2, (k_h-1)//2:(1-k_h)//2] = cv2.split(img)[1]
    res_r[(k_w-1)//2:(1-k_w)//2, (k_h-1)//2:(1-k_h)//2] = cv2.split(img)[2]
    
    # 对每一个通道滤波
    b = fileter(res_b, kernel_size)
    g = fileter(res_g, kernel_size)
    r = fileter(res_r, kernel_size)
    
    # 通道融合
    res_img = cv2.merge([b, g, r])
    
    return res_img
    
    
def fileter(img_mat, kernel_size):
    k_w, k_h = kernel_size
    # 定义均值滤波器的权值
    kernel = np.ones([k_w, k_h])/(k_w*k_h)
    w, h = img_mat.shape
    
    fileter_res = np.zeros([w-k_w+1, h-k_h+1])
    
    # 对图像中的每一个像素值进行滤波
    for i in range(h-k_h):
        for j in range(w-k_w):
            pix = np.sum(img_mat[j:j+k_w,i:i+k_h]*kernel)
            fileter_res[j,i] = int(pix)
    return  fileter_res.astype(np.uint8)
            

# opencv实现均值滤波
def opencv_blur(img_path):
    img = cv2.imread(img_path)
    result = cv2.blur(img, (3, 3))
    
    return result
    
if __name__ == "__main__":
    path = './lenaNoise.png'
    image = cv2.imread(path)

    # 手动实现,使用3*3的卷积核
    my_img = mean_filter(path, (3,3))
    # 使用opencv里的库函数
    opencv_img = opencv_blur(path)
    cv2.imshow("original", image)
    cv2.imshow('my_img', my_img)
    cv2.imshow('opencv', opencv_img)
    cv2.imwrite('my_img.png', my_img)
    cv2.imwrite('opencv.png', opencv_img)
    cv2.waitKey(0)

3 * 3滤波器的效果
在这里插入图片描述

5 * 5滤波器的效果
在这里插入图片描述
7 * 7滤波器
在这里插入图片描述
可以看出自己实现的结果和opencv库函数是一样的,从滤波器的大小上也可以得出,滤波器(卷积核)越大,图像越平滑,但也显得更模糊。

方框滤波

方框滤波和均值滤波核基本上是一致的,主要的区别是要不要归一化处理,如果使用归一化处理,方框滤波就是均值滤波。

方框滤波的权重系数模板
K=1α[111111111],α={1Kw×Kh,normalize=true1,normalize=false K = \frac{1}{\alpha }\left[ {\begin{array}{ccc} 1&1& \cdots &1\\ 1&1& \cdots &1\\ \vdots & \vdots & \vdots & \vdots \\ 1&1& \cdots &1 \end{array}} \right],\begin{array}{ccc} {}&{\alpha = \left\{ {\begin{array}{ccc} {\frac{1}{{{K_w} \times {K_h}}},\begin{array}{ccc} {}&{normalize = true} \end{array}}\\ {1,\begin{array}{ccc} {\begin{array}{ccc} {\begin{array}{ccc} {}&{} \end{array}}&{} \end{array}}&{normalize = false} \end{array}} \end{array}} \right.} \end{array}
可以看出让方框滤波不采用归一化的时候,使用卷积核操作很容易使得像素值溢出,即对应的像素值为255。

这里就直接使用opencv里面的库函数,然后要是自己需要写代码的话,把上面的代码里添加一个α\alpha的判定条件就可以啦

代码如下

# -*- coding: utf-8 -*-
"""
Created on Wed Aug 14 11:05:54 2019

@author: shengzhanhe
@e-mail: shengzhanhe@gmail.com
"""

import cv2

# 方框滤波进行归一化处理就和均值滤波一样
image = cv2.imread('./lenaNoise.png')
# -1表示与原始图像深度一致
# 归一化处理
res1 = cv2.boxFilter(image, -1, (5,5), normalize=1)
# 不进行归一化处理
res2 = cv2.boxFilter(image, -1, (5,5), normalize=0)
res3 = cv2.boxFilter(image, -1, (3,3), normalize=0)

cv2.imshow('res1', res1)
cv2.imshow('res2', res2)
cv2.imshow('res3', res3)

cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
从图上可以看出来,做了归一化处理的方框滤波就是均值滤波,然后没有做归一化处理的,图上好多都变成了白色,特别是 5×55 \times 5 大小的卷积核,基本上都是白的,最右侧是 3×33 \times 3 的卷积核的效果。

高斯滤波

高斯滤波是一种线性滤波。就是对整幅图像进行加权平均的过程,每个像素点的值都由其本身和邻域内的其它像素值经过加权平均后得到。它是图像平滑的一种重要的方式,能有效地消除和抑制噪声,达到图像平滑的效果。同时,相比于平均模板而言,效果更加自然。更加自然的意思,实际上说相对于就是适当地降低平滑后的模糊程度。

一维高斯函数
g(x)=1σ2πe(xμ)22σ2 {\rm{g}}(x) = \frac{1}{{\sigma \sqrt {2\pi } }}{e^{\frac{{ - {{(x - \mu )}^2}}}{{2{\sigma ^2}}}}}
二维高斯函数
g(x,y)=1σ2πe(xμ)2+(yv)22σ2 {\rm{g}}(x,y) = \frac{1}{{\sigma \sqrt {2\pi } }}{e^{ - \frac{{{{(x - \mu )}^2} + {{(y - v)}^2}}}{{2{\sigma ^2}}}}}
这里把 μ=0,v=0,σ=0.5\mu=0, v=0, \sigma = 0.5,画出高斯函数的一维和二维图像
在这里插入图片描述

有了公式以后高斯滤波器的核要怎么计算呢?一般是以核的中心为原点建立坐标系,在图像计算中,以中心坐标为基准,所以$\mu=0, v=0 $; 以一个3*3的滤波核为例,分三步:1.画出坐标模板,2.计算每一个位置的值,3.归一化,然后以 σ=1.5\sigma = 1.5 为例

在这里插入图片描述
上图操作中,归一化的目的是让权重的和等于1,如果大于1的话,滤镜会使得图像偏亮,小于1的话会使得图像偏暗。还有这样解释的12归一化之后,通过卷积计算出来的模板中心像素被限制到了0-255的灰度区间中。假若某一邻域内所有像素的灰度值为255,利用该模板进行卷积之后,求得的模板中心像素灰度值仍然为255;假若计算出来的高斯模板参数之和小于1,那么通过该模板进行卷积之后,模板中心像素的灰度值将小于255,偏离了实际的灰度值,产生了误差。

如果对精度没有要求的话,常用的 σ=1\sigma=1 的模板有下面两个

在这里插入图片描述
对于上述模板,你如果更加上述的公式计算的话,可能会发现有所偏差,这里我搜到的一种解释是这样的12高斯模板实际上也就是模拟高斯函数的特征,具有对称性并且数值由中心向四周不断减小,这个模板刚好符合这样的特性,并且非常简单,容易被大家接受,于是就比较经典!

下面是具体代码的实现,包括使用自己手动实现,和opencv库函数(库函数就一句话,很简单),实现的过程中,主要是当 σ<=0\sigma<=0 的情况,这里我参考的opencv库函数的处理方法,公式如下:
σ=(σ21)×0.3+0.8 \sigma {\rm{ = (}}\frac{\sigma }{2}{\rm{ - }}1) \times 0.3 + 0.8
代码

# -*- coding: utf-8 -*-
"""
Created on Wed Aug 14 11:05:54 2019

@author: shengzhanhe
@e-mail: shengzhanhe@gmail.com
"""

import math
import numpy as np
import cv2

def gauss_func(x, y, sigma=0):
    res = 0
    # 高斯函数
    res = 1.0/(2*math.pi*sigma**2)*math.exp(-(x**2+y**2)/(2*sigma**2))
    
    return res

def create_gauss_kernel(kernel_size, sigma):
    w,h = kernel_size
    center_x, center_y = w//2, h//2
    
    # sigma是否是正数,不是正数的话,需要单独处理
    if sigma > 0:
        sigma = sigma
    else:
        sigma = 0.3*((w-1)*0.5-1) + 0.8
    
    # 计算高斯核中的每一个权值
    kernel = np.zeros((w,h))
    for i in range(h):
        for j in range(w):
            x = j - center_x
            y = center_y - i
            kernel[i, j] = gauss_func(x, y, sigma)
    # normalize
    kernel = kernel/np.sum(kernel)
    
    return kernel

def fileter(img_mat, kernel_size, sigma):
    k_w, k_h = kernel_size
    # 高斯滤波器
    kernel = create_gauss_kernel(kernel_size, sigma)
    w, h = img_mat.shape
    
    fileter_res = np.zeros([w-k_w+1, h-k_h+1])
    
    # 对图像中的每一个像素值进行滤波
    for i in range(h-k_h):
        for j in range(w-k_w):
            pix = np.sum(img_mat[j:j+k_w,i:i+k_h]*kernel)
            fileter_res[j,i] = int(pix)
    return  fileter_res.astype(np.uint8)

def gauss_filter(img_path, kernel_size, sigma):
    k_w, k_h = kernel_size
    img = cv2.imread(img_path)
    img_w, img_h, channel = img.shape
    
    # 这里为了可以提取到边框的信息,并且保持和原图大小想到,采用边界补零的操作
    res_b = np.zeros([img_w+k_w-1, img_h+k_h-1])
    res_g = np.zeros([img_w+k_w-1, img_h+k_h-1])
    res_r = np.zeros([img_w+k_w-1, img_h+k_h-1])
    # 把图像中每一个通道分离出来,放在相应的地方
    res_b[(k_w-1)//2:(1-k_w)//2, (k_h-1)//2:(1-k_h)//2] = cv2.split(img)[0]
    res_g[(k_w-1)//2:(1-k_w)//2, (k_h-1)//2:(1-k_h)//2] = cv2.split(img)[1]
    res_r[(k_w-1)//2:(1-k_w)//2, (k_h-1)//2:(1-k_h)//2] = cv2.split(img)[2]
    
    # 对每一个通道滤波
    b = fileter(res_b, kernel_size, sigma)
    g = fileter(res_g, kernel_size, sigma)
    r = fileter(res_r, kernel_size, sigma)
    
    # 通道融合
    res_img = cv2.merge([b, g, r])
    
    return res_img
    

if __name__ == '__main__':
    
    path = './lenaNoise.png'
    image = cv2.imread(path)
    # 调用opencv库函数
    opencv_img = cv2.GaussianBlur(image, (3,3), 0)
    # 手动实现高斯滤波
    my_img = gauss_filter(path, (3,3), 0)
    
    cv2.imshow("original", image)
    cv2.imshow('my_img', my_img)
    cv2.imshow('opencv_img', opencv_img)
    cv2.imwrite('opencv_gauss3.png', opencv_img)
    cv2.imwrite('gauss3.png', my_img)
    cv2.waitKey(0)

3 * 3 滤波器
在这里插入图片描述

5 * 5 滤波器
在这里插入图片描述
7 * 7的滤波器

在这里插入图片描述
从图上可以看出,高斯滤波不同卷积核去燥的效果不一样,卷积核越大图像越模糊,但是相对相对于均值滤波而言,高斯滤波去燥的同时,也尽可能的保存了边缘信息(可以理解为模糊程度没有那么大,但是也达到了去噪的效果)!

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述


  1. https://blog.csdn.net/lz0499/article/details/54015150 ↩︎ ↩︎

  2. https://lps-683.iteye.com/blog/2251180 ↩︎ ↩︎

2014-09-21 10:49:03 u011620352 阅读数 1065
  • 机器学习之概率与统计推断

    本课程讲解机器学习算法所需概率和统计推断知识。概率部分包括概率公理及推论、条件概率、贝叶斯公式、随机变量及其概率函数(CDF/pdf)、常用概率分布及其均值、方差;统计推断部分包括大数定律和中心极限定理、极大似然估计、贝叶斯估计,估计的评价、偏差-方差平衡。课程还会讲解假设检验的基本概念。

    20297 人正在学习 去看看 AI100讲师

均值滤波器的常见应用是平滑处理降低噪声,但是由于图像希望保留的边缘也是由图像灰度尖锐变化带来的特性,

均值滤波器会模糊边缘,所以平滑的效果有一定的缺陷。


均值滤波的主要应用:去除图像中的不相关细节,其中“不相关”是指与滤波器模板尺寸相比较小的像素区域,从而

对图像有一个整体的认知。即为了对感兴趣的物体得到一个大致的整体的描述而模糊一幅图像,忽略细小的细节。


忽略细节从整体上认识图像的例子:冈萨雷斯图像处理(3rd)P96. 图3.3.4.

1. 原图像:



2. 用9*9的模板进行均值滤波后的图像:


分析:经过均值滤波之后,图像中较小的像素区域与较大的像素区域合并到一起,边缘变得模糊。


3. 对2中的图像选取阈值并进行二值化后的图像:


分析:二值化后,可以明显的看出图像的整体效果,从整体上认知整个图像的效果。

没有更多推荐了,返回首页