2016-11-28 00:47:37 qq_24894159 阅读数 5053
  • Qt项目实战之网络电子白板

    本课程使用Qt技术实现了网络电子白板,支持直线、矩形、椭圆、三角形、涂鸦等图形元素。本课程实现的电子白板,可以在多人之间共享,每个人都可以进行任意绘制,每个人的绘制都可以同步显示在其它人的白板上。服务器端使用Qt Network开发,客户端使用Qt Network和Qt Graphics View Framework开发,数据传输使用JSON数据格式。

    11715 人正在学习 去看看 安晓辉

滤波这一概念可以结合数字信号处理这一领域中的滤波。而在数字图像处理中滤波可以分为空间域滤波和频率域滤波。这篇博文主要来学习下空间域滤波。

空间域滤波机理

  *空间滤波器由一个邻域(典型的是一个较小的矩形)构成,对该邻域所包围的像素按照一定的操作计算出目标像素的值,这一过程就是空间滤波器的工作机理*

例如:
假设有一个这样的3*3的滤波器(每个元素代表权值w)

T=111111111

用T对下图进行滤波,其覆盖的第一个方块为红色的方框,对应元素相乘后结果求和,然后再求平均值(除以9),得出圆圈的像素。(这就是后边实现的均值滤波器)

空间相关与卷积

这里只是简单提一下这两个概念。

相关:滤波器位移过图像并计算每个位置乘积之后的处理
卷积:和相关相似,只是滤波器要先旋转180°

线性滤波器和非线性滤波器

概念:线性滤波器是指对像素进行线性操作;否则则称为非线性滤波器。

你可能问,什么是线性操作呢?线性操作简单来说就是满足下面式子的操作:

f(x+y)=f(x)+f(y)f(ax)=af(x)

均值滤波器就是一个典型的线性滤波器。
中值滤波器是一个典型的非线性滤波器。

平滑线性滤波器

平滑线性滤波器的主要作用是模糊处理和降低噪声。例如在提取图像的最大目标时,需要先进行模糊处理来降低噪声。然后增强某一阈值之上的灰度,来突出”亮”的部分。

T1=111111111T2=121242121

以上T1为简单的均值滤波器,T2为带权值的均值滤波器。后者更为重要些。
说了这么多,我们来实现一个简单的均值滤波器。

