2016-05-05 14:17:38 swj110119 阅读数 17488
  • OpenCV3.2 Java图像处理视频学习教程

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

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

一、学习心得:
在我学习基本滤波算法原理的时候,因为刚接触不是很理解算法具体是怎样实现的,不过在学习了图像形态学之后,发现滤波算法其实很简单。所以在此建议初学者在学习滤波算法之前,可以先学习一下图像形态学,会达到事半功倍的效果。

二、对于滤波功能的理解:
滤波算法,可以理解成一种过滤算法,就像我们筛选产品时,把次品去除掉,只留下合格的产品。而在图像处理中的滤波算法中,处理的对象是图像,除了去除掉图像中不想要的像素点的值(如去除噪声),还可以加强图像中我们需要研究一些内容(如边缘提取)。

三、滤波算法:
这里所讲的算法都是针对图像空间的滤波算法,其中模板,可以理解为图像形态学中的结构元素,是用来选取图像中的那些像素点被用来操作的。空间滤波根据其功能划分为平滑滤波和锐化滤波。平滑滤波:能减弱或者消除图像中高频率分量,但不影响低频率分量,在实际应用中可用来消除噪声。锐化滤波:与平滑滤波相反,能减弱或者消除图像中低频率分量,但不影响高频率分量,可使图像反差增加,边缘明显。实际应用可用于增强被模糊的细节或者目标的边缘。

空间增强滤波技术分类:
这里写图片描述

1、线性平滑滤波

(1)方框滤波:用一个像素的领域像素值之和作为滤波结果,邻域即模板所覆盖的图像区域,此时模板的所有系数都为1.
这里写图片描述

这里写图片描述

(2)邻域平均:是特殊大方框滤波,用一个像素的领域平均像素值作为滤波结果,即a为第一种情。
这里写图片描述

其中N(x,y)为模板岁覆盖的图像的区域,n为模板的尺寸。

(3)加权平均:此时的模板系数不是1,而是具体的系数。一般认为距离模板中心的像素应对滤波结果有较大的贡献,所以可将接近模板中心的系数取得比模板周边的系数。
这里写图片描述

(4)高斯平均:是一种特殊的加权平均,只不过模板中的系数由高斯分布来确定的。

2、线性锐化滤波

(1)拉普拉斯算子
拉普拉斯算子是一种各向同性的二阶微分算子,利用微分系数来确定模板系数,然后再与图像进行卷积运算,从而实现锐化滤波。

根据拉普拉斯定义:
这里写图片描述
两个分别沿X和Y方向的二阶偏导均可借助差分计算:
这里写图片描述
合并为:
这里写图片描述

当模板为4-邻域时 当模板为8-邻域时

这里写图片描述 这里写图片描述

  以上两种模板的系数之和为0,这是为了使经过模板运算的图像的均值不变。拉普拉斯算子增强了图像中的灰度不连续区域,而减弱了图像中灰度值缓慢变化区域对比度,将这样的结果叠加到原始图像中,就可以得到瑞华后的额图像。

(2)高频提升滤波
图像的锐化效果可以通过叠加图像的微分结果得到,也可以通过减除图像积分结果得到。
设原始图像为f(x,y),平滑后的图像为g(x,y):

非锐化掩模:h(x,y) = f(x,y)-g(x,y)

锐化图像:{ f(x,y)- g(x,y) } + f(x,y)

高频提升滤波:把院士图形乘以一个放大系数A,再减去平滑图像

这里写图片描述
可转化为:
这里写图片描述
当A=1时,为非锐化掩模;
当A=2时,为非锐化掩模化。

3、非线性平滑滤波

(1)中值滤波:对模板下对应的像素值进行升序排序,选取中间值作为结果。
这里写图片描述
(2)与中值滤波类似的,还有最大值、最小值、中点滤波
这里写图片描述

以上四种滤波也称之为百分比滤波,百分比滤波基于模板的排序来工作,又叫作序统计滤波。

