图像中的模板

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

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

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

 

 

原文地址:https://www.cnblogs.com/shaonianpi/p/12768810.html