function [Image] = fliter (img, type)
%初始化滤波器模板
f = ones(3,3);
[x,y] = size(img);
Image = zeros(x,y);
%注意由于我们是3*3的滤波器,对第一个像素img(1,1)滤波时,滤波器会有
%一部分在图像外部,所以我们要初始一个带着一圈0的壳的图像
temp = zeros(x+2,y+2);
%把中间的部分赋值原来的数值
temp(2:x+1,2:y+1) = img;
for i=2:x+1
  for j=2:y+1
    %计算均值
    Image(i-1,j-1) = mean(mean(f.*temp(i-1:i+1,j-1:j+1))');
  end;
end;
endfunction

统计排序(非线性)滤波器

由名字可知,这是基于数理统计的一种滤波器,采用的是非线性的计算。

中值滤波器

他是将邻域中的灰度值排序,然后取中值作为替换中心元素的灰度值。例如:3*3的中值滤波器,取排序后的第5个元素。

实现代码:

function [Image] = medianFliter (img)
[x,y] = size(img);
Image = zeros(x,y);
temp = zeros(x+2,y+2);
%同上面均值滤波的作用
temp(2:x+1,2:y+1) = img;
for i=1:x
  for j=1:y
    t = temp(i:i+2,j:j+2);
    %median为求中值函数,需要将t转化为一个列向量
    Image(i,j) = median(t(:));
  end;
end;

endfunction

在原图中增加了椒盐噪声,可以看到,中值滤波后椒盐噪声基本被去除。
从左到右依次为原图、均值滤波后、中值滤波后

锐化空间滤波器

锐化:即增强图像中的边缘部分。边缘部分一般为灰度激变的部分。有photoshop的可以去试一下带的锐化功能。

准备知识

我们学习过高等数学中的积分和微分,别方,我尽量解释的容易理解一点同时也尽量准确点(说实话,让我正确的解释积分和微分我估计也解释不清楚)。

积分我们可以简单的理解为求和

一次函数积分不就是就其与x轴所围面积的和吗?虽然有正负。那我们的均值滤波器可以思考下其实也是积分的原理,是离散的积分,计算出他们的乘积和,只不过最后又平均了一下。

微分我们可以简单的理解为求导

一阶微分(一阶求导):我们高中就知道函数的一阶导数显示了函数斜率。斜率决定了函数变化的快慢。
二阶微分(二阶求(偏)导):二阶求导就是在一阶的基础上继续求导。一阶导数也是一个函数的话,二阶求导可以理解为斜率变化的快慢。

通过下面这个图可以看出对于灰度激变图像,一阶和二阶的表现:
这里写图片描述
可以看出二阶对激变的时刻更加敏感。

知道来这些怎么对离散的灰度微分(求导)呢?

一阶微分:我们定义为两个像素之间的差值

fx=f(x+1)f(x)

二阶微分

2f2x=f(x+1)xf(x)x=f(x+1)+f(x1)2f(x)

下面我们就正式开始进行图像锐化

这里我们采用二阶微分进行锐化先

这里有一个概念各向同性滤波器。它就是旋转图片后滤波结果仍然相同,与图像的突变方向无关。最为简单的各向同性微分算子是拉普拉斯算子。一个二维图像函数f(x,y)的拉普拉斯算子定义为:

2f=2fx2+2fy2=f(x+1,y)+f(x1,y)2f(x,y)+f(x,y+1)+f(x,y1)2f(x,y)

我们可以定义为这样的模板
T3=010141010

T4=111181111

T5=010141010

T6=111181111

这样计算出一个图像的边界图像Temp,与原图像相加(相减),得到锐化的结果。(注意:边界图像中会有些部分小于0,我们要通过下面操作把他们置为0)

temp(temp<0) = 0;

最终表达式为:

g(x,y)=f(x,y)+c[2f(x,y)]

当采用上边T3T4模板时,c为-1,采用T5T6时,c=1;其中T4T6是包含对角变化

梯度的算子模板。
实现代码:

function [Image] = sharpen (img)
[x,y] = size(img);
Image = zeros(x,y);
temp = zeros(x+2,y+2);
temp(2:x+1,2:y+1) = img;
%这里我没有采用算子模板进行计算
for i=1:x
for j=1:y
   t = temp(i,j+1)+temp(i+2,j+1)+temp(i+1,j)+temp(i+1,j+2)-4*temp(i+1,j+1);
   Image(i,j) = t;
 end;
end;
Image(Image<0)=0;
figure;
imshow(uint8(Image));
Image = img.-Image;
endfunction

这里写图片描述
下面这张 c 错选为+号
这里写图片描述
这里写图片描述

非锐化掩蔽和高提升滤波

步骤:
1、模糊化原图。
2、原图减去模糊图像(差值称为模板)。
3、将模板加到原图。
f¯(x,y)表示模糊图像,

非锐化掩蔽公式

gmask(x,y)=f(x,y)f¯(x,y)

然后,在原图加上模板的权重部分:
g(x,y)=f(x,y)+kgmask(x,y)

当k= 1时,称为非锐化掩蔽,
当k> 1时,称为高提升滤波。

使用一阶微分对(非线性)图像锐化——梯度

这里可以参照这位博主的博文部分,
http://blog.csdn.net/ubunfans/article/details/42214925

Good Night!

2015-07-27 17:38:18 xuhang0910 阅读数 2363
  • Qt项目实战之网络电子白板

    本课程使用Qt技术实现了网络电子白板,支持直线、矩形、椭圆、三角形、涂鸦等图形元素。本课程实现的电子白板,可以在多人之间共享,每个人都可以进行任意绘制,每个人的绘制都可以同步显示在其它人的白板上。服务器端使用Qt Network开发,客户端使用Qt Network和Qt Graphics View Framework开发,数据传输使用JSON数据格式。

    11715 人正在学习 去看看 安晓辉

1.低通滤波器

低通滤波器的效果是降低图像变化的幅度,即对图像进行模糊或平滑,它将一个像素替换为相邻矩形内的像素和,并除以相邻像素的个数(以得到平均值)。

//使用低通滤波器
#include<opencv2\opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat src = imread("car.jpg");
	Mat dst;
	Mat dstG;
	cv::blur(src, dst, cv::Size(7, 7));//Size(7,7)表示的相邻像素的范围,数字越大越模糊。
	
	imshow("car", src);
	imshow("car2", dst);

	waitKey(50000);

	return 0;
}