2014-10-29 15:27:39 PINBODEXIAOZHU 阅读数 2083
  • OpenCV3.2 Java图像处理视频学习教程

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

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

线性滤波器的向量表示:


W是一个大小为m*n的滤波器的系数,Z为由滤波器覆盖的相应图像的灰度值。

线性滤波器所能是实现的就是乘积求和操作。

几种常见的滤波器:

平滑空间滤波器如均值滤波

统计排序滤波器如中值滤波

锐化空间滤波器如锐化滤波

1、  均值滤波

 

 

均值滤波在去噪声的同时会有如下缺点:

边界模糊效应明显

细节丢失比较严重

 

2、  中值滤波


中值滤波在边界的保存方面优于均值滤波,是经常使用的一种滤波器,但

是在模板逐渐变大时,依然会存在一定的边界模糊

中值滤波对处理椒盐噪声非常有效,或者称为脉冲噪声。

 

如果既想去除噪声,又极大的保存细节,此时应该考虑变形虫算法模板的大小是与周围的像素有关,模板随环境自动变化大小,这样在细节较小的区域可以使用较大的模板,而在细节较多的区域使用更小的模板。变形虫算法,以后再讲。

滤波器一般为盒状滤波器,能不能使用其他形状的滤波器,以得到更好的滤波效果呢?

 源代码:

    //中值滤波和均值滤波  
    #include<cv.h>  
    #include<highgui.h>  
      
    int main(){  
        IplImage * image,*image2,*image3;  
        image = cvLoadImage("E:\\image\\Dart.bmp",0);//以灰度图像的形式读入图片  
        cvNamedWindow("image",CV_WINDOW_AUTOSIZE);  
        cvNamedWindow("image2",CV_WINDOW_AUTOSIZE);  
        cvNamedWindow("image3",CV_WINDOW_AUTOSIZE);  
        //cvSaveImage("E:\\image\\moon.jpg",image,0);  
        cvShowImage("image",image);  
        //cvWaitKey(0);  
        unsigned char * ptr,*dst;  
        int i,j,m,n,sum,temp,r,s;  
        image2 = cvCreateImage(cvGetSize(image),image->depth,1);  
        image3 = cvCreateImage(cvGetSize(image),image->depth,1);  
        //模板1 均值   
        int tem[9] = {1,1,1,1,1,1,1,1,1};   
        //也可以使用改进的高斯模板,但是效果相近   
        int tem2[9] = {0};//获取中值时用于排序  
      
        //均值滤波3*3模板的均值  
        for( i = 0 ; i < image->height;i++){  
            for( j = 0; j< image->width;j++){  
                  
                //边界处理  
                if(i == 0 || i == image->height || j == 0 || j == image->width){  
                    ptr = (unsigned char *)image->imageData + i*image->widthStep + j;  
                    dst = (unsigned char *)image2->imageData+ i*image2->widthStep+ j;  
                    *dst = *ptr; //边界值赋予源图像的值  
                }  
                else {  
                    sum = 0;  
                    for( m = -1 ; m <= 1; m++  ){  
                        for( n = -1 ; n <= 1 ; n++){  
                            ptr = (unsigned char *)image->imageData + (i + m)*image->widthStep + j + n;  
                              
                            sum += (*ptr) * tem[3*(m+1) + n+1];  
                        }  
                    }  
                    dst = (unsigned char *)image2->imageData+ i *image2->widthStep+ j;      
                    *dst = (unsigned char)((sum +4)/9);//赋新值,四舍五入  
                }   
              
            }  
        }  
    //中值滤波 在去除噪声的同时,图像的模糊程度比较小,比均值滤波更加适合  
    //冲击噪声或者称为椒盐噪声  
        for( i = 0 ; i < image->height;i++){  
            for( j = 0; j< image->width;j++){  
      
                //边界处理  
                if(i == 0 || i == image->height || j == 0 || j == image->width){  
                    ptr = (unsigned char *)image->imageData + i*image->widthStep + j;  
                    dst = (unsigned char *)image3->imageData+ i*image3->widthStep+ j;  
                    *dst = *ptr; //边界值赋予源图像的值  
                }  
                else {  
                    temp = 0;  
                    //将3*3模板覆盖的值拷贝进数组,一边查找中值  
                    for( m = -1 ; m <= 1; m++  ){  
                        for( n = -1 ; n <= 1 ; n++){  
                            ptr = (unsigned char *)image->imageData + (i + m)*image->widthStep + j + n;  
                            tem2[3*(m+1) +n +1] = *ptr;  
                            //printf("%d",*ptr);  
                          
                        }  
                    }  
                    //对数组进行冒泡排序  
                    for(r = 0 ; r <8; r ++){  
                        for(s = 0 ; s< r -1; s++ ){  
                            if(tem2[s] > tem2[s+1]){  
                                temp = tem2[s];  
                                tem2[s] = tem2[s+1];  
                                tem2[s+1] = temp;  
                            }  
                        }  
                    }  
                    //printf("%d",tem2[4]);  
                    //对新图赋予新值  
                    dst = (unsigned char *)image3->imageData+ i *image3->widthStep+ j;      
                    *dst = (unsigned char)(tem2[4]);//赋新值  
                }   
      
            }  
        }  
      
        cvShowImage("image2",image2);  
        cvShowImage("image3",image3);  
        cvWaitKey(0);  
        cvSaveImage("E:\\image\\Dart2.bmp",image2,0);  
        cvSaveImage("E:\\image\\Dart3.bmp",image3,0);  
        return 0;  
    }  

