【学习笔记】OpenCv+C++(四)

家住魔仙堡 提交于 2020-02-08 04:08:09

  图像的模糊
        模糊原理
            Smooth/Blur是图像处理中最简单和常用的操作之一
            使用该操作的原因之一就为了给图像预处理时候减低噪声
            使用Smooth/Blur操作器背后是数学的卷积计算
                g(i,j) = 求和(f(i+k,j+I)h(k,I))
            通常这些卷积算子计算都是线性操作,所以有叫线性滤波

            假设有6x6的图像像素点矩阵
            卷积过程:6x6上面是个3x3的窗口,从左向右,从上向下移动
            黄色的每个像个像素点之和取平均值赋给中心红色像素作为它卷积处理之后新的像素值。每次移动一个像素格。
            边缘处理最简单的方法:
                向外扩张。插值
            归一化盒子滤波(均值滤波)
               权重不同
            高斯滤波
               相对于均值滤波,会保留像素原有的特质
            相关API
                均值模糊
                   blur(Mat src,Mat dst,Size(xradius,yradius),Point(-1,-1));
                    //注意:point表示中心像素在哪里,(-1,-1)默认正中心
                   dst(x,y) = 求和(Kernel(x1,y1)*src(x+x1-anchor.x,y+y1-anchor.y))
                高斯模糊
                   GaussianBlur(Mat src,Mat dst,Size(11,11),sigmax,sigmay);
                   其中Size(x,y),x,y必须是正数而且是奇数

  #include<opencv2/opencv.hpp>
          #include<iostream>
          using namespace cv;
          int main(int argc,char** argv){
              Mat src,dst;
              src = imread("");
              if(!src.data){
                  cout<<"could not load image!@_@"<<endl;
                  return -1;
              }
              char input_title[] = "input image";
              char output_title[] = "output image";
              namedWindow(input_title,CV_WINDOW_AUTOSIZE);
              namedWindow(output_title,CV_WINDOW_AUTOSIZE);
              imshow(input_title,src);
              blur(src,dst,Size(1,11),Point(-1,-1));
              imshow(output_title,dst);

              GaussianBlur(src,dst,Size(5,5),11,11);
              imshow("GaussianBlur",dst);
               waitKey(0);
               return 0;
          }


 中值滤波
             统计排序滤波器
             中值对椒盐噪声有很好的抑制作用
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
         双边滤波
             均值模糊无法克服边缘像素信息丢失缺陷。原因是均值滤波是基于平均权重
            高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同
            高斯双边模糊是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变。
          中值模糊:medianBLur(Mat src,Mat dest,ksize)
          双边模糊:bilateralFilter(src,dest,d=15,150,3);
             15计算的半径,半径之内的像素都会被纳入计算,如果提供-1,则根据sigma space参数取值
             150  sigma color决定多少插值之内的像素会被计算
             3 sigma space如果d的值大于0则声明无效,否则根据它来计算d值
        中值模糊的ksize大小必须是大于而且必须是奇数

 #include<opencv2/opencv.hpp>
         #include<iostream>
         using namespace cv;
         int main(int argc,char** argv){
             Mat src,dst;
             src = imread("");
             if(!src.data){
                 printf("could not load image...\n");
                 return -1;
             }
             namedWindow("input image",CV_WINDOW_AUTOSIZE);
             imshow("input image",src);
             //medianBlur(src,dst,3);//中值模糊
             bilateralFilter(src,dst,15,150.3);//双边模糊
             namedWindow("median Filter Result",CV_WINDOW_AUTOSIZE);
             imshow("median Filter Result",dst);

             Mat gBlur;
             GaussianBlur(src,gBlur,Size(15,15),3,3);
             imshow("GaussianBlur image",gBlur);

             Mat resultImg;
             Mat kernel = (Mat_<int>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
             filter2D(dst,resultImg,-1,kernel,Point(-1,-1),0);
             imshow("Final Result",resultImg);
             waitKey(0);
             return 0;
         }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!