输出结果如下,可看到对原图模糊了。



2.中值滤波器mediaBlur

中值滤波器是非线性的,对一个像素的相邻区域进行操作已确定输出像素的值。该像素及它的相邻区域组成一个数组,同时如名字所示,中值滤波器仅仅计算这组数的中值,并用中值替换当前的像素值。

中值滤波器在去除椒盐噪点方面有显著功效,因为噪点像素不会被选为中值(它或为极大值或为极小值),与之相反均值滤波器会大大受到噪点的影响,因为均值滤波器计算的是平均值,而噪点像素会使相邻像素的平均值发生变化。

同时,中值滤波器还有保留边缘锐利度的优点。然而,它会去除相同区域中的纹理(如背景中的树木)。


//中值滤波器medianBlur
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;

int main()
{
	Mat src = imread("salt.jpg");//读取椒盐噪点的图像
	Mat dst;

	cv::medianBlur(src, dst, 5);

	imshow("car2",dst);
	imshow("car", src);
	waitKey(20000);

	return 0;
}
结果如下,很清晰的看到椒盐噪点去除了


3.Sobel滤波



//使用Sobel滤波器
#include<opencv2\opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat src = imread("car.jpg");
	Mat sobelX;
	Mat sobelY;
	//对X方向求导,sobelX保留了垂直方向的信息,所以垂直的轮廓看起来更清楚
	cv::Sobel(src,sobelX, CV_8U, 1, 0, 3, 0.4, 128);
	//检测垂直方向的边缘
	cv::Sobel(src, sobelY, CV_8U, 0, 1, 3, 0.4, 128);

	imshow("car", src);
	imshow("sobelX", sobelX);
	imshow("sobelY", sobelY);

	waitKey(50000);

	return 0;
}

结果如下,类似浮雕



下面是水平和垂直合并的结果


//使用Sobel滤波器
#include<opencv2\opencv.hpp>
#include<iostream>
#include<opencv2\imgproc\imgproc.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat src = imread("car.jpg");
	Mat sobelX;
	Mat sobelY;
	Mat sobel;
	cv::Sobel(src,sobelX, CV_8U, 1, 0, 3, 0.4, 128);
	cv::Sobel(src, sobelY, CV_8U, 0, 1, 3, 0.4, 128);
	//合并结果
	sobel = abs(sobelX) + abs(sobelY);
	//搜索Sobel极大值
	double sobmin, sobmax;
	cv::minMaxLoc(sobel, &sobmin, &sobmax);
	//变换为8位图像
	Mat sobelImage;
	sobel.convertTo(sobelImage, CV_8U, -255. / sobmax, 255);
	//阈值化处理,得到二值图像
	Mat sobelThresholded;
	cv::threshold(sobelImage, sobelThresholded,70, 255, cv::THRESH_BINARY);

	imshow("car", sobelThresholded);
	waitKey(50000);

	return 0;
}
好像结果不太理想