效果图:

原图:


均值滤波:


中值滤波:

 

可以看到,均值滤波缺点明显:

边界模糊效应明显

细节丢失比较严重

而中值滤波在保持细节方面明显优于均值滤波。

在滤波模板变大时,效果如何呢?

matlab源码:

    A = imread('Dart.bmp')  
      
    %采用中值滤波和均值滤波的比较  
    %模板大小的改变对滤波效果的影响  
    subplot(3,3,1)  
    imshow(A)  
    for n = 1 : 8   
        m = 2*n +1  
     B = medfilt2(A ,[m,m])  
     subplot(3,3,n+1)  
     imshow(B)  
       
    end  
      
    %采用均值滤波查看图像的变化  
    subplot(3,3,1)  
    imshow(A)  
    for n = 1 : 8   
        m = 2*n +1  
     C = imfilter(A,[m,m]);  
     subplot(3,3,n+1)  
     imshow(B)  
    end  

效果图:

均值滤波加大模板的效果:


中值滤波加大模板的效果:


可以看出随着模板的加大,中值滤波的模糊度也在增加,但是比均值要好很多。

3、Laplace图像锐化

锐化空间滤波器的一阶二阶微分的零交叉对于边缘定位非常有用

图像的边缘经一阶微分产生较粗的边缘

二阶微分产生由0分开的一个双边缘,这是一个适合锐化图像的理想特征。

锐化laplace算子可以突出图像中的灰度突变,但并不强调灰度缓慢变化的区域。

两种常用的Laplace模板:

0  1  0

1  -4 1

0  1  0

 

1 1 1

1 -8 1

1 1 1

 

但是得到突变的区域之后该怎么用呢?

事实上,如果源图像和laplace图像和叠加,这样既可以复原原图的背景特性,并保持laplace锐化处理的效果。这样做可以极大的增强图像的细节。

