2015-01-13 16:17:36 iverain 阅读数 7624
  • OpenCV图像分割实战视频教程

    基于OpenCV新版本3.2 讲述,详细解释了KMeans、高斯混合模型(GMM)、分水岭变换、Grabcut等算法基本原理与在图像分割中的应用,基于OpenCV相关API演示每种图像分割方法,通过证件照背景融合替换与视频背景融合替换两个真实案例,讲述了图像分割在实际应用场景中的实现与演示。

    2623 人正在学习 去看看 贾志刚

        高斯滤波器是空间滤波器的一种,学习高斯滤波器,需要空间滤波的知识作为先验知识(各种数字图像处理的书中都有介绍,冈萨雷斯的经典教材说的还是比较清楚的,建议看英文版,个人感觉比翻译过来的更容易理解)。


        高斯滤波器是一种平滑线性滤波器,使用高斯滤波器对图像进行滤波,其效果是降低图像灰度的“尖锐”变化,也就是使图像“模糊”了。高斯滤波对于抑制服从正态分布的噪声效果非常好,其代价是使图像变得“模糊”。当然,有时对图像进行平滑滤波的目的就是让图像变得模糊。


        高斯滤波的模板是用高斯公式计算出来的。下面是一维和二维高斯分布函数及其函数图像:


        一维高斯分布函数:                                     二维高斯分布函数:

                                         

        它们的图像分别为:                                                                      

    

        那么高斯滤波模板是怎么生成的呢?是通过二维高斯函数计算出来的。例如,我们假设一个高斯模板的长、宽均为5,方差为0.5,那么首先,我们要在模板上建立一个坐标系,其原点就是高斯模板的中心点,如下图:


        然后每个模板的坐标就可以确定了:

                    

        每个格子对应的坐标,就是二维高斯分布中的(x,y)坐标的值。现在,我们可以计算出高斯模板上每个坐标位置的系数了。例如:

        (-2,2)上的权值:W = ,把pi = 3.14,  σ=0.5,x=-2,y=2带入上式,获得(-2,2)处的权值。

       同理,可以计算 其他位置的权值。

        最后获得一个5*5,标准差σ为0.5的高斯滤波器(经过归一化以后):

        

        matlab中可以使用fspecial函数实现高斯滤波模板,使用方法为:YourFilter = fspecial('gaussian', [ 5 5], 0.5);

        在matlab中可以查看fspecial的源代码,通过open fspecial打开。我之前自己写了一个matlab版的实现高斯模板的代码,通过与fspecial的源代码对比,有些不一样的地方,而且我的代码确实不如自带的快,所以在这里只贴源代码。

        fspecial函数可以实现多种类型的滤波器,当第一个参数为"gaussian'时,实现的是高斯滤波器,源代码通过switch判断用户想得到哪种类型的滤波器,这里只把与高斯滤波器有关的代码贴出来,并放在一个函数中,我们把这个函数命名为gaussianFilter。函数的代码如下:

        

function h = gaussianTemplate2( p2, p3 )
%p2是模板的大小,以[m n]的形式定义
%p3是标准差,即σ
%h是输出的高斯模板
%以下代码是从fspecial中贴出来的代码

    siz   = (p2-1)/2;           %siz为模板行与列各自最大的坐标值
    std   = p3;                 %标准差幅值给std

    %通过meshgrid产生模板上所有位置的x和y的值,这样的好处是可以避免使用循环去
    %变换坐标值,提高程序运行的速度
    [x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));
    
    %二维高斯分布公式中e的指数
    arg   = -(x.*x + y.*y)/(2*std*std);

    %这里没有乘以1/2*pi*σ^2,也就是没有乘以e前面的系数,因为后面在作归一化的
    %时候,会把这个系数约去,所以在这里直接省去乘法运算,提高程序运行速度
    h     = exp(arg);
    
    %这句话没有太理解,貌似只有在max(h(:))大于1的时候h才有可能小于eps*max(h(:))
    %个人理解应该是限制一下h中的权值,如果权值相对于h中的最大值特别小的话,可以
    %忽略不计,使之为零
    h(h<eps*max(h(:))) = 0; 

    %归一化
    sumh = sum(h(:));
    if sumh ~= 0,
        h  = h/sumh;
    end;
end
        获得高斯模板后,使用imfilter函数对图像进行滤波,即可获得高斯滤波效果。下面我们使用不同的高斯滤波器,对同一幅图像进行滤波,滤波的结果如下所示:

    

                            原始图像                                                           加入高斯噪声图像

    

         使用5*5,方差为0.5的高斯滤波器滤波                             使用5*5,方差为1.5的高斯滤波器滤波


     使用11*11,方差为0.5的高斯滤波器滤波