2011-12-31 21:35:00 kanyun157 阅读数 22
  • Qt项目实战之网络电子白板

    本课程使用Qt技术实现了网络电子白板,支持直线、矩形、椭圆、三角形、涂鸦等图形元素。本课程实现的电子白板,可以在多人之间共享,每个人都可以进行任意绘制,每个人的绘制都可以同步显示在其它人的白板上。服务器端使用Qt Network开发,客户端使用Qt Network和Qt Graphics View Framework开发,数据传输使用JSON数据格式。

    11715 人正在学习 去看看 安晓辉
在图像处理中,经常要做矩形平滑滤波或其它操作,要用到模板运算。其中可能会遇到窗口的求和问题。

  对每个窗口都要求和,然后求均值,而且是对每个像素点进行遍历,当然是个费时的过程。一般的操作可能是这样的:

sum=0;
     for(i=0;i<w;i++)
     {
      for(j=0;j<w;j++)
      {
       sum+=Array[m+i][n+j];
      }
     }
     mean=sum/(w*w);


其中Array是图像的灰度矩阵,w是窗口的大小(w*w)。后来因为在特征提取的过程中用的时间太长了,于是思考如何减小这些特征提取的时间(在w比较大时)。窗口在滑动的过程中,只是改变了一部分数据,即前面出去了一列,后面进来了一列。如果保存原来的和,只加减这两部分,可以减小很多求加运算的循环。就改成了下面的代码:只在第一次求一个总和,后面就在前面的基础上求两列的和,再加减就行了。

for(m=0;m<m_Height;m++)
{
    for(n=0;n<m_Width;n++)
    {
     if(n==0)
     {
      sum=0;
      for(i=0;i<w;i++)
      {
          for(j=0;j<w;j++)
       {
           sum+=Array[m+i][n+j];
       }
      }
     }
     else
     {
      a=b=0;
      for(i=0;i<w;i++)
      {
       a+=Array[m+i][n+w-1];
       b+=Array[m+i][n-1];
      }
      sum=sum+a-b;
     }
     mean=sum/(w*w);

}

}

开始我还为自己的发现欣喜不已,后来无意之中看到有文献已经讨论了该问题,而且研究了更一般的情况。不过是哪篇文献,自己也记不清了。现在有如此多的研究工作者,有些非常的细节的问题都被研究到了。

2017-09-25 16:56:33 wang2012010865 阅读数 471
  • Qt项目实战之网络电子白板

    本课程使用Qt技术实现了网络电子白板,支持直线、矩形、椭圆、三角形、涂鸦等图形元素。本课程实现的电子白板,可以在多人之间共享,每个人都可以进行任意绘制,每个人的绘制都可以同步显示在其它人的白板上。服务器端使用Qt Network开发,客户端使用Qt Network和Qt Graphics View Framework开发,数据传输使用JSON数据格式。

    11715 人正在学习 去看看 安晓辉

空间滤波基础
空间滤波机理:空间滤波器是由一个邻域(最典型的是一个较小的矩形),对该邻域包围的图像像素执行的预定义操作组成。滤波会产生一个新的像素,新像素的坐标位于邻域的中心的坐标(默认情况),像素的值是滤波操作的结果。

如果在滤波器执行的是线性操作,则称该滤波器是线性空间滤波器。反之,称为非线性空间滤波器。

滤波器的尺寸一般为mxn,假设m = 2a+1,n = 2b + 1;其中a,b 为正整数。所以滤波模板的尺寸是奇数,3x3,5x5,7x7……

线性空间滤波一般表达式为:

这里写图片描述 (1-1)

空间相关与卷积
相关:相关是滤波器模板移过图像并计算每个位置的乘积之后的处理,卷积的机理类似,但是卷积的滤波器需要首先旋转180度。
这里写图片描述
这里写图片描述