源代码:

    //锐化滤波,并利用锐化滤波增强图像的细节  
    #include<cv.h>  
    #include<highgui.h>  
      
    int main(){  
        IplImage * image,*image2,*image3;  
        image = cvLoadImage("E:\\image\\moon.tif",0);  
        cvNamedWindow("image",CV_WINDOW_AUTOSIZE);  
        cvNamedWindow("image2",CV_WINDOW_AUTOSIZE);  
        cvNamedWindow("image3",CV_WINDOW_AUTOSIZE);  
        cvSaveImage("E:\\image\\moon.jpg",image,0);  
        cvShowImage("image",image);  
        //cvWaitKey(0);  
        unsigned char * ptr,*dst;  
        image2 = cvCreateImage(cvGetSize(image),image->depth,1);  
        image3 = cvCreateImage(cvGetSize(image),image->depth,1);  
          
          
        int i,j,m,n,sum;  
      
        //锐化模板  
        int tem[9] = {0,1,0,1,-4,1,0,1,0};   
      
        //锐化滤波  
        for( i = 0 ; i < image->height;i++){  
            for( j = 0; j< image->width;j++){  
      
                //边界处理  
                if(i == 0 || i == image->height || j == 0 || j == image->width){  
                    ptr = (unsigned char *)image->imageData + i*image->widthStep + j;  
                    dst = (unsigned char *)image2->imageData+ i*image2->widthStep+ j;  
                    *dst = *ptr; //边界值赋予源图像的值  
                }  
                else {  
                    sum = 0;  
                    for( m = -1 ; m <= 1; m++  ){  
                        for( n = -1 ; n <= 1 ; n++){  
                            ptr = (unsigned char *)image->imageData + (i + m)*image->widthStep + j + n;  
      
                            sum += (*ptr) * tem[3*(m+1) + n+1];  
                        }  
                    }  
                    dst = (unsigned char *)image2->imageData+ i *image2->widthStep+ j;      
                    *dst = (unsigned char)((sum +4)/9);//赋新值,四舍五入  
                }   
      
            }  
        }  
      
        //锐化的图像与源图像相加,但是在相加之前需要先讲锐化的值稍微降低一些  
          
          
        cvShowImage("image2",image2);  
      
        for( i = 0 ; i < image2->height;i++){  
            for( j = 0; j< image->width;j++){  
                ptr = (unsigned char *)image2->imageData + i*image2->widthStep + j;   
                *ptr = ((*ptr)+4)/5;  
            }  
        }  
        cvAdd(image,image2,image3,0);  
        cvShowImage("image3",image3);  
          
        cvWaitKey(0);  
        cvSaveImage("E:\\image\\moon2.jpg",image2,0);  
        cvSaveImage("E:\\image\\moon3.jpg",image3,0);  
        return 0;  
    }  

原图:

锐化图像:

叠加图像:

由叠加图像可知,经过锐化处理和叠加之后,图像的细节部分更加清晰。

2019-12-17 17:09:32 weixin_45962327 阅读数 117
  • OpenCV3.2 Java图像处理视频学习教程

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

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

前言

    这篇文章主要讲解一下用FPGA实现图像的均值滤波算法,为什么要写这篇文章呢?

主要原因:在图像领域里会对一些视频数据要做各种算法处理,去噪算法是用到最多的算法;当然图像去噪算法有很多种,例如均值滤波、中值滤波、高斯滤波、引导滤波等。学习就从最基础的算法开始,逐步提高自己的水平。

    开始我们的FPGA学习之旅吧.......  

图像均值滤波算法原理    

对于图像均值滤波算法,我参考了书籍《图像处理》冈萨雷斯第三版。  

   图像均值滤波属于线性滤波算法,在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围 8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值,如下图所示:中心点为目标像素,它的最终的值要用周边的8个像素求和后的平均值代替。 公式:

 对上述图像算法的通俗理解就是用上图的模板在一幅M*N的图像按照从左到右的顺序移动,每移动一次计算出一个图像数据,直到所有图像都计算完为止;明白原理后开始进入程序设计吧!

图像均值滤波程序设计

      整个系统框架设计由3部分组成:image_change模块、image_storage模块、matrix_mode模块,如下图所示。下面开始详细介绍一下每个子模块的功能吧!

 

  • 1.                                                                 image_mean_top程序接口

名称

方向

位宽

说明

piexl_clk

Input

1

工作时钟

reset

Input

1

复位信号(active high)

Oimage_VS_in

Input

1

原始图像输入的场信号

