2017-07-09 17:31:16 zhangfuliang123 阅读数 7354
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4123 人正在学习 去看看 贾志刚

    最近在看OpenCV 图像处理-平滑处理这个章节,于是呢,想着滤波器总结一下。这里主要是空间域滤波器的介绍,频率域以后再说吧。

首先分为平滑空间滤波器和锐化空间滤波器来进行介绍。平滑空间滤波器主要用于模糊处理和降低噪声,主要两类:均值滤波器和中值滤波器。锐化空间滤波器主要是:拉普拉斯算子和梯度算子

1、均值滤波器

       假设我们有一个3*3的模板,系数全为1,那么欲求的中心点像素值就是以该模板为中心的9个像素的平均值来代替。根据定义可知,该滤波器具有模糊边缘的负面效应。通过空间均值处理来模糊图像,可以突出感兴趣的物体,即将较部分图像融入背景中 ,部分图像‘突出显示’出来,达到平滑图像的作用,重点理解平滑对于图像的意义。

                                                                                                  

MATLAB实现代码:

set(gca,'Fontname','Monospaced');
I=imread('a.tif');   
subplot(231),imshow(I), title('origin image');  
%I=rgb2gray(I);  
%I1=imnoise(I,'salt & pepper',0.02);  
%subplot(2 3 2)  
%imshow(I1)  
%title('添加椒盐噪声的图像');
I1 = I;
k1=filter2(fspecial('average',3),I1)/255; %进行3*3模板平滑滤波
k2=filter2(fspecial('average',5),I1)/255; %进行5*5模板平滑滤波  
k3=filter2(fspecial('average',7),I1)/255; %进行7*7模板平滑滤波  
k4=filter2(fspecial('average',9),I1)/255; %进行9*9模板平滑滤波  
k5=filter2(fspecial('average',15),I1)/255; %进行15*15模板平滑滤波  
subplot(232),imshow(k1);title('3*3 smoothing filtering');  
subplot(233),imshow(k2);title('5*5 smoothing filtering');  
subplot(234),imshow(k3);title('7*7 smoothing filtering');  
subplot(235),imshow(k4);title('9*9 smoothing filtering');  
subplot(236),imshow(k5);title('15*15 smoothing filtering');  
结果:可以看出,在模板逐渐扩大的过程中,图像的锯齿边缘被模糊掉,颗粒状的噪声也没有了,达到了我们想要的效果,但是在9*9甚至更大的模板,图像开始失真,图像过度模糊了。所以我们在图像平滑的时候,要选最佳的模板尺寸。



2、中值滤波器

中值滤波器是一种统计排序滤波器,即图像像素等于周围像素排序后的中值,加入模板为3*3,则目标点的像素等于排序后的第五个像素的值。中值滤波器特别适用于椒盐噪声。由定义知,中值滤波器对于孤立点特别敏感,还可以保持图像的边缘特性。由中值滤波扩展出来的还有最大值滤波器和最小值滤波器。

MATLAB代码:

%=======second part======
I = imread('book_XRaySalt.tif');
subplot(131),imshow(I);title('原椒盐噪声图像');

k1=filter2(fspecial('average',3),I)/255; 	%进行3*3模板平滑滤波

k2=medfilt2(I,[3,3]); 						%进行3*3模板中值滤波

subplot(132),imshow(k1);title('3*3模板均值滤波');  
subplot(133),imshow(k2);title('3*3模板中值滤波');
I(100:110,100:110),
k2(100:110,100:110),
结果:


增加:

      这里补充说下高斯滤波器,高斯滤波器是利用高斯核与输入图像的每个点进行卷积。提到高斯,就想到‘草帽’,更能记住它。

       高斯滤波器是一种平滑线性滤波器,使用高斯滤波器对图像进行滤波,其效果是降低图像灰度的“尖锐”变化,也就是使图像“模糊”了。高斯滤波对于抑制服从正态分布的噪声效果非常好,其代价是使图像变得“模糊”。当然,有时对图像进行平滑滤波的目的就是让图像变得模糊。

一维高斯分布函数:                                                                                二维高斯分布函数:

                                                                

        它们的图像分别为:                                                                      

    

