【Day21-滤波】图片也有频率?影像资料如何做滤波?

前一天我们讨论了图片的颜色,今天就来讨论一下图片的频率和一些简单的特徵处理技巧

图片也有频率?

在处理声音讯号的时候我们有用到傅立叶分析的方式来取得声音讯号的频率特徵,一维讯号随着时间而有不同频率的变化很好理解,不过图片又会有什麽频率呢?其实就是沿着横轴和纵轴分别去看其变化的频率。这部分我们可以一样用傅立叶的方式去做,也可以用滤波的方式去做

基本的图形处理

卷积核(kernel)

不同的卷积核,会因为对原始图片做卷积计算之後的不同结果而对应着不同的处理方方式

平滑化

对於一个需要平滑化的图形,我们可以采用一个平均总和为1且所有元素相同的卷积核,例如

np.ones((5,5))/25

kernel = np.ones((5,5))/25
img_after = cv2.filter2D(img_origin, -1, kernel)

高斯模糊

有的时候我们会需要将图片模糊化,那这又是怎麽做的呢?
其实可以把模糊化想像成每一个原本的像素点分别像是墨水一样扩散开来,中间虽然还是保留最多的资讯但也会有部分散到外面,且越远的成分就越小

高斯分布公式:

二维就是在两个方向上做一样的分布,所以中间会是最大的

那这边我们就需要构建一个二维的高斯分布kernel,跳过一点数学论证我们直接看它应该长怎样

import numpy as np
x, y = np.meshgrid(np.linspace(-1,1,7), np.linspace(-1,1,7)) # 建立二维
d = np.sqrt(x*x+y*y)
sigma, mu = 1.0, 0.0
kernel = np.exp(-( (d-mu)**2 / ( 2.0 * sigma**2 ) ) ) # 高斯分布公式
kernel /= sum(sum(kernel)) #让总和为1
plt.imshow(kernel)
plt.show()

# 来看看模糊化滤波的效果
img1_lpf = cv2.filter2D(img1, -1, kernel)
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.imshow(img1, "gray")
ax1.set_title("origin")
ax2.imshow(img1_lpf, "gray")
ax2.set_title("Low pass")
plt.show()

突显变化

既然可以让原本的图片透过变化不明显来达到模糊的目的,同样的我们也可以反过来将图片取出变化明显的地方,对於用来寻找边缘等目的一般蛮常用到类似的技巧的

# 用原始减去模糊当作新的kernel
kernel_high = np.zeros((7,7))
kernel_high[3][3] = 1
kernel_high -= kernel
img_hpf = cv2.filter2D(img1,-1,kernel_high)
plt.imshow(img_hpf,"gray")
plt.show()


<<:  【D22】修改食谱#2:根据市价,模拟选择权下单

>>:  每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day21

Day29 DOM 介绍

文件物件模型 (DOM) 文件物件模型(DOM)是HTML、XML 和 SVG 文件的程序介面。它提...

D14 - 用 Swift 和公开资讯,打造投资理财的 Apps { 加权指数K线图实作.2 }

制作 K 线的 Data Model,从前面文章 [加权指数K线图实作.2] 的 response ...

Day 15: GCP-Storage

Doc https://cloud.google.com/storage/docs/storage-...

Day16 - 完成爬虫功能

在完成基础的表单画面後,接着需要将之前完成的爬虫功能整合至网站。 考量功能的独立性、扩充性和使用便利...

DAY 15 - 哥布林 (2)

大家好~ 我是五岁~~ 今天让我们来把哥布林完成吧~~!!! 目标是把昨天的哥布林上色卡通化~~ 第...