Oimage_HS_in

Input

1

原始图像输入的行信号

Oimage_data_in

Input

WIDTH

原始图像数据信号

Pimage_VS_out

Output

1

算法处理后的场信号

Pimage_HS_out

Output

1

算法处理后的行信号

Pimage_data_out

Output

WIDTH

算法处理后的数据

image_change模块说明

根据图像均滤波算法的原理介绍,我们可以发现一个问题就是一张图像的外围周边的像素是无法进行算法处理,通过算法处理后的图像的分辨率降低了。如下图所以,周边为红色的像素都是无法参与算法运算的,当3*3的模板在整幅图像进行算法处理后,获得的图像的大小就变成了绿色像素的范围了。在实际的图像处理中有两种办法可以解决这个问题:

第一个办法就是根据算法的模板大小,配置相机吧原始图像分辨率变大一些,保证算法处理后的图像分辨率为最终想要的分辨率;

第二种办法就是对原始图像进行修改,人工将分辨率变大,从而保证获得的分辨率为最终想要的分辨,我们这里主要讲第二种办法。

举例:原始图像的分辨率是7*3,也就是每行7个像素,一共三行数据;采用的均值滤波模板是3*3的。为了保证图像的边缘数据能够得到处理,我们需要对每行的左右两边各添加一个虚拟的像素(数值为0),这就能保证每行数据的原始像素都能得到算法运算,同时保证了算法运算后每行的数据的个数不变;同理对行数上我们也要添加两行虚拟行数保证算法运算后的行数不边;image_change模块就是按照这个思路设计的。

   备注:对行数的处理,本模块在原始图像的结尾处添加一行,对于开头的添加的虚拟行通过后面的模块来实现。

  • 1.                                                               image_change程序接口

名称

方向

位宽

说明

piexl_clk

Input

1

工作时钟

reset

Input

1

复位信号(active high)

Oimage_VS_in

Input

1

原始图像输入的场信号

Oimage_HS_in

Input

1

原始图像输入的行信号

Oimage_data_in

Input

WIDTH

原始图像数据信号

Cimage_VS_out

Output

1

算法处理后的场信号

Cimage_HS_out

Output

1

算法处理后的行信号

Cimage_data_out

Output

WIDTH

算法处理后的数据

测试用例:

     输入一行数据,该行数据共7个有效数(1~7)运算结果:每行数据的两边各添加一个像素数值为0,一行数据就变成了9个像素,同时行数变成两行,补充的一行填充的数据全部为0。

仿真结果:

      通过仿真结果证明了我们的程序设计是正确的!

image_storage模块说明

在真实的视频图像数据中,数据都是一行行的输出,为了能够实现3*3模板的运算,需要对图像数据进行缓存,从而模拟出三行并行数据。

 

实现这个缓存常用的方法就是调用FPGA内部的缓存资源来实现,一般大家常用的就是shift_ram、fifo、双端口ram,其中shift_ram是最常用的(因为操作简单);这次设计没有调用上面的资源,我是自己设计了一个shift_ram的IP来实现,一个原因是block_ram缓存资源在FPGA中太宝贵了,一定要省着用;另一个原因是自己设计的IP可以在不同厂家的FPGA芯片中使用,移植起来比较方便(我了解的卖IP核的都是这样搞,大家可以尝试一下)。Shift_ram的IP设计,我采用了Verilog语法中的generate语句实现的,该语句操作简便灵活,我个人认为FPGA工程师必须掌握的,大家可以学习一下。

 

  • 1.                                                                     image_storage程序接口

名称

方向

位宽

说明

piexl_clk

Input

1

工作时钟

reset

Input

1

复位信号(active high)

Simage_VS_in

Input

1

原始图像输入的场信号

Simage_HS_in

Input

1

原始图像输入的行信号

Simage_data_in

Input

WIDTH

原始图像数据信号

Simage_VS_out

Output

1

算法处理后的场信号

Simage_HS_out

Output

1

算法处理后的行信号

Cimage_data_outA