如上图所示,即为一维情况下相关计算过程,模板为w ,原图像为左边图像。模板从左到右每次和原图像的每个位置对齐然后对应位置做乘法,然后计算加法。即为一次相关计算完成,当模板作用于图像边界时,应该给图像边界填充元素,一般可以填充为0。模板依次向右移动,完成相关计算。最后将相关的结果剪裁为和图像大小相同的阵列。
上面我们选择的函数是一个特殊函数,一般称为离散单位冲激。该函数的特点是:一个函数和离散单位冲激相关,在该冲激位置产生了这个函数的一个翻转版本。

卷积操作,和相关操作非常类似,卷积操作的一个特点是某个函数与某个单位冲激卷积,得到一个在该冲激处的这个函数的拷贝。因此,我们首先将模板旋转180度,然后做和相关操作一样的操作,就得到卷积操作。
这里写图片描述
这里写图片描述

上面的卷积操作,首先将滤波器(模板)旋转了180度,然后做和相关一样的操作,就称之为卷积操作。

上面探讨的是一维的情况,而图像都是二维的矩阵,因此我们将上面的一维扩展到二维矩阵的情况,
这里写图片描述
上图中从左到右分别是原始图像,滤波器,和扩充之后的图像。从图中可以看到,由于滤波器是3x3规模的,因此图像填充操作分别在上下左右各加2行(列)。
下面看二维相关操作:
这里写图片描述
上图中,滤波器先进行列扫描,在进行行扫描,最终得到相关操作结果。
下面来看卷积操作:
这里写图片描述
如上图,卷积操作先将滤波器旋转180度,沿着中心转180度。或者左右、上下先后对称操作。
相关操作的一般公式描述:
这里写图片描述 (1-2)
上式的操作,使得w中的每一个元素访问f中的每一个元素(两两见一次面,类似于多相式乘法)。
卷积操作的一般公式描述:
这里写图片描述(1-3)
卷积操作和相关操作的区别在于等式右边使用了“-”号,表示将模板旋转180度。
对于空间滤波的任务,相关和卷积是优先选择的滤波方法。重要的是对不同的任务选择合适卷积模板。

空间滤波器摸板的产生
产生一个m X n 的线性空间模板需要mn个系数。根据滤波目的的不同,可以使用不同的系数。例如平均滤波、高斯滤波。

平滑空间滤波器
平滑滤波用于模糊处理和降低噪声(去噪)模糊处理经常使用于预处理任务中,比如在目标识别中先进行模糊处理。
平滑线性滤波器是包含在滤波器模板邻域中的像素的简单平均值。称为均值滤波器。可以将其归类为低通滤波器。对于均值滤波器,其每个值都为1/mn,所有系数都相等的空间均值滤波器有时称为盒状滤波器。

除了上面所述的均值盒状滤波器,也可以利用“加权平均”的概念来产生滤波器,其思想在于,在滤波器对应的像素中,每个像素的重要程度时不同的(盒状滤波器中每个像素都同等重要)。
这里写图片描述
上图中都是3 x 3滤波器,其区别在于像素的权重不同,将b中权重和选择为16的好处在于,16是2的整数幂,计算机计算是方便的。
加权滤波的公式:
这里写图片描述 (1-4)
空间均值滤波器规模越大,对图像模糊的程度就越严重。实际中,需要根据图像中要检测的物体的尺寸确定模板的尺寸。

非线性(统计排序)滤波器
统计排序滤波器是一种非线性空间滤波器,这种滤波器的响应是以滤波器包围的图像区域中所包含的像素的排序(排队)为基础,然后使用统计排序结果决定的值代替中心像素的值。这一类滤波器中最有名的是中值滤波器,其思想是将像素邻域中所有像素的中值作为该点的像素值。中值滤波对处理脉冲噪声非常有用,这种噪声也称为椒盐噪声(Salt and peper noise),椒盐噪声是以黑色或者白色点的形式叠加在图像上。
除了均值滤波器,还可以选择其他统计排序量,比如最大值滤波器,最小值滤波器等。

