2018-10-03 17:56:07 qq_34917728 阅读数 266
  • OpenCV3.2 Java图像处理视频学习教程

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

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

图像的空间滤波

空间卷积:

        卷积是处理线性系统的基础,以下介绍的滤波计算方式,都与卷积计算有密切关系,其计算形式与卷积的计算方式有高度的相似性。如果下面介绍的滤波算子作用于图像,就相当于一个空间相关的计算过程(卷积的对称计算——相关)。

上式中w(x,y)是一个滤波核(算子),不同的滤波方式就是由不同算子w控制的,如平均值滤波就是通过下面这个核实现的:

        利用该算子作用于图像中的每个像素,可以得到以该像素邻域的平均值为该点像素值的结果,从而实现图像的平滑滤波。需要注意的是,在图像的边缘处,由于边缘像素点没有完整的邻域,所以以该像素所拥有的邻域为变量求平均值,即要注意在边缘不是乘以1/9,而是根据具体用到的像素个数来决定。

通过改变算子w(x,y)的尺寸,可以控制以不同大小的邻域来滤波,如上面给出的例子是3阶邻域,可设置w(x,y)的尺寸为(3,5)、(5,5)、(7,11)等,因为某一点邻域尺寸必定是奇数,所以设置的算子也只能是奇数阶。

上述给出的只是最简单的平均值滤波,对应的还有其他算子,如:

                          中值滤波

                    4邻域拉普拉斯算子

                    8邻域拉普拉斯算子

中值滤波:将邻域的值进行排序,选取中值作为该像素的值,这种滤波对椒盐噪声的滤波很有效果,如下图,中值滤波可以很好的去除椒盐噪声。

                          椒盐噪声图

                          均值滤波

                           中值滤波

拉普拉斯算子:       

可以产生图像增强的效果,相比来说8邻域的拉普拉斯算子增强效果更好。

                         月球原图

                      4邻拉普拉斯作用

                    8邻拉普拉斯作用

MATLAB实现方式:

       函数使用格式g = imfilter(I, w, filtering_mode, boundary_option, size_option);

其中I是输入图像,w是算子,后面三个参数选项见下表

选项

描述

filtering_mode

‘corr’

‘conv’

boundary_option

P

‘replicate’

‘Symmetric’

‘circular’

size_option

‘full’

‘same’

 

滤波通过使用相关来完成,该值默认

滤波通过使用卷积来完成

 

输入的图像边界通过P值扩展,P的默认值为0,不需要加‘’

通过复制外边界的值来扩展

通过镜像反射边界来扩展

通过将图像看成是一个二维周期函数的一个周期来扩展

 

输出图像大小与扩展后的大小相同

输出原图像大小,默认值

注:boundary_option  %解决算子在图像边界的计算问题,通过扩展图像来解决。

例子:

I = imread(‘1.jpg’);     %读取当前工作路径上一张名为1的jpg格式图片

I = imresize(I, 0.5);     %缩小图片尺寸,减少计算量,可不用这一步

w = ones(11) /11^2;    %建立滤波算子,记得要除以整个算子的总和

F1 = imfilter(I, w);             %对图像进行滤波,会有黑边

F2 = imfilter(I, w, ‘replicate’); %通过复制扩展边界,可解决黑边问题

figure, imshow(I), figure, imshow(F1), figure, imshow(F2);      %显示图片

                          原图图片

        默认选项下的滤波结果(有黑边)

       以‘replicate’选项扩展下的滤波结果 

图像增强程序:

拉普拉斯算子增强计算公式

如何得到掩膜?把上述提到的算子带入滤波公式,并以‘replicate’选项扩展就可以得到,使用命令如下:

得到掩膜之后,将其叠加到原图像上,就可以获得增强效果,这里叠加形式为“原图减去掩膜”。

完整程序:

clc,clear
close all
c = 0.4;                        %scale
filename = 'moon.tif';          %文件名
I = imread(filename);           %读取图片
I = imresize(I,0.5,'bicubic');  %改变图片尺寸
w = [1,1,1;1,-8,1;1,1,1];       %拉普拉斯算子
L = imfilter(I,scale1*w,'replicate');  %获得拉普拉斯算子作用后的掩膜
imshow(I);                   
figure,imshow(L);
figure,imshow(I-L*c);

运行结果如下:

2017-04-15 16:25:31 qq_28362827 阅读数 267
  • OpenCV3.2 Java图像处理视频学习教程

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

    4434 人正在学习 去看看 贾志刚
