资讯专栏INFORMATION COLUMN

手动实现图像滤波

voyagelab / 989人阅读

摘要:文章目录图像滤波实验要求实现创建高斯滤波卷积核示例零填充示例代码结果图像滤波实验要求实现卷积基于实现函数完成用滤波器对灰度图像进行滤波,返回滤波后的图像,即要求滤波后的图像与原始输入图像具有相同的尺寸,滤波器每个维度的大小为奇数。

图像滤波

实验要求

实现卷积
基于Python实现函数完成用滤波器h对灰度图像img0进行滤波,返回
滤波后的图像img1,即

i m g 1 = m y I m a g e F i l t e r ( i m g 0 , h ) img1 = myImageFilter(img0, h) img1=myImageFilter(img0,h)

要求滤波后的图像img1与原始输入图像具有相同的尺寸,滤波器h每个维
度的大小为奇数(2k + 1, k = 1, 2, · · · )。在进行图像填充的时候可以使用
课堂上讲过的任何一种填充方式
均可。可以调用Python中NumPy的填充函
数,但不能调用任何包括convolve, correlate, fftconvolve等函数
(仅
可以使用他们来与你自己的实现结果进行对比)。函数的实现需采用矢量
,关于矢量化的例子可参考https://www.pythonlikeyoumeanit.com/
Module3_IntroducingNumpy/VectorizedOperations.html.

(提示:尽可能减少for循环的个数)

实现

分析步骤:

  1. 创建高斯滤波卷积核,并做归一化处理
  2. 获取图片的形状(高、宽、通道数)
  3. 图片零填充处理,得到图片副本
  4. 遍历图片副本所有像素点,将卷积核与图片副本的切片进行点乘求和运算,得到输出图片
  5. 输出图片切片,恢复原图形状

创建高斯滤波卷积核