其3*3与5*5的卷积核对应如下:


MATLAB实现:

img = imread('lena.tif');
w = fspecial('gaussian',[5,5],0.5);
%replicate:图像大小通过赋值外边界的值来扩展
%symmetric 图像大小通过沿自身的边界进行镜像映射扩展
I = imfilter(img,w,'replicate');
subplot(1,2,1);title('原图像');imshow(img);
subplot(1,2,2);title('高斯滤波后的图像');imshow(I);

从结果可以看出,图像整体模糊平滑了,特别是头发和帽子部分,是图像的尖锐变化被降低了吧。


3、拉普拉斯算子进行图像锐化

拉普拉斯算子是一种二阶微分算子,其强调的是图像中灰度的突变,通过将原图像和拉普拉斯图像加在一起,可以达到锐化图像的作用,最终在保留图像的背景信息的前提下从而突出细节。拉普拉斯锐化模板在边缘检测中非常有用。因为图像的边缘就是那些灰度跳变厉害的的区域。


拉普拉斯算子模板:


实现代码:

%=============================================================
f=imread('moon.jpg');
subplot(2,3,1),imshow(f);  
title('原图像'); 

w4=fspecial('laplacian',0),
g1=imfilter(f,w4,'replicate');
subplot(2,3,2),imshow(g1); title('拉普拉斯模板滤波后的图像'); 

f2=im2double(f);%将f转换归一化的double类图像,然后进行滤波
g2=imfilter(f2,w4,'replicate');
% imshow(img,[low high])  [low high]用于指定图像显示的灰度范围 对于double数据认为是0-1范围内
subplot(2,3,3),imshow(g2,[]);   title('含有负值的滤波结果'); 

g=f2-g2;
subplot(2,3,4),imshow(g);title('原图-含有负值的滤波结果');

%w8=[0 1 0;1 -4 1;0 1 0],
w8=[1 1 1;1 -8 1;1 1 1],
g8=f - imfilter(f,w8,'replicate');
subplot(2,3,5),imshow(g8);title('对角线中心为8的拉普拉斯模板');


%=============================================================


4、梯度算子进行图像锐化

    相比于拉普拉斯二阶微分算子,梯度算子一一阶微分算子,更为简单。其实个人觉得,把梯度算子放在‘边缘检测’更为合适。


f(x,y)在X方向和Y方向的梯度:

经典模板:

代码实现:
代码中增加注释,很详细的介绍了求梯度算子锐化的过程。
%   soble algorithm
%   ZhangFL at SWPU  2017.04.26
%   Sobel算子中的垂直模板得到的梯度图,由于梯度方向与边缘走向垂直,所以该梯度图对水平边缘有较强的响应,从而水平细节信息非常清晰。
%   sobel算子中的水平模板得到的梯度图,它对垂直边缘有较强的响应,垂直细节非常清晰。
%   Sobel算子水平和垂直方向叠加的梯度图,水平和垂直细节都非常清晰。
 A=imread('house.tif');  
 %I=rgb2gray(A);
  I=A;
 
 subplot(2,2,1); 
 imshow(I);  
 title('原图'); 
 
  k2=filter2(fspecial('average',5),I)/255; %进行5*5模板平滑滤波
  I=k2;
  hx=[-1 -2 -1;0 0 0 ;1 2 1],  %产生sobel垂直梯度模板
  hy=hx',                    %产生sobel水平梯度模板
  
  gradx=filter2(hx,I,'same');
  gradx=abs(gradx); %计算图像的sobel垂直梯度
  subplot(2,2,2);
  imshow(gradx,[]);
  title('图像的sobel垂直梯度');
  
  
  grady=filter2(hy,I,'same');
  grady=abs(grady); %计算图像的sobel水平梯度
  subplot(2,2,3);
  imshow(grady,[]);
   title('图像的sobel水平梯度');
   
   grad=gradx+grady;  %得到图像的sobel梯度
   subplot(2,2,4);
   imshow(grad,[]);
   title('图像的sobel梯度(使用5*5模板平滑滤波)');
   
   