I=imread('imagefile.jpg');
I=rgb2gray(I);
I=im2double(I);
A=fspecial('log');                  %拉普拉斯高斯算子  
%A=fspecial('prewitt');             %prewitt算子,用于边缘增强
%A=fspecial('unsharp');             %对比度增强滤波算子
K=imfilter(I,A);
imshow(I);
figure,imshow(K);

2015-05-29 13:41:04 u011177305 阅读数 4449
  • OpenCV3.2 Java图像处理视频学习教程

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

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


%自编的均值滤波函数。x是需要滤波的图像,n是模板大小(即n×n)
function d=avefilt(x,n)  
a(1:n,1:n)=1;   %a即n×n模板,元素全是1
p=size(x);   %输入图像是p×q的,且p>n,q>n
x1=double(x);
x2=x1;
%A(a:b,c:d)表示A矩阵的第a到b行,第c到d列的所有元素
for i=1:p(1)-n+1
    for j=1:p(2)-n+1
        c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中从(i,j)开始的n行n列元素与模板相乘
       s=sum(sum(c));                %求c矩阵(即模板)中各元素之和
        x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %将模板各元素的均值赋给模板中心位置的元素
    end
end
%未被赋值的元素取原值
d=uint8(x2);

%自编的中值滤波函数。x是需要滤波的图像,n是模板大小(即n×n)
function d=midfilt(x,n)  
p=size(x);   %输入图像是p×q的,且p>n,q>n
x1=double(x);
x2=x1;
for i=1:p(1)-n+1
    for j=1:p(2)-n+1
        c=x1(i:i+(n-1),j:j+(n-1));  %取出x1中从(i,j)开始的n行n列元素,即模板(n×n的)
       e=c(1,:);      %是c矩阵的第一行
        for u=2:n
           e=[e,c(u,:)];     %将c矩阵变为一个行矩阵   
        end
       mm=median(e);      %mm是中值
       x2(i+(n-1)/2,j+(n-1)/2)=mm;   %将模板各元素的中值赋给模板中心位置的元素
    end
end
%未被赋值的元素取原值
d=uint8(x2);


%自编的高斯滤波函数,S是需要滤波的图象,n是均值,k是方差
function d=gaussfilt(k,n,s)
Img = double(s);
n1=floor((n+1)/2);%计算图象中心
for i=1:n
    for j=1:n
      b(i,j)=exp(-((i-n1)^2+(j-n1)^2)/(4*k))/(4*pi*k);
    end
end
%生成高斯序列b。
Img1=conv2(Img,b,'same'); %用生成的高斯序列卷积运算,进行高斯滤波
d=uint8(Img1);
%此为程序主文件,包含主要功能单元,以及对子函数进行调用


调用部分案例:

try
%实验步骤一:彩色、灰度变换
h=imread('photo.jpg'); %读入彩色图片
c=rgb2gray(h); %把彩色图片转化成灰度图片,256级
figure,imshow(c),title('原始图象'); %显示原始图象
g=imnoise(c,'gaussian',0.1,0.002);  %加入高斯噪声
figure,imshow(g),title('加入高斯噪声之后的图象');  %显示加入高斯噪声之后的图象
%实验步骤二:用系统预定义滤波器进行均值滤波
n=input('请输入均值滤波器模板大小\n');
A=fspecial('average',n);  %生成系统预定义的3X3滤波器
Y=filter2(A,g)/255;          %用生成的滤波器进行滤波,并归一化
figure,imshow(Y),title('用系统函数进行均值滤波后的结果'); %显示滤波后的图象
%实验步骤三:用自己的编写的函数进行均值滤波
Y2=avefilt(g,n);     %调用自编函数进行均值滤波,n为模板大小
figure,imshow(Y2),title('用自己的编写的函数进行均值滤波之后的结果'); %显示滤波后的图象
%实验步骤四:用Matlab系统函数进行中值滤波
n2=input('请输入中值滤波的模板的大小\n');
Y3=medfilt2(g,[n2 n2]);   %调用系统函数进行中值滤波,n2为模板大小
figure,imshow(Y3),title('用Matlab系统函数进行中值滤波之后的结果'); %显示滤波后的图象
%实验步骤五:用自己的编写的函数进行中值滤波
Y4=midfilt(g,n2);      %调用自己编写的函数进行中值滤波,
figure,imshow(Y4),title('用自己编写的函数进行中值滤波之后的结果');
%实验步骤六:用matlab系统函数进行高斯滤波
n3=input('请输入高斯滤波器的均值\n');
k=input('请输入高斯滤波器的方差\n');
A2=fspecial('gaussian',k,n3);      %生成高斯序列
Y5=filter2(A2,g)/255;             %用生成的高斯序列进行滤波
figure,imshow(Y5),title('用Matlab函数进行高斯滤波之后的结果');   %显示滤波后的图象
%实验步骤七:用自己编写的函数进行高斯滤波
Y6=gaussfilt(n3,k,g);  %调用自己编写的函数进行高斯滤波,n3为均值,k为方差
figure,imshow(Y6),title('用自编函数进行高斯滤波之后的结果');     %显示滤波后的图象
catch          %捕获异常
    disp(lasterr);     %如果程序有异常,输出
