OpenCV轻松入门读书笔记(七)

a.命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

一般有三种命名空间:

内置名称(built-in names),Python 语言内置的名称,比如函数名 abs、chr 和异常名称 BaseException、Exception 等等。

全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。

局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)

编辑

添加图片注释,不超过 140 字(可选)

Python 的查找顺序为:局部的命名空间 -> 全局命名空间 -> 内置命名空间

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

当内部作用域想修改外部作用域的变量时,就要用到 global 和 nonlocal 关键字了。

global 关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量。

num = 1
def function():
    global num  # 需要使用 global 关键字声明
    print(num) 
    num = 123
    print(num)
function()
print(num)

如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了。

nonlocal 关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量

def outer():
    num = 10
    def inner():
        nonlocal num # nonlocal关键字声明
        num = 100
        print(num)
    inner()
    print(num)
outer()

.b直方图

import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage import data

moon = data.moon()
print(moon.shape)
plt.hist(moon.ravel(), bins=256)
plt.show()
cv2.imshow("moon", moon)
cv2.waitKey()
cv2.destroyAllWindows()

编辑切换为居中

添加图片注释,不超过 140 字(可选)

什么是直方图呢? 通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值(0 到255),y 轴是图片中具有同一个灰度值的点的数目。直方图其实就是对图像的另一种解释。

#直方图均衡化
moon2=cv2.equalizeHist(moon)
plt.hist(moon2.reshape(-1), bins=256)
plt.show()

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

直方图均衡化的结果

均衡化的目的是:将图片的明暗对比增强

c.·使用 OpenCV 对图像进行傅里叶变换·使用Numpy中FFT(快速博里叶变换)函数

。傅里叶变换的一些用处

我们将要学习的函数有: cv2.dft(),cv2.idft() 等

傅里叶变化原理

傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变换(DFT)分析图像的频域特性。实现 DFT 的一个快速算法被称为快速傅里叶变换FFT)。关于傅里叶变换的细节知识可以在任意一本图像处理或信号处理的书中找到。请查看本小节中更多资源部分。对于一个正弦信号: x(t)= Asin(2nft),它的频率为 ,如果把这个信号转到它的频域表示,我们会在频率 f 中看到个峰值。如果我们的信号是由采样产生的离散信号好组成,我们会得到类似的频谱图,只不过前面是连续的,现在是离散。你可以把图像想象成沿着两个方向采集的信号。所以对图像同时进行 X 方向和 Y 方向的傅里叶变换,我们就会得到这幅图像的频域表示 (频谱图) 。更直观一点,对于一个正弦信号,如果它的幅度变化非常快,我们可以说他是高频信号,如果变化非常慢,我们称之为低频信号。你可以把这种想法应用到图像中,图像那里的幅度变化非常大呢? 边界点或者噪声。所以我们说边界和噪声是图像中的高频分量(注意这里的高频是指变化非常快,而非出现的次数多)。如果没有如此大的幅度变化我们称之为低频分量。

现在我们看看怎样进行傅里叶变换。

Numpy 中的傅里叶变换

首先我们看看如何使用 Numpy 进行傅里叶变换。Numpy 中的 FFT 包可以帮助我们实现快速傅里叶变换。函数np.fft.fft2()可以对信号进行频率转换,输出结果是一个复杂的数组。本函数的第一个参数是输入图做,要求是灰度格式。第二个参数是可选的,决定输出数组的大小。输出数组的大小和输入图像大小一样。如果输出结果比输入图像大,输入图像就需要在进行 FFT 前补0。如果输出结果比输入图像小的话,输入图像就会被切割。

现在我们得到了结果,频率为 0 的部分直流分量)在输出图像的左上角。如果想让它(直流分量)在输出图像的中心,我们还需要将结果沿两个方向平移

高通滤波:

就是把高通的波过滤掉;

d.定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个 * 号。在函数内部,参数 numbers 接收到的是一个 tuple

关键字参数有什么用?它可以扩展函数的功能。比如,在person函数里,我们保证能接收到name和age这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求

def print_avg(*score,**info):
    return ("name: %s, age: %d, avg: %.2f"%
    (info['student_name'],
    info['student_age'],
    sum(score)/len(score)))

图像阈值:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

e.保留字

-保留字是Pvthon已经被赋予特定意义的一些单词,在开发程序时不可以把这些保留字作为变量、函数、类、模块和其他对象的名称来使用

编辑切换为居中

添加图片注释,不超过 140 字(可选)

不能是数字。

f.图像的平滑处理

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

img1 = cv2.imread("50e5-iuvaazn5577948.jpg")
# 简单的均值滤波,就是一个平均卷积核
img2 = cv2.blur(img1, (3, 3))
cv2.imshow("img2", img2)
cv2.waitKey()
cv2.destroyAllWindows()

.比如

编辑切换为居中

添加图片注释,不超过 140 字(可选)

方框滤波:

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

img1 = cv2.imread("50e5-iuvaazn5577948.jpg")
# 方框滤波和均值滤波的区别就是有没有归一化,有没有取平均值
img2 = cv2.boxFilter(img1, -1, (3, 3), normalize=False)
cv2.imshow("img2", img2)
cv2.waitKey()
cv2.destroyAllWindows()

编辑切换为居中

添加图片注释,不超过 140 字(可选)

但是不取平均值的化,相加大于255,都会取255,显示为白色。

高斯滤波的思想:

跟我越近的数值,跟我关系越紧密,会更加重视。

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

img1 = cv2.imread("50e5-iuvaazn5577948.jpg")
# 高斯滤波,卷积核中的权重是符合高斯分布的,更加重视中间部分
img2 = cv2.GaussianBlur(img1, (5, 5), 1)
cv2.imshow("img2", img2)
cv2.waitKey()
cv2.destroyAllWindows()

编辑切换为居中

添加图片注释,不超过 140 字(可选)

中值滤波:把矩阵中的数组从小到大排列,取中间数

编辑切换为居中

添加图片注释,不超过 140 字(可选)

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

img1 = cv2.imread("50e5-iuvaazn5577948.jpg")
img2 = cv2.medianBlur(img1,5)
cv2.imshow("img2", img2)
cv2.waitKey()
cv2.destroyAllWindows()

.将所有结果展示

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

img1 = cv2.imread("50e5-iuvaazn5577948.jpg")
img2 = cv2.medianBlur(img1, 5)
img3 = cv2.GaussianBlur(img1, (3, 3), 1)
img4 = cv2.blur(img1, (3, 3))
rst = np.hstack((img1, img2, img3, img4))
cv2.imshow("rst", rst)
cv2.waitKey()
cv2.destroyAllWindows()

np.hstack,将所有结果一起展示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值