2019-08-17 22:40:39 csuwoshikunge 阅读数 267
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4123 人正在学习 去看看 贾志刚

图像滤波问题描述

为了内容的完整性,首先对图像滤波进行简单的回顾。令IRh×w×cI\in R^{h\times w\times c}表示图像,是一个二维矩阵,h,wh,w分别表示图像的高度和宽度,c=1,3c=1,3分别表示灰度图像和彩色图像,II中的每个元素I(i,j)I(i,j)称作一个像素。不失一般性,我们以c=1c=1即灰度图为例。本质上图像II是一个定义二维网格点上的函数,也即I:(i,j)R2I(i,j)RI:(i,j)\in R^{2} \rightarrow I(i,j)\in R
f:IRh×wI^Rh×wf:I\in R^{h\times w}\rightarrow \hat{I}\in R^{h\times w}表示滤波器。常见的滤波过程就是:计算每个像素I(i,j)I(i,j)经过滤波后的值I^(i,j)\hat{I}(i,j),都是通过加权像素I(i,j)I(i,j)的邻域像素值,如下公式所示:
(1)I^(i,j)=fI(i,j)=1w(i,j)(i,j)Nw(i,j)I(i,j)\hat{I}(i,j)=f\circ I(i,j)=\frac{1}{\sum w(i',j')}\sum_{(i',j')\in N} w(i',j')I(i',j')\tag{1}
其中NN表示像素I(i,j)I(i,j)的邻域(也称滤波器的窗口),注意这里的邻域关系仅仅是像素点在定义域的相邻关系,如图像上的8邻域等。

1. 空间(即图像定义域)相邻关系的滤波器

常见的滤波器,如高斯滤波器,均值滤波器等,都属于这一类滤波器。
如(1)式所示,当权重
w(i,j)=1nw(i',j')=\frac{1}{n}其中n=Nn=|N|表示邻域像素的个数, 这就均值滤波器。
当权重
w(i,j)=12πσ2e(ii)2+(jj)22σ2w(i',j')=\frac{1}{2\pi\sigma^2}e^{-{\frac{(i'-i)^2+(j'-j)^2}{2\sigma^2}}}
就是通常的高斯滤波器。

注意这类滤波器,在进行图像滤波的时候仅仅考虑图像的定义域上的邻域关系(也即空间上的邻域关系)。这样通常会导致图像模糊,因为仅仅按图像定义域或空间上的相邻关系,会导致空间(或定义域)上相邻但是像素值相差巨大的像素参与滤波过程,如下图所示:按8邻域关系,计算点AA的高斯滤波或均值滤波时,空间相邻的像素点B,C,D,EB,C,D,E(注意它们的像素值(白)与AA点的像素值(黑)相差很大),会参与滤波公式(1)中的加权平均。很显然,滤波后会导致,在AA点附近的图像边缘会出现模糊。

滤波仅考虑图像定义域上的相邻关系下面就介绍双边滤波,能够在很大程度上避免这一种仅仅依靠图像定义域相邻引起的图像模糊。

2. 双边滤波器(bilateral filter)

如何将上图中的点AAB,C,D,EB,C,D,E区分开来,使得(1)式中计算AA点的加权平均时,B,C,D,EB,C,D,E贡献的权重为0(当然这是理想的情况),就成了关键。那么一个很自然的想法是,同时考虑像素点的像素值,这样将像素点投到高维空间,那么有可能B,C,D,EB,C,D,E将不再是AA的相邻点。因为在低维空间中不易区分的点,在高维空间中可能比较容易区分开来。这点类似SVM(支持向量机)中的核函数设置的思想。

同时统计像素点AA的坐标和像素值,这其实就是图像函数I:(i,j)I(i,j)RI:(i,j)\rightarrow I(i,j)\in R的graph, 记作
(2)G={(i,j,I(i,j)):(i,j)}G=\{(i,j,I(i,j)):(i,j)是图像像素坐标\}\tag{2}
它是一个二维流形(嵌入在三位欧式空间R3R^3中),其实就是一个曲面,显然在这个graph GG上,B,C,D,EB,C,D,EAA不再是相邻点。但是在直接二维流形GG上寻找点的相邻点可能非常复杂,因为曲面的形状可能很不规则(曲率不为0),不像二维平面网格点(i,j)(i,j)那样容易寻找相邻点。