锐化空间滤波器
锐化处理的目的在于突出灰度过渡的部分,锐化处理的思想是通过图像微分来实现。微分算子的响应强度和图像在用算子操作的这一点的突变程度成正比,图像微分增强边缘和噪声,削弱灰度变化缓慢的区域。

数字微分的特点
对于一阶微分定义的要求:
(1)在恒定灰度区域的微分值为零;(2)在灰度台阶或者斜坡处微分值非零;(3)沿着斜坡或者台阶的微分值非零。
对于二阶微分的定义的要求:
(1)在恒定区域微分值为零;(2)在灰度台阶或者斜坡起点处微分值为零;(3)沿着斜坡的微分值非零。
定义一阶微分:
这里写图片描述(1-5)
二阶微分:
这里写图片描述(1-6)

使用二阶微分对图像进行锐化—拉普拉斯算子
各向同性滤波器,这种滤波器与滤波器作用的图像的突变方向无关,各向同性滤波器是旋转不变的,将原图像旋转后进行滤波和先滤波后旋转图像结果相同。

拉普拉斯算子就是一种各向同性滤波算子,其定义为:
这里写图片描述 (1-7)
在x和y方向上可以将拉普拉斯算子写成:
这里写图片描述(1-8)
这里写图片描述(1-9)
合并之后有:
这里写图片描述 (1-10)

上图中即为采用不同的拉普拉斯算子的模板。

非锐化掩蔽和高提升滤波
非锐化掩蔽是从原图像中减去一幅非锐化(平滑过的)的,这个称为非锐化掩蔽的过程由下列步骤组成。
(1)模糊原图像。
(2)从原图像中减去模糊图像(产生的差值图像称为模板)。
(3)将模板加到原图像上。

这里写图片描述
用公式描述上述过程,使用
这里写图片描述 (1-11)
表示模糊之后的图像, 表示原图像,上式得到结果就称为模板。
这里写图片描述(1-12)
上式中,包含了一个权重系数(k>0),当k = 1时,得到非锐化掩蔽,当k>1时,得到高提升滤波。
这里写图片描述
上图中a是原始图像,b是平滑之后的图像,c是a-b得到的模板,d是a+c得到的最后结果。

一阶微分(非线性)图像锐化—-梯度
这里写图片描述 (1-12)
向量的长度表示为:
这里写图片描述 (1-13)
在实际中,用绝对值来代替上式:
这里写图片描述(1-14)
假设模板下面中心点的像素值为z5。早期的Roberts提出了两个定义使用交叉差分:
这里写图片描述(1-15)
分别利用1-13和1-14计算梯度图像:
这里写图片描述(1-16)
这里写图片描述(1-17)
这种计算方式称为罗伯特交叉梯度算子。
我们使用的最小模板是3x3算子,gx和gy的近似如下式所示。

>

这里写图片描述 (1-18)
这里写图片描述(1-19)
这里写图片描述(1-20)
(1-18)和(1-19)所代表的算子称为Sobel算子。其中模板所有系数和为零。

2018-12-17 17:30:45 HHH_ANS 阅读数 836
  • Qt项目实战之网络电子白板

    本课程使用Qt技术实现了网络电子白板,支持直线、矩形、椭圆、三角形、涂鸦等图形元素。本课程实现的电子白板,可以在多人之间共享,每个人都可以进行任意绘制,每个人的绘制都可以同步显示在其它人的白板上。服务器端使用Qt Network开发,客户端使用Qt Network和Qt Graphics View Framework开发,数据传输使用JSON数据格式。

    11715 人正在学习 去看看 安晓辉

1 - 引言