2019-11-24 19:09:37 qq_43309286 阅读数 30
  • OpenCV图像分割实战视频教程

    基于OpenCV新版本3.2 讲述,详细解释了KMeans、高斯混合模型(GMM)、分水岭变换、Grabcut等算法基本原理与在图像分割中的应用,基于OpenCV相关API演示每种图像分割方法,通过证件照背景融合替换与视频背景融合替换两个真实案例,讲述了图像分割在实际应用场景中的实现与演示。

    2623 人正在学习 去看看 贾志刚

数字图像处理——高斯滤波器【像素级别处理】(python)

简介

高斯滤波通常用它来减少图像噪声以及降低细节层次。这种模糊技术生成的图像,其视觉效果就像是经过一个半透明屏幕在观察图像,这与镜头焦外成像效果散景以及普通照明阴影中的效果都明显不同。高斯平滑也用于计算机视觉算法中的预先处理阶段,以增强图像在不同比例大小下的图像效果.从数学的角度来看,图像的高斯模糊过程就是图像与正态分布做卷积。由于正态分布又叫作“高斯分布”,所以这项技术就叫作高斯模糊。图像与圆形方框模糊做卷积将会生成更加精确的焦外成像效果。由于高斯函数的傅立叶变换是另外一个高斯函数,所以高斯模糊对于图像来说就是一个低通滤波器。

代码实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('Fig0340.tif')  # 测试图片
H = img.shape[0]
W = img.shape[1]

#   产生5*5的Gaussian smoothing filter
# Σ=3,h(x,y)=e^((x^2+y^2)/(2*Σ*Σ))
h = np.zeros((5, 5))  # 高斯模板

for i in range(5):
    for j in range(5):
        x = i - 2
        y = j - 2
        h[i, j] = np.power(np.e, -(x * x + y * y) / 18)

h /= np.sum(h)  # 归一化处理
spanImg = np.zeros((H + 4, W + 4, 3), np.uint8)  # 5*5扩充后的图像

for i in range(H):
    for j in range(W):
        spanImg[i + 2, j + 2] = img[i, j]

blurImg = np.zeros((H, W, 3), np.uint8)  # 高斯模糊化之后的图像
for i in range(H):
    for j in range(W):
        pix = 0
        for x in range(5):
            for y in range(5):
                pix += h[x, y] * spanImg[i + x, j + y, 0]
        blurImg[i, j, 0] = round(pix)
        blurImg[i, j, 1] = blurImg[i, j, 0]
        blurImg[i, j, 2] = blurImg[i, j, 0]

plt.subplot(1, 2, 1)
plt.title('original image')
plt.imshow(img)
plt.axis('off')

plt.subplot(1, 2, 2)
plt.title('blur image')
plt.imshow(blurImg)
plt.axis('off')
plt.show()

在这里插入图片描述

2018-01-23 11:27:10 JNingWei 阅读数 367
  • OpenCV图像分割实战视频教程

    基于OpenCV新版本3.2 讲述,详细解释了KMeans、高斯混合模型(GMM)、分水岭变换、Grabcut等算法基本原理与在图像分割中的应用,基于OpenCV相关API演示每种图像分割方法,通过证件照背景融合替换与视频背景融合替换两个真实案例,讲述了图像分割在实际应用场景中的实现与演示。

    2623 人正在学习 去看看 贾志刚

Idea

opencv 中 有个实现 高斯滤波 的接口,如下:

cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

在做项目的过程中,我发现如果根据 像素点 相对整张图片 的位置 设计 不同的 滤波核大小(即参数 ksize),就可以灵活地对整张图片实现 动态 高斯滤波 了。

具体滤波核大小计算公式如下:

size = int(k1*x + k2*y + b) * 2 + 1

Note : 注意保证 输出结果 为 整型奇数,因为 参数 ksize接受 整型奇数输入。

由于我的图片大小是 600×424×3 ,所以我的 k1,k2,b 取值如下:

k1,k2,b=0,0.012,00.009,0,00.0053,0.0053,0;;.

Demo

原图像:
这里写图片描述

水平动态高斯滤波:
这里写图片描述

垂直动态高斯滤波:
这里写图片描述

Code

以下代码中,关于 “对角动态高斯滤波(diagonal gaussian)” 的代码段有问题,所以被我注释掉了。
因为不能对单元素单独进行高斯滤波,所以会报错。具体该怎么解决,我也一时没想到。

# coding=utf-8

import numpy as np
import cv2

def kernel_size(x, y, type):
    if type == "vertical":
        k1, k2, b = 0, 0.012, 0
    elif type == "horizontal":
        k1, k2, b = 0.009, 0, 0
    elif type == "diagonal":
        k1, k2, b = 0.0053, 0.0053, 0
    else:
        k1, k2, b = 0, 0, 11
    size = int(k1*x + k2*y + b) * 2 + 1
    return size