Output

WIDTH

算法处理后的数据

Cimage_data_outB

Output

WIDTH

算法处理后的数据

Cimage_data_outC

Output

WIDTH

算法处理后的数据

仿真结果:

   如下图所示,红圈内的数据是输出的第一组3*3模板数据,Cimage_data_outC输出的数据全部为零,前面说过给原图添加的第一行虚拟数据在本模块实现。通过仿真验证了本模块设计是正确的。

matrix_mode模块说明

     该模块的作用就是设计一个3*3的模板,当iamge_storage模块输出9个数据时,该模块就开始计算出结果。设计思路如下图所示,就是在要设计9个缓存寄存器通过打拍实现计算功能。

  • 1.                                                                Matrix_mode程序接口

名称

方向

位宽

说明

piexl_clk

Input

1

工作时钟

reset

Input

1

复位信号(active high)

image_VS_in

Input

1

原始图像输入的场信号

image_HS_in

Input

1

原始图像输入的行信号

image_data_out

Output

WIDTH

原始图像数据信号

image_VS_out

Output

1

算法处理后的场信号

image_HS_out

Output

1

算法处理后的行信号

image_data_A

Input

WIDTH

算法处理后的数据

image_data_B

Input

WIDTH

算法处理后的数据

image_data_C

Input

WIDTH

算法处理后的数据

仿真结果:如下图所示,仿真结果和均值滤波算法原理是一致的,就是把目标周边的8个像素进行加法运算后求其平均值。

 

 

 

 

 

 

 

 

2015-01-20 09:54:25 scottly1 阅读数 20532
  • OpenCV3.2 Java图像处理视频学习教程

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

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

同态滤波:
利用广义叠加原理对同态系统进行滤波。
同态滤波是把频率过滤和灰度变换结合起来的一种图像处理方法,它依靠图像的照度/ 反射率模型作为频域处理的基础,利用压缩亮度范围和增强对比度来改善图像的质量。使用这种方法可以使图像处理符合人眼对于亮度响应的非线性特性,避免了直接对图像进行傅立叶变换处理的失真
同态滤波的基本原理是:将像元灰度值看作是照度和反射率两个组份的产物。由于照度相对变化很小,可以看作是图像的低频成份,而反射率则是高频成份。通过分别处理照度和反射率对像元灰度值的影响,达到揭示阴影区细节特征的目的。

同态滤波处理的基本流程如下:
S(x,y)---->Log---->DFT---->频域滤波---->IDFT---->Exp---->T(x,y)
其中S(x,y)表示原始图像;T(x,y)表示处理后的图像;Log 代表对数运算;DFT 代表傅立叶变换(实际操作中运用快速傅立叶变换FFT);IDFT 代表傅立叶逆变换(实际操作中运用快速傅立叶逆变换IFFT);Exp 代表指数运算。

下面是一张典型的同态滤波与其他图像处理方式的异同:


实现代码:

function I3 = test_tontai(I)

I=double(rgb2gray(I));
[M,N]=size(I);
rL=0.5;
rH=4.7;%可根据需要效果调整参数
c=2;
d0=10;
I1=log(I+1);%取对数
FI=fft2(I1);%傅里叶变换
n1=floor(M/2);
n2=floor(N/2);
for i=1:M
    for j=1:N
        D(i,j)=((i-n1).^2+(j-n2).^2);
        H(i,j)=(rH-rL).*(exp(c*(-D(i,j)./(d0^2))))+rL;%高斯同态滤波
    end
end
I2=ifft2(H.*FI);%傅里叶逆变换
I3=real(exp(I2));
subplot(122),imshow(I3,[]);title('同态滤波增强后');


实验发现,同态滤波有类似于高动态范围压缩的效果,比如可以把图像暗的部分提亮。


下图为原始图像,属于低曝光的一幅图像:



同态滤波后:



注:原创文章,转载请注明出处: http://blog.csdn.net/scottly1/article/details/42705271