在前面我们讨论了高通和低通滤波器对图像进行处理,它们都是在整个图像的频率矩阵上操作,但是在很多应用中,我们感兴趣是处理指定的频段或频率矩形的小区域,因此需要使用选择性滤波,选择性滤波主要有两类

  1. 带阻滤波器或带通滤波器
  2. 陷波滤波器
    下面就让我们来介绍一下这两种滤波器

2 - 带阻滤波器和带通滤波器

这种类型的滤波器很容易使用前面的概念来构建,前面我们学习了理想、布特沃斯和高斯滤波器,则我们可以通过这些滤波器构建新的带阻滤波器

在这里插入图片描述

带通滤波器则为:HBPuv=1HBR(u,v)H_{BP}(u,v)=1-H_{BR}(u,v)
下面以图像的形式来展示一个高斯带通滤波器
在这里插入图片描述

这个滤波器本质上与前面的滤波器没有很大的改变,因此不再进行试验分析(详情可见之前的笔记)

3 - 陷波滤波器

陷波滤波器是更有用的选择性滤波器可以有效的去除周期性噪声。陷波滤波器可以用高通滤波器的乘积来构造。一般形式为:
HHR(u,v)=k=1QHk(u,v)Hk(u,v)H_{HR}(u,v)=\prod_{k=1}^QH_k(u,v)H_{-k}(u,v)
其中,Hk(u,v)H_k(u,v)Hk(u,v)H_{-k}(u,v)是高通滤波器。
距离的计算:
Dk(u,v)=[(uM/2uk)2+(vN/2vk)2]1/2D_k(u,v)=[(u-M/2-u_k)^2+(v-N/2-v_k)^2]^{1/2}

Dk(u,v)=[(uM/2+Uk)2+(vN/2+vk)2]1/2D_{-k}(u,v)=[(u-M/2+U_k)^2+(v-N/2+v_k)^2]^{1/2}
例如,下面一个用理想低通滤波器,它包含两个陷波对
HNR(u,v)=k=12[11+[D0k/Dk(u,v)2n]][11+[D0k/Dk(u,v)2n]]H_{NR}(u,v)=\prod_{k=1}^2[\frac{1}{1+[D_{0k}/D_k(u,v)^{2n}]}][\frac{1}{1+[D_{0k}/D_{-k}(u,v)^{2n}]}]
进行莫尔波纹的过滤

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

#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

img = cv2.imread('images/2.jpg',0) #直接读为灰度图像
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(fshift))
plt.subplot(221),plt.imshow(img,'gray'),plt.title('原始图像')
plt.subplot(222),plt.imshow(s1,'gray'),plt.title('中心频率域')


w , h = img.shape
"""设计理想陷波滤波器"""
flt = np.zeros(img.shape)
rx1 = w / 4
ry1 = h / 2

rx2 = w*3/4
ry2 = h/2;

r = min(w,h)/6 #半径
for i in range(1,w):
    for j in range(1,h):
        if ((i - rx1)**2 + (j - ry1)**2 >= r**2) and ((i - rx2)**2 + (j - ry2)**2 >= r**2):
            flt[i,j] = 1

plt.subplot(223),plt.imshow(flt,'gray'),plt.title('陷波滤波器')
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*flt)))
plt.subplot(224),plt.imshow(new_img,'gray'),plt.title('滤波后图像')

plt.show()

可以看到我们原始图像含有较多的莫尔波纹,我们可以通过构建不同的陷波滤波器对图像进行滤波
在这里插入图片描述

可见大部分的莫尔波纹已经被过滤,但是图片也因为滤波失去信息而变得平滑模糊,这时候我们可以选用不同数量和不同的单个滤波器种类来达到更好的效果。

4 - 小结

到这里,对于滤波器的学习可以做一个小结,我们学习了在空间域、频域的高通、低通滤波器对图像做增强操作,我们在以后的实践中,可以灵活的构建和使用多种滤波器为我们需要识别的图片进行预处理,以达到更好的识别效果。

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