end


2017-02-21 23:49:53 lql0716 阅读数 573
  • OpenCV3.2 Java图像处理视频学习教程

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

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

OpenCV-滤波算子(一)


author@jason_ql
http://blog.csdn.net/lql0716


平滑处理(smoothing)也称模糊处理(bluring),常用来减少图像上的噪点或者失真。

1、线性滤波:

1.1 方框滤波:BoxBlur()

方框滤波一般用来模糊一张图片。

C++:void bosFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT)

参数:
第一个参数:InputArray类型的src,输入图像,即原图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片。但需注意,待处理的图片深度应该是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一。
第二个参数:OutputArray类型的dst,即目标图像,需要和原图片有一样的尺寸和类型。
第三个参数:int类型的ddepth,输出图像的深度。“-1”代表使用原图深度,即src.depth()。
第四个参数:Size类型的ksize,内核的大小。一般用Size(w,h)的写法来表示内核的大小(其中,w为像素宽度,h为像素高度)。例如Size(3,3)表示3x3的核大小;Size(5,5)表示5x5的核大小。
第五个参数:Point类型的anchor,表示锚点(即被平滑的那个点),注意,它有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
第六个参数:bool类型的normalize,默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了。
第七个参数:int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。

1.2 均值滤波:Blur()

C++: void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT)

第一个参数:InputArray类型的src,输入图像,即原图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片。但需注意,待处理的图片深度应该是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一。
第二个参数:OutputArray类型的dst,即目标图像,需要和原图片有一样的尺寸和类型。
第三个参数:Size类型的ksize,内核的大小。一般用Size(w,h)的写法来表示内核的大小(其中,w为像素宽度,h为像素高度)。例如Size(3,3)表示3x3的核大小;Size(5,5)表示5x5的核大小。
第四个参数:Point类型的anchor,表示锚点(即被平滑的那个点),注意,它有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
第五个参数:int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。

1.3 高斯滤波:GaussianBlur()

高斯滤波一般用来模糊一张图片。

C++: void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)

第一个参数:InputArray类型的src,输入图像,即原图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片。但需注意,待处理的图片深度应该是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一。
第二个参数:OutputArray类型的dst,即目标图像,需要和原图片有一样的尺寸和类型。
第三个参数:Size类型的ksize,内核的大小。一般用Size(w,h)的写法来表示内核的大小(其中,w为像素宽度,h为像素高度)。例如Size(3,3)表示3x3的核大小;Size(5,5)表示5x5的核大小。
第四个参数:double类型的sigmaX,表示高斯函数在X方向的标准偏差。
第五个参数:double类型的sigmaY,表示高斯核函数在Y方向的标准差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么久有ksize.width和ksize.height计算出来。为了结果的正确性着想,最好把第三个参数Size、第四个参数sigmaX和第五个参数sigmaY全部指定到。
第六个参数:int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。

2、非线性滤波:

2.1 中值滤波:medianBlur()

中值滤波一般用来平滑(模糊)处理一张图片。

C++: void medianBlur(InputArray src, OutputArray dst, int ksize)

第一个参数:InputArray类型的src,函数的输入参数,填1、3或4通道的Mat类型的图像。当ksize为3或5的时候,图像深度需为CV_8U、CV_16U、CV_32F其中之一,而对于较大孔径尺寸的图片,它只能是CV_8U。
第二个参数:OutputArray类型的dst,即目标图像,函数的输出参数,需要和原图像有一样的尺寸和类型。我们可以用Mat::Clone,以原图片为模板,来初始化得到如假包换的目标图。
第三个参数:int类型的ksize,孔径的线性尺寸(aperture linear size),注意这个参数必须是大于1的奇数,比如3、5、7、9……

2.2 双边滤波:bilateralFilter()

双边滤波一般用来模糊处理一张图片。

C++: void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)