为了计算方便,退而求其次,把二维曲面GG嵌入在三维空间中考虑,利用三维欧式空间R3R^3的曲率为0,在三维网格点中寻找相邻点,这样就和在二维网格中种寻找相邻点一样方便。但是考虑到嵌入的GG实则是函数II的图像graph,本质上是二维的,所以双边滤波仍按定义域寻找相邻点即可,但是要减弱这些相邻点中颜色差异较大的点对滤波贡献的权重。

可以看到,在把GG嵌入三维空间考虑时,AA点在对应(iA,jA,IA)(i_A,j_A,I_A)。以DD点为例,DD对应(iD,jD,ID)(i_D,j_D,I_D)。不妨以欧式范数为例,在三维空间中A,DA,D之间的距离为
(3)d(A,D)=(iDiA)2+(jDjA)2+(IDIA)2=1+1+(IDIA)2d(A,D)=\sqrt{(i_D-i_A)^2+(j_D-j_A)^2+(I_D-I_A)^2}=\sqrt{1+1+(I_D-I_A)^2}\tag{3}
则如上面(3)式所示,那么当A,DA,D的像素值之差IDIA|I_D-I_A|很大时,那么在GGd(A,D)d(A,D)距离就很远。
而双边滤波正是通过,考虑这种距离来弱化DDAA的影响,这点可以从下面双边滤波的公式中,得到体现
(4)I^A=1w(q,A)qNw(q,A)Iq\hat{I}_A=\frac{1}{\sum w(q,A)}\sum_{q\in N}w(q,A)I_q\tag{4}
其中,NN是点AA的邻域,
w(q,A)=e(iqiA)2+(jqjA)22σs2(IqIA)22σr2w(q,A)=e^{-\frac{(i_q-i_A)^2+(j_q-j_A)^2}{2\sigma_{s}^{2}}-\frac{(I_q-I_A)^2}{2\sigma_{r}^2}}

显然,当q,Aq,A之间的像素值相差很大时,w(q,A)w(q,A)就会变得很小,从而达到了弱化qq点对AA点的滤波值的影响,易见上图中的B,C,D,EB,C,D,EAA的距离很大(在R3R^3中考虑它们之间的距离时)。所以滤波时,B,C,D,EB,C,D,EAA的影响就大大减弱,从而大大减轻滤波后边界模糊的现象,达到了保边滤波的效果。

3. 如何快速实现双边滤波

即使双边滤波有很好的保边效果,但是当图像的尺寸以及滤波器的窗口尺寸很大时,双边滤波的速度就可能很慢。双边滤波这不像通常的高斯滤波和均值率波等,双边滤波(4)式中的权重系数ww是与图像的像素值有关的,因而不能像高斯滤波或者均值滤波那样有固定的模板通过卷积快速实现。后面系列,会介绍快速实现近似双边滤波的相关文章[1]以及在双边滤波在深度学习中的应用。。。。。

[1]: Fast high-dimensional filtering using the permutohedral lattice.

2017-11-16 10:39:20 hhyqhh 阅读数 904
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4123 人正在学习 去看看 贾志刚

课后作业,实现:均值、谐波均值、中值、中点等滤波器。对应《数字图像处理》第三版,5.1-5.9课后题。


代码基于Matlab实现。完整代码及处理结果见:GitHub

步骤

  1. 加载图像
  2. 向外拓展一个像素的大小
  3. 与滤波器做卷积操作
  4. 输出图像

5.1 算数均值滤波

代码实现

close all
clear all
image=imread('filtering.tif');

figure();
subplot(2,2,1);
imshow(image);
xlabel('Raw image');

image_mean_3 = arithmetic_mean_filter(image,3);
subplot(2,2,2);
imshow(image_mean_3)
xlabel('arithmetic mean filter/3');

image_mean_5 = arithmetic_mean_filter(image,5);
subplot(2,2,3);
imshow(image_mean_5)
xlabel('arithmetic mean filter/5');

