• 图像中的模板


    图像中的大部分运算都是通过卷积运算完成的

    卷积运算可看作是加权求和的过程,使用到的图像区域中的每个像素分别与卷积核(权矩阵)的每个元素对应相乘,所有乘积之和作为区域中心像素的新值

    卷积核卷积时使用到的权,用一个矩阵表示,该矩阵与使用的图像区域大小相同,其行、列都是奇数,是一个权矩阵(之所以是奇数行列式为了保证唯一的中心)对于卷积核而言,中心元素的坐标为(0,0);

    假设3 * 3的像素区域R与卷积核G分别为:

     则卷积运算为:

                  R5(中心像素)=R1G1 + R2G2 + R3G3 + R4G4 + R5G5 + R6G6 + R7G7 + R8G8 + R9G9

    2、使用模板处理图像时涉及到的问题:

          边界问题:当处理图像边界像素时,卷积核与图像使用区域不能匹配,卷积核的中心与边界像素点对应,卷积运算将出现问题。

          处理办法:

                  A忽略边界像素,即处理后的图像将丢掉这些像素。

                  B保留原边界像素,即copy边界像素到处理后的图像。

    3、常用模板:

          a低通滤波器

      (b高通滤波器

    可见,低通滤波器和高通滤波器卷积核所有元素之和为1.而高通滤波器中心元素和领域元素异号

    (c)边缘检测

     

     

    对于边缘检测而言,卷积核所有元素和为0.

     

    边缘检测而言,分为一阶微分边缘检测算子(比如sobel算子)和二阶微分边缘检测算子(比如laplace算子)

     

    一阶微分表示为

     

     二阶微分表示为:

     

     

     

     

     

     

     

    输入整数:cin

       int num1,num2;
       cin>>num1>>num2;//空格或者回车隔开
       cout<<"result:"<<num1+num2<<endl;

    输入字符

     char cha1,cha2;
       cin>>cha1>>cha2;//空格或者回车隔开
       cout<<"cha1:"<<cha1<<",cha2:"<<cha2<<endl;//当输入多个字符的时候,下一次的输入是无效的*/

    输入无空格的字符串 char str[10],string str;

    cin>>str;(但这样的输入,只要没有空格,你输入多少字符,就会输出多少字符,不会受到长度10的限制,当然了,对于string str 本身就没有长度限制)。

     //test3:输入一个无空格字符串 
      /* char str11[10];
       string str22;
       cin>>str11;
       cout<<"str11:"<<str11<<endl;
       cin>>str22;
       cout<<"str22:"<<str22<<endl;

    输入带空格的字符串 char str[10], string str1;

    对于字符数组char[]:cin.getline(str,10)(这种方式注意输入长度不能超度9,因为最后一个字符是'',当输入过长的时候,只取前9个字符);

    对于字符串str1:getline(cin,str1);(getline()是string流函数,这个对输入长度是没有限制的)

     //test4:输入一个带空格的字符串
       char cha3[10];
       string cha4;
       cin.getline(cha3,10);//允许空格
       cout<<"cha3:"<<cha3<<endl;
       getline(cin,cha4);//允许空
        cout<<"cha4:"<<cha4<<endl;

    连续输入不带空格的两个字符串 char str1[10],char str2[10](string str1,string str2);

         //test5:输入不带空格的两个字符串
        char strf[10];
        char strs[10];
        cin>>strf>>strs;//(输入字符串1 回车;输入字符串2 回车;注意输入长度不要超过给定长度,否则第一个字符串没有输出)
        cout<<"first:"<<strf<<",second:"<<strs<<endl;

       //test5:输入两个不带空格的字符串
       string str1,str2;
       cin>>str1>>str2;//(输入字符串1 回车;输入字符串2 回车;对于string来说,输入字符串没有限制)
       cout<<"str1:"<<str1<<endl;//
       cout<<"str2:"<<str2<<endl;
    总结:使用cin即可,中间用回车分隔

     

    输入带空格的两个字符串 char str1[10],char str2[10](string str1,string str2);

     //test6:输入两个带空格的字符串
       char str_1[10];
       char str_2[10];
       cin.getline(str_1,10);
       cin.getline(str_2,10);//(输入字符串1 回车;输入字符串2 回车;注意输入长度不要超过给定长度,否则第二个字符串没有暑促)
       cout<<"str_1:"<<str_1<<",str_2"<<str_2<<endl;
       
       //test6:输入两个带空格的字符串
       string str_11;
       string str_22;
       getline(cin,str_11);
       getline(cin,str_22);//(输入字符串1 回车;输入字符串2 回车;对于string来说,输入字符串没有限制)
       cout<<"str_1:"<<str_11<<",str_2"<<str_22<<endl;
    总结:对于char str[10],使用cin.getline(str,10),注意输入长度不要超过给定长度10,否则有问题
        对于string str,使用getline(cin,str),对输入长度没有限制;

    输入一个字符串和一个数字(char str[20] ,int num)

        //test7:输入一个字符串,一个数字
       string str_in;//无空格字符串
        //char str_in[10];//无空格字符串
        int num;
        cin>>str_in>>num;//(输入字符串 回车(或者空格);输入数字 回车;)
        cout<<"str:"<<str_in<<",num:"<<num<<endl;
        //test7:输入一个字符串,一个数组
        string str_in1;//有空格字符串
        //char str_in1[10];//有空格字符串
        int num;
        getline(cin,str_in1);
        //cin.getline(str_in1,10);
        cin>>num;//(输入字符串 回车;输入数字 回车;)
        cout<<"str:"<<str_in1<<",num:"<<num<<endl;
    总结:区分字符串是有空格字符串,还是无空格字符串;
        无空格字符串直接用 cin即可,中间用 空格或者回车都能隔开;
        有空格字符串用cin.getline或者getline。中间用回车隔开

    输入一个数组 int a[10] vector<int> a;

    //test8:输入一个数组。int a[10],vector<int> a
       /*// int a[10];//输入指定长度数组
        vector<int>a(10);//输入指定长度数组
         for (int i = 0; i < 10; i++)
       {
           cin >> a[i]; //连续输入时用空格或者回车隔开均可
       }
       for (int i = 0;i < 10;   i++)
       {
           cout << a[i]<<" ";
       }*/

       //test8:输入一个数组。int a[],vector<int> a
       /*vector<int> p;//输入不指定长度
       int tmp;
       do
       {
         cin>>tmp;
         p.push_back(tmp);
       }while(getchar()!= ' ');

    for (int i = 0;i < p.size();i++)
       {
           cout << p[i]<<" ";
       }*/
    总结:对于指定长度数组,我们直接cin>>a[i]即可,但对于键盘输入随机长度数组,需要用 getchar()判断是否结束输入.并且采用do{}while();的格式才可以。

     

     

  • 相关阅读:
    Web应用程序的开发步骤
    APAP INCLUDE
    2015-07-12
    oracle自定义异常
    java quartz 设置定时任务串行执行
    java stream peek的使用
    java List转String
    Java打jar包后如何获取resource中的文件
    ImmutablePair和ImmutableTriple的使用
    mvn打jar包示例:依赖打入jar包和依赖打到外部文件夹
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/12768810.html
Copyright © 2020-2023  润新知