2018-10-22 13:24:14 yixieling4397 阅读数 97
  • OpenCV3.2 Java图像处理视频学习教程

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

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

一、学习心得:
在我学习基本滤波算法原理的时候,因为刚接触不是很理解算法具体是怎样实现的,不过在学习了图像形态学之后,发现滤波算法其实很简单。所以在此建议初学者在学习滤波算法之前,可以先学习一下图像形态学,会达到事半功倍的效果。

二、对于滤波功能的理解:
滤波算法,可以理解成一种过滤算法,就像我们筛选产品时,把次品去除掉,只留下合格的产品。而在图像处理中的滤波算法中,处理的对象是图像,除了去除掉图像中不想要的像素点的值(如去除噪声),还可以加强图像中我们需要研究一些内容(如边缘提取)。

三、滤波算法:
这里所讲的算法都是针对图像空间的滤波算法,其中模板,可以理解为图像形态学中的结构元素,是用来选取图像中的那些像素点被用来操作的。空间滤波根据其功能划分为平滑滤波和锐化滤波。平滑滤波:能减弱或者消除图像中高频率分量,但不影响低频率分量,在实际应用中可用来消除噪声。锐化滤波:与平滑滤波相反,能减弱或者消除图像中低频率分量,但不影响高频率分量,可使图像反差增加,边缘明显。实际应用可用于增强被模糊的细节或者目标的边缘。

空间增强滤波技术分类:
这里写图片描述

1、线性平滑滤波

(1)方框滤波:用一个像素的领域像素值之和作为滤波结果,邻域即模板所覆盖的图像区域,此时模板的所有系数都为1.
这里写图片描述

这里写图片描述

(2)邻域平均:是特殊大方框滤波,用一个像素的领域平均像素值作为滤波结果,即a为第一种情。
这里写图片描述

其中N(x,y)为模板岁覆盖的图像的区域,n为模板的尺寸。

(3)加权平均:此时的模板系数不是1,而是具体的系数。一般认为距离模板中心的像素应对滤波结果有较大的贡献,所以可将接近模板中心的系数取得比模板周边的系数。
这里写图片描述

(4)高斯平均:是一种特殊的加权平均,只不过模板中的系数由高斯分布来确定的。

2、线性锐化滤波

(1)拉普拉斯算子
拉普拉斯算子是一种各向同性的二阶微分算子,利用微分系数来确定模板系数,然后再与图像进行卷积运算,从而实现锐化滤波。

根据拉普拉斯定义:
这里写图片描述
两个分别沿X和Y方向的二阶偏导均可借助差分计算:
这里写图片描述
合并为:
这里写图片描述

当模板为4-邻域时 当模板为8-邻域时

这里写图片描述 这里写图片描述

  以上两种模板的系数之和为0,这是为了使经过模板运算的图像的均值不变。拉普拉斯算子增强了图像中的灰度不连续区域,而减弱了图像中灰度值缓慢变化区域对比度,将这样的结果叠加到原始图像中,就可以得到瑞华后的额图像。
  • 1

(2)高频提升滤波
图像的锐化效果可以通过叠加图像的微分结果得到,也可以通过减除图像积分结果得到。
设原始图像为f(x,y),平滑后的图像为g(x,y):

非锐化掩模:h(x,y) = f(x,y)-g(x,y)

锐化图像:{ f(x,y)- g(x,y) } + f(x,y)

高频提升滤波:把院士图形乘以一个放大系数A,再减去平滑图像

这里写图片描述
可转化为:
这里写图片描述
当A=1时,为非锐化掩模;
当A=2时,为非锐化掩模化。

3、非线性平滑滤波

(1)中值滤波:对模板下对应的像素值进行升序排序,选取中间值作为结果。
这里写图片描述
(2)与中值滤波类似的,还有最大值、最小值、中点滤波
这里写图片描述

以上四种滤波也称之为百分比滤波,百分比滤波基于模板的排序来工作,又叫作序统计滤波。

图像滤波算法

阅读数 132

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