image_mean_9 = arithmetic_mean_filter(image,9);
subplot(2,2,4);
imshow(image_mean_9)
xlabel('arithmetic mean/9');

%%
function [result_imag]= arithmetic_mean_filter(image,filter_size)
    Ex_image = extend_imag(image);
    result_imag = image;
    [M,N]=size(Ex_image);
    helf_size = (filter_size-1)/2;

    for x=1+helf_size:1:M-helf_size
        for y=1+helf_size:1:N-helf_size
            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);     
            result_imag(x,y)=sum(slid(:))/numel(slid);
        end
    end
end

%%
function [result_imag] = extend_imag(image)
    [M,N] = size(image);
    temp = zeros(M+2,N+2);
    for x = 1:M
        temp(x+1,:) = [image(x,1) image(x,:) image(x,N)];
    end
    temp(1,:) = temp(2,:);
    temp(M+2,:) = temp(M+1,:);
    result_imag = temp;
end

其中 extend_imag 用于向外拓展像素。arithmetic_mean_filter 是核心的滤波器实现以及运算操作。

结果


5.2 几何均值滤波

这里只展示核心的滤波器实现代码。完整代码见GitHub

%%
function [result_imag]= geo_mean_filter(image,filter_size)
    Ex_image = extend_imag(image);
    result_imag = image;
    [M,N]=size(Ex_image);
    helf_size = (filter_size-1)/2;

    for x=1+helf_size:1:M-helf_size
        for y=1+helf_size:1:N-helf_size
            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);     
            result_imag(x,y)=prod(slid(:))^(1/numel(slid));
        end
    end
end

5.3 谐波均值滤波

%%
function [result_imag]= harmonic_wave_mean_filter(image,filter_size)
    Ex_image = extend_imag(image);
    result_imag = image;
    [M,N]=size(Ex_image);
    helf_size = (filter_size-1)/2;

    for x=1+helf_size:1:M-helf_size
        for y=1+helf_size:1:N-helf_size
            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);
            slid = 1./slid;
            result_imag(x,y) = numel(slid(:))/sum(slid(:));
        end
    end
end

5.4 逆谐波均值滤波(Q=1.5)

%%
function [result_imag]= Inv_harmonic_wave_mean_filter(image,filter_size)
    Ex_image = extend_imag(image);
    result_imag = image;
    [M,N]=size(Ex_image);
    helf_size = (filter_size-1)/2;
    Q=1.5;
    for x=1+helf_size:1:M-helf_size
        for y=1+helf_size:1:N-helf_size
            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);
            result_imag(x,y) = sum(slid(:).^(Q+1))/sum(slid(:).^(Q));
        end
    end
end

5.5 逆谐波均值滤波(Q=-1.5)

%%
function [result_imag]= Inv_harmonic_wave_mean_filter(image,filter_size)
    Ex_image = extend_imag(image);
    result_imag = image;
    [M,N]=size(Ex_image);
    helf_size = (filter_size-1)/2;
    Q=-1.5;
    for x=1+helf_size:1:M-helf_size
        for y=1+helf_size:1:N-helf_size
            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);
            result_imag(x,y) = sum(slid(:).^(Q+1))/sum(slid(:).^(Q));
        end
    end
end

5.6 中值滤波

%%
function [result_imag]= min_value_filter(image,filter_size)
    Ex_image = extend_imag(image);
    result_imag = image;
    [M,N]=size(Ex_image);
    helf_size = (filter_size-1)/2;

    for x=1+helf_size:1:M-helf_size
        for y=1+helf_size:1:N-helf_size
            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);
            temp = sort(slid(:));
            result_imag(x,y)= temp((numel(temp)-1)/2);
        end
    end
end

5.7 最大值滤波

%%
function [result_imag]= max_value_filter(image,filter_size)
    Ex_image = extend_imag(image);
    result_imag = image;
    [M,N]=size(Ex_image);
    helf_size = (filter_size-1)/2;

    for x=1+helf_size:1:M-helf_size
        for y=1+helf_size:1:N-helf_size
            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);
            temp = slid(:);
            result_imag(x,y)= max(temp);
        end
    end
end

5.8 最小值滤波