高斯滤波器将中心像素周围的像素按照高斯分布加权平均进行平滑化。
按下面的高斯分布公式计算权值:
g ( x , y , σ ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 g(x,y,/sigma) = /frac{1}{2/pi/sigma^2}e^{-/frac{x^2+y^2}{2/sigma^2}} g(x,y,σ)=2πσ21e2σ2x2+y2
并对权值 g g g进行归一化操作。

标准差 σ /sigma σ=1.3的8−近邻高斯滤波器如下:
k = 1 16 [ 1 2 1 2 4 2 1 2 1 ] k = /frac{1}{16} /begin{bmatrix} 1 & 2 &1 // 2 & 4 & 2 // 1 & 2 & 1 // /end{bmatrix} k=161121242121

示例

def kernal_maker(k_size, sigma):    """    Create a Gaussian kernel    :param k_size:size of the Gaussian kernal    :param sigma:standard deviation    :return:Gaussian kernal    """    pad = k_size // 2    k = np.zeros((k_size, k_size), dtype=np.float)    for x in range(-pad, -pad + k_size):        for y in range(-pad, -pad + k_size):            k[y + pad, x + pad] = np.exp(-(x ** 2 + y ** 2) / (2 * (sigma ** 2)))    k /= (2 * np.pi * sigma * sigma)    k /= k.sum()    return k

零填充

由于图像的长宽可能不是滤波器大小的整数倍,因此我们需要在图像的边缘补0。

示例

    # Zero padding    k_size = k.shape[0]    pad = k_size // 2    out = np.zeros((h + pad * 2, w + pad * 2, c), dtype=np.float)    out[pad: pad + h, pad: pad + w] = img0.copy().astype(np.float)

代码

import numpy as npimport cv2 as cvdef myImageFilter(img0, k):    # YOUR CODE HERE    """    Fltering using a given kernel k    :param img0:image    :param k: kernal    :return:filtered image    """    if len(img0.shape) == 3:        h, w, c = img0.shape    else:        img0 = np.expand_dims(img0, axis=-1)        h, w, c = img0.shape    # Zero padding    k_size = k.shape[0]    pad = k_size // 2    out = np.zeros((h + pad * 2, w + pad * 2, c), dtype=np.float)    out[pad: pad + h, pad: pad + w] = img0.copy().astype(np.float)    # filtering    tmp = out.copy()    for y in range(h):        for x in range(w):            for i in range(c):                out[pad + y, pad + x, i] = np.sum(k * tmp[y: y + k_size, x: x + k_size, i])    out = np.clip(out, 0, 255)    out = out[pad: pad + h, pad: pad + w].astype(np.uint8)    return outdef kernal_maker(k_size, sigma):    """    Create a Gaussian kernel    :param k_size:size of the Gaussian kernal    :param sigma:standard deviation    :return:Gaussian kernal    """    pad = k_size // 2    k = np.zeros((k_size, k_size), dtype=np.float)    for x in range(-pad, -pad + k_size):        for y in range(-pad, -pad + k_size):            k[y + pad, x + pad] = np.exp(-(x ** 2 + y ** 2) / (2 * (sigma ** 2)))    k /= (2 * np.pi * sigma * sigma)    k /= k.sum()    return kif __name__ == "__main__":    # Read image    # image = cv.imread("../image/example.png")    image = cv.imread("../image/example_gray.png")    cv.imshow("input", image)    # Create Gaussian kernel    kernal = kernal_maker(k_size=3, sigma=1.3)    # Gaussian Filter    image_filtered = myImageFilter(img0=image, k=kernal)    # Save result    # cv.imwrite("out.jpg", image_processed)    cv.imshow("output", image_filtered)    cv.waitKey(0)    cv.destroyAllWindows()

结果

input

output

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122538.html

相关文章

  • 2021-09-23 opencv学习笔记(图像变换,二值化,滤波器介绍及python实现

    摘要:但是考虑一个双峰图像简单来说,双峰图像是一个直方图有两个峰值的图像。对于非双峰图像,二值化将不准确。在第三种情况下,我使用高斯核过滤图像以去除噪声,然后应用阈值。 ...

    CloudDeveloper 评论0 收藏0
  • 深度判别和共享特征学习的图像分类

    摘要:所学习的滤波器组被期望为编码一些合适数量类别的普通图像编码判别信息在不同视觉等级分层提取图案。特别是,在新框架的每一层,可共享的滤波器共同学习那些相似模式的类。除了减小特征维度,共享滤波器也可以导致特征更鲁棒。 今天我们来谈谈深度学习过程中的一些判别与共享关系。这也是一篇不错的paper(来自模式识别),并且通过实现和改进真的可以有一个较好的提升。在图像表示中,为了编码类的相关性和类的具体信...

    chanjarster 评论0 收藏0
  • H264 环路滤波

    摘要:如果参考帧的每个块之间就不连续的话,也会被复制到运动补偿的图像块内,采用的变换可以降低这种不连续的现象,但是我们还是需要一个去块滤波器来帮我们降低这种不连续现象,实现块与块之间的平滑过渡。 ...

    shuibo 评论0 收藏0
  • 图像增强——空间域滤波

    摘要:能够有效去除椒盐噪声黑白点叠加在图像上去除噪声的同时,比较好地保留边缘空间域锐化滤波器高通滤波器锐化处理的主要目的是为了突出图像的边缘信息,增强图像的轮廓特征,以便于人眼的观察和机器的识别。 ...

    Cheriselalala 评论0 收藏1
  • opencv python 图像平滑/2D卷积/图像平滑/平均值法/高斯模糊/中值模糊/双边滤波

    摘要:卷积与一维信号一样,图像也可以使用各种低通滤波器,高通滤波器等进行滤波有助于消除噪声,模糊图像等滤波器有助于找到边缘图片将内核与图像进行卷积应用对图像进行平均过滤。它只取内核区域下所有像素的平均值并替换中心元素。 Smoothing Images 1 2D卷积 与一维信号一样,图像也可以使用各种低通滤波器(LPF),高通滤波器(HPF)等进行滤波.LPF有助于消除噪声,模糊图像等.H...

    Little_XM 评论0 收藏0

发表评论

0条评论

voyagelab

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<