2017-03-01 21:02:49 u013355826 阅读数 3315
  • Qt项目实战之网络电子白板

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

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


————————————————————————————————————————————————————————


时间宝贵!珍惜一分一秒


————————————————————————————————————————————————————————

一.空间滤波机理

滤波是指接受或者拒绝一定的频率分量。空间滤波是由一个邻域(典型是一个小矩形),对该邻域包围的图像像素执行预定义操作的结果。如果在图像处理像素上执行的是线性操作,则该滤波器是线性空间滤波器,否则是非线性空间滤波器。

空间滤波的机理就是:在待处理的图像中,逐点移动掩模,在每一点(x , y) 处,滤波器在该点的响应通过事先定义的关系来计算。对于线性空间滤波器,其响应是由滤波器系数和滤波掩模扫过的区域响应的像素索值乘积给出。

g(x,y) = w(-1,-1)f(x-1, y-1)+w(-1,0)f(x-1, y)+.......+w(1,1)f(x+1,y+1)

对于m x n的模板,假设m=2a+1; n=2b+1,则线性空间滤波的公式:


当逐点移动掩模时候,会想到一个问题,就是当掩模移动到图像的边缘时候,掩模内的行或者列可能在图像的外边。这就引出了当滤波中心在图像轮廓的边缘的的情况。

二.滤波中心靠近图像轮廓的情况

当滤波中心 靠近轮廓边缘的时,一种办法就是不让掩模靠近最边上的像素。对于3x3的掩模,掩模中心点不能到最边上的那一行(列),对于5x5的掩模,掩模中心点不能到最边上的那两行(列)。对于 n\times n的掩模,掩模中心的移动范围限制在距离图像边缘不小于(n-1)/2 的像素点。这种办法,导致边缘的像素点不会被处理,可以将未被处理的像素点直接复制到结果处。第二种方法就是,我们在边缘以外的像素点上补上(n-1)/2行(列)个像素点,灰度值可以是其他值,也可以把边缘复制到图像之外。


三.平滑滤波器

平滑处理用户模糊处理和降低噪声。

平滑线性空间滤波器的输出是包含在滤波器模板邻域内的像素的简平均值。这些滤波器有时也称为均值滤波器。平滑滤波器使用模板确定的邻域内像素的平均灰度值代替图像中的每一个像素值,这种处理降低了图像灰度的“尖锐”变化。常见的平滑处理就是为了降低噪声。

(1)标准像素平均值

 对于3x3的平滑滤波器的标准像素平均值。


(2)加权平均

在一个模板内,不同的像素点的重要性不同,这样就给不同的像素引入权值。





三.实例


对输入图像坐标(1,1)的3x3邻域内求标准像素平均值。R=(1*8+10)/ 9=2。同理可得滤波后其他像素点的值。明显看出,消除了输入图像中心点坐标(3,3)的尖锐现象。

对于3x3加权平均滤波,对输入图像坐标(1,1)R=(4+2*4+10+3)/16=25/16.同理可得滤波后其他像素点的值。

平均滤波处理噪声更好些,边缘模糊效果明显。

加权平均滤波边界模糊的负效应不明显。

空间均值处理的一个重要应用就是:为了对感兴趣的物体得到一个粗略的描述而模糊一副图像。这样较小的物体的强度与北京混合一起了,较大物体变得像斑点更易于检测。掩模大小由那些将融入背景中去的物体尺寸来决定。


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

中值滤波也会有边缘模糊效应,只是比较小。中值滤波是非线性,处理后的图像不能恢复为原图像。




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

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

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

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

空间域滤波机理

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

例如:
假设有一个这样的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-01-21 20:39:22 fangjin_kl 阅读数 1317
  • Qt项目实战之网络电子白板

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

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

使用fspecial来生成空间滤波器


使用ifftshift,使得原点位于频率矩形的左上角


分别在空域和频域进行滤波,结果


灰色调是由于存在负值,平均值在使用imshow后会变大,可以使用绝对值



创建二值图像


clc;
clear;
close all;

f=imread('lena.jpg');
f=rgb2gray(f);
imshow(f);

F=fft2(f);
S=fftshift(log(1+abs(F)));
S=gscale(S);
figure;
imshow(S);

h = fspecial('sobel');

PQ=paddedsize(size(f));
H=freqz2(h,PQ(1),PQ(2));
H1=ifftshift(H);
figure;
imshow(abs(H),[]);
figure,imshow(abs(H1),[]);

gs = imfilter(double(f),h);
gf = dftfilt(f,H1);
figure,imshow(gs,[]);
figure,imshow(gf,[])

figure,
imshow(abs(gs),[]);
figure,
imshow(abs(gf),[]);

figure,
imshow(abs(gs)>0.2*abs(max(gs(:))));
figure,
imshow(abs(gf)>0.2*abs(max(gf(:))));






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

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

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

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

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

滤波器的尺寸一般为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算子。其中模板所有系数和为零。

2011-12-31 21:35:29 tofro 阅读数 551
  • Qt项目实战之网络电子白板

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

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

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

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);

}

}

 

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

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