图片的频率
首先说说图像频率的物理意义。图像可以看做是一个定义为二维平面上的信号,该信号的幅值对应于像素的灰度(对于彩色图像则是RGB三个分量),如果我们仅仅考虑图像上某一行像素,则可以将之视为一个定义在一维空间上信号,这个信号在形式上与传统的信号处理领域的时变信号是相似的。不过是一个是定义在空间域上的,而另一个是定义在时间域上的。所以图像的频率又称为空间频率,它反映了图像的像素灰度在空间中变化的情况。例如,一面墙壁的图像,由于灰度值分布平坦,其低频成分就较强,而高频成分较弱;而对于国际象棋棋盘或者沟壑纵横的卫星图片这类具有快速空间变化的图像来说,其高频成分会相对较强,低频则较弱(注意,是相对而言)。
基础知识
在数学中,傅里叶级数(Fourier series, /ˈfɔərieɪ/)是把类似波的函数表示成简单正弦波的方式。更正式地说,它能将任何周期函数或周期信号分解成一个(可能由无穷个元素组成的)简单振荡函数的集合,即正弦函数和余弦函数(或者,等价地使用复指数)。离散时间傅里叶变换是一个周期函数,通常用定义傅里叶级数的项进行定义。另一个应用的例子是Z变换,将傅里叶级数简化为特殊情形 |z|=1。傅里叶级数也是采样定理原始证明的核心。傅里叶级数的研究是傅里叶分析的一个分支。
I = imread('rice.png');
figure;
subplot(1, 2, 1);
imshow(I);
title('原图');
f = fft2(I);
f = fftshift(log(1+abs(f)));
subplot(1, 2, 2);
imshow(f, []);
title('频谱图');
频谱图
第一张图展示了频谱
- fft2() 函数得到的傅里叶变换是低频在四周的。为了获得更好的直观的感受,人们经常用fftshift() 调整结果以使得低频在中央。
- 频谱是复数,为了用二维图像展示频谱,就取了绝对值;
- 由于频谱的动态范围太大,而显示器的动态范围有限,所以用log变换降低频谱的动态范围。
- MATLAB的imshow函数,第二个输入变量是"[]"的时候,imshow会自动拉伸动态范围使得图像对比度提升。
看频谱一般看:
- 幅度谱。即第一张图的右图,观察图像的频率分布,哪里亮哪里暗。
- 相位谱。用得不多,一般在需要对比的时候会用到。
低通滤波
在图像边缘检测前的一步,用于过滤高频噪声,使得图像平滑。
- 全均值滤波器:卷积核上的值和为1
- 高斯模糊:既能模糊图像,又能保留边界。本质是使用一个带权的矩阵,中心点权重最大
在openCV中实现了高斯模糊的算法,如在python中
gray_blur = cv2.Gaussian(gray,(5,5),0)
高通滤波
用于边缘检测
边缘检测对图片对每个像素进行卷积,得到边缘。
边缘检测
- sobel算子
图像可以看作是取值在[0,255]的一个矩阵。
在连续函数中,我们使用导数来衡量自变量变化快慢。
而图像这种离散的量,我们使用差分来定义这种微分关系。#见博客
- canny边缘检测器:
- 首先使用高斯模糊来过滤噪声
- 使用sobel过滤器来确定边缘的强度和方向
- 使用非极大抑制来检测边缘的强度和方向选出局部最大像素从而把最强的边缘绘制成连续的,一个像素宽的细线
- 最后使用滞后阀值来分离最佳边缘,滞后阀值是双阀值化操作
双阀值化
双阀值化- hough变换:检测形状(直线,圆等)
cv2.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) → lines
- image:输入一个8bit的灰度图像
- lines:返回一个线的集合
- rho:double类型的rho,以像素为单位的距离精度。 另一种形容方式是直线搜索时的进步尺寸的单位半径。//即两条直线判断是一条所允许的误差像素
- theta:double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
- threshold:累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。 大于阈值 threshold 的线段才可以被检测通过并返回到结果中。
- minLineLength:有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
- maxLineGap:有默认值0,允许将同一行点与点之间连接起来的最大的距离。
物体识别
- Haar Cascades(Haar级联)
网友评论