第一个参数:InputArray类型的src,输入图像,即原图像,需要为8为或浮点型单通道、三通道的图像。
第二个参数:OutputArray类型的dst,即目标图像,需要和原图片有一样的尺寸和类型。
第三个参数:int类型的d,表示在过滤过程中每个像素邻域的直径。如果这个值被设为非正数,那么Opencv会从第五个参数sigmaSpace来计算出它。
第四个参数:double类型的sigmaColor,颜色空间滤波器的sigma值。这个参数的值越大,就表明该像素邻域内越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
第五个参数:double类型的sigmaSpace,坐标空间中值滤波器的sigma值,坐标空间的标准方差。它的数值越大,意味着越远的像素会相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace无关。否则,d正比于sigmaSpace。
第六个参数:int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。

3、方框、均值、高斯、中值、双边滤波代码示例

#include <opencv2\opencv.hpp>
//#include <opencv2\core\core.hpp>
//#include <opencv2\highgui\highgui.hpp>
//#include <opencv2\imgproc\imgproc.hpp>

using namespace cv;
using namespace std;

string path = "D:/test/source/img/031.jpg";
cv::Mat img = cv::imread(path);
cv::Mat dst, dst2, dst3, dst4, dst5;

int main()
{

    cv::namedWindow("原图");
    cv::imshow("原图", img);

    //方框滤波
    cv::namedWindow("方框滤波——效果图");
    cv::boxFilter(img, dst, -1, cv::Size(5, 5));
    cv::imshow("方框滤波——效果图", dst);

    //均值滤波
    cv::namedWindow("均值滤波——效果图");
    cv::blur(img, dst2, cv::Size(7, 7));
    cv::imshow("均值滤波——效果图", dst2);

    //高斯滤波
    cv::namedWindow("高斯滤波——效果图");
    cv::GaussianBlur(img, dst3, cv::Size(7, 7), 0, 0);
    cv::imshow("高斯滤波——效果图", dst3);

    //中值滤波
    cv::namedWindow("中值滤波——效果图");
    cv::medianBlur(img, dst4, 7);
    cv::imshow("中值滤波——效果图", dst4);

    //双边滤波
    cv::namedWindow("双边滤波——效果图");
    cv::bilateralFilter(img, dst5, 25, 25 * 2, 25 / 2);
    cv::imshow("双边滤波——效果图", dst5);

    cv::waitKey(0);
    return 0;

}
2019-05-24 19:52:52 Polaris47 阅读数 74
  • OpenCV3.2 Java图像处理视频学习教程

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

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

用于平滑图像的常见滤波算子包括:

1.      均值滤波(normalized box filter):用其像素点周围像素的平均值代替元像素值,在滤除噪声的同时也会滤掉图像的边缘信息。在OpenCV中,可以使用boxFilter和blur函数进行均值滤波。

优点:算法简单,计算速度快;

缺点:降低噪声的同时使图像产生模糊,特别是景物的边缘和细节部分。

 

2.      高斯滤波(Gaussian filter):高斯滤波为最常用的滤波器,具有可分离性质,可以把二维高斯运算转换为一维高斯运算,其本质上为一个低通滤波器。在OpenCV中可通过函数GaussianBlur进行操作。

 

适用于消除高斯噪声

 

3.      中值滤波(median filter):中值滤波用测试像素周围邻域像素集中的中值代替原像素。中值滤波去除椒盐噪声和斑块噪声时,效果非常明显。在OpenCV中,可以使用函数medianBlur进行操作。

优点:抑制效果很好,画面的清析度基本保持;

缺点:对高斯噪声的抑制效果不是很好。

 

4.      双边滤波(bilateral filter):双边滤波在平滑图像时能够很好的保留边缘特性,但是其运算速度比较慢。在OpenCV中,可以使用函数bilateralFilter进行操作。

 

 

 

除了平滑去噪,图像锐化,求边缘等也是常见的图像滤波应用。这类滤波器常常使用一节或者二阶差分(或微分,对于数字图像而言,其为离散信号,长用差分代替导数)核算子对图像进行滤波。一节差分常用于求取图像边缘。二阶差分常用于图像增强。常用的这类算子包括:

1.      Sobel operator:Sobel算子通过计算水平和垂直方向上的一节差分来进行计算。在OpenCV函数中,可通过使用Sobel函数进行计算。

 

 2.      Laplacian operator:Laplacian算子通过计算二阶差分(微分)来进行计算。在OpenCV函数中,可通过使用Laplacian函数进行计算。

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