def range_limit(img):
    img *= (img>0)
    img = img * (img<=255) + 255 * (img>255)
    img = img.astype(np.uint8)
    return img

def dynamic_gaussian(img):
    h, w, c = np.shape(img)
    sigma = 2
    # gs_v: vertical gaussian, 垂直高斯
    # gs_h: horizontal gaussian, 水平高斯
    # gs_d: diagonal gaussian, 对角高斯
    gs_v, gs_h, gs_d = img.copy(), img.copy(), img.copy()
    for i in range(h):
        k_size = kernel_size(w, i, "vertical")
        gs_v[i, :, :] = cv2.GaussianBlur(gs_v[i, :, :], (k_size, k_size), sigma)
        print(i, k_size)
    for j in range(w):
        k_size = kernel_size(j, h, "horizontal")
        gs_h[:, j, :] = cv2.GaussianBlur(gs_h[:, j, :], (k_size, k_size), sigma)
        print(j, k_size)
    # # 报错:
    # for i in range(h):
    #     for j in range(w):
    #         k_size = kernel_size(i, j, "diagonal")
    #         gs_d[i, j, :] = cv2.GaussianBlur(gs_d[i, j, :], (k_size, k_size), sigma)
    #         print(i, j, k_size)
    return gs_v, gs_h, gs_d


def main():
    img_path = "./girl.jpg"
    img = cv2.imread(img_path)
    gs_v, gs_h, gs_d = dynamic_gaussian(img)
    cv2.imwrite("./gs_v.jpg", gs_v)
    cv2.imwrite("./gs_h.jpg", gs_h)
    cv2.imwrite("./gs_d.jpg", gs_d)

if __name__ == "__main__":
    main()
2018-11-13 13:44:59 weixin_42499236 阅读数 1865
  • OpenCV图像分割实战视频教程

    基于OpenCV新版本3.2 讲述,详细解释了KMeans、高斯混合模型(GMM)、分水岭变换、Grabcut等算法基本原理与在图像分割中的应用,基于OpenCV相关API演示每种图像分割方法,通过证件照背景融合替换与视频背景融合替换两个真实案例,讲述了图像分割在实际应用场景中的实现与演示。

    2623 人正在学习 去看看 贾志刚

Python先生,你好!(5)——使用高斯滤波器提取图像特征

(一)前 言

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

(二)高斯滤波器的python实现

这里我们要用到图像处理库OpenCV

import cv2

img = cv2.imread("输入要处理的图像",0)
blurred = cv2.GaussianBlur(img,(11,11),0)
gaussImg = img - blurred
cv2.imshow("Img",gaussImg)
cv2.waitKey()
  • 处理前:
    在这里插入图片描述
  • 处理后:
    在这里插入图片描述

(三)总 结

通过高斯滤波器,我们能很快地提取图像的特征,便于我们建立更好的图像数据集,有任何的疑问请在评论区留言,我会尽快回复,谢谢支持!

2019-09-12 17:43:48 weixin_41887615 阅读数 81
  • OpenCV图像分割实战视频教程

    基于OpenCV新版本3.2 讲述,详细解释了KMeans、高斯混合模型(GMM)、分水岭变换、Grabcut等算法基本原理与在图像分割中的应用,基于OpenCV相关API演示每种图像分割方法,通过证件照背景融合替换与视频背景融合替换两个真实案例,讲述了图像分割在实际应用场景中的实现与演示。

    2623 人正在学习 去看看 贾志刚

高斯滤波器的模板算子生成

原理:

代码:

//生成高斯滤波函数
QVector<QVector<double>> generateGaussian(int size,double sigma)
{

    int i = 0, j = 0;
    double sum = 0.0;
    int center = size / 2; //中点坐标

    //创建高斯核函数
    QVector<double> col(size,0);
    QVector<QVector<double>> gaussian;
    for(i = 0; i<size; i++)
    {
        gaussian.push_back(col);
    }


    for(i = 0; i<size; i++)
    {
        for(j = 0; j<size; j++)
        {
           gaussian[i][j] = (1.0 / (2*PI*sigma*sigma))*exp(-((pow((i-center),2.0) + pow((j-center),2.0)) / (2*sigma*sigma)));
           sum += gaussian[i][j];
        }
    }

    //归一化
    for(i = 0; i<size; i++)
    {
        for(j = 0; j<size; j++)
        {
            gaussian[i][j] = gaussian[i][j] / sum;
            cout<<gaussian[i][j];
            cout<<" ";
        }
        cout<<endl<<endl;
    }

    return gaussian;
}

generateGaussian(3,1.8);

在这里插入图片描述

快速高斯滤波

阅读数 1070

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