%%
function [result_imag]= max_value_filter(image,filter_size)
    Ex_image = extend_imag(image);
    result_imag = image;
    [M,N]=size(Ex_image);
    helf_size = (filter_size-1)/2;

    for x=1+helf_size:1:M-helf_size
        for y=1+helf_size:1:N-helf_size
            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);
            temp = slid(:);
            result_imag(x,y)= min(temp);
        end
    end
end

5.9 中点滤波

%%
function [result_imag]= half_value_filter(image,filter_size)
    Ex_image = extend_imag(image);
    result_imag = image;
    [M,N]=size(Ex_image);
    helf_size = (filter_size-1)/2;

    for x=1+helf_size:1:M-helf_size
        for y=1+helf_size:1:N-helf_size
            slid=Ex_image(x-helf_size:1:x+helf_size,y-helf_size:1:y+helf_size);
            temp = slid(:);
            result_imag(x,y)= (max(temp)+min(temp))/2;
        end
    end
end
2012-02-27 13:28:13 lj695242104 阅读数 25769
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4123 人正在学习 去看看 贾志刚

描述:均值滤波器是图像处理中一种常见的滤波器,它主要应用于平滑噪声。它的原理主要是利用某像素点周边像素的平均值来打到平滑噪声的效果。

常用的均值核如下图所示:


            


图像滤波器操作实际上就是模板操作,对于模板操作我们应该注意边界问题:

什么是边界问题?

对于边界问题就是当图像处理边界像素的时候,卷积核与图像使用区域不能匹配,计算出现问题。


处理方法:

1、忽略边界像素,即丢掉不能匹配的像素

2、保留边界像素,即复制源图像的不能匹配的边界像素到输出图像



Code:

  /**
   * Calculates the mean of a 3x3 pixel neighbourhood (including centre pixel).
   *
   * @param input the input image 2D array
   * @param kernel the kernel 2D array
   * @param w the image width
   * @param h the image height
   * @param x the x coordinate of the centre pixel of the array
   * @param y the y coordinate of the centre pixel of the array
   * @return the mean of the 9 pixels
   */ 
  public static int meanNeighbour(int [][] input, int [][] kernel,
			  int w, int h, int x, int y) {

    int sum = 0;
    int number = 0;
    for(int j=0;j<3;++j){
      for(int i=0;i<3;++i){
	if((kernel[i][j]==1) && 
	   ((x-1+i)>=0) && ((y-1+j)>=0) && ((x-1+i)<w) && ((y-1+j)<h) ){
	  sum = sum + input[x-1+i][y-1+j];
	  ++number;
	}
      }
    }
    if(number==0) return 0;
    return (sum/number);
  }


  /**
   * Takes an image in 2D array form and smoothes it according to the kernel.
   * @param input the input image
   * @kernel the kernel 1D array
   * @param width of the input image
   * @param height of the output image
   * @param iterations to be performed
   * @return the new smoothed image 2D array
   */
  public static int [][] smooth(int [][] input, int [][] kernel,
				int width, int height, int iterations){
    int [][] temporary = new int [width][height];
    int [][] outputArrays = new int [width][height];
    temporary = (int [][]) input.clone();
    for (int its=0;its<iterations;++its){
      for(int j=0;j<height;++j){
	for(int i=0;i<width;++i){
	  outputArrays[i][j] = meanNeighbour(temporary,kernel,
					     width,height,i,j);
	}
      }
      for(int j=0;j<height;++j){
	for(int i=0;i<width;++i){
	  temporary[i][j]=outputArrays[i][j];
	}
      }
    }
    return outputArrays;
  }


Input Image:




Output Image:




总结:均值滤波器就是为了平滑周边的效果,不会因为图像上突出的点而感到难受,达到一种“Softened”的效果。

2017-03-01 21:02:49 u013355826 阅读数 3301
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4123 人正在学习 去看看 贾志刚


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


时间宝贵!珍惜一分一秒


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

一.空间滤波机理

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

空间滤波的机理就是:在待处理的图像中,逐点移动掩模,在每一点(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.同理可得滤波后其他像素点的值。

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

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

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


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

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




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