图像中的模板
图像中的大部分运算都是通过卷积运算完成的
卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别与卷积核(权矩阵)的每个元素对应相乘,所有乘积之和作为区域中心像素的新值
卷积核:卷积时使用到的权,用一个矩阵表示,该矩阵与使用的图像区域大小相同,其行、列都是奇数,是一个权矩阵(之所以是奇数行列式为了保证唯一的中心)对于卷积核而言,中心元素的坐标为(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算子)
一阶微分表示为:
二阶微分表示为:
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,因为最后一个字符是'\0',当输入过长的时候,只取前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()!= '\n');
for (int i = 0;i < p.size();i++)
{
cout << p[i]<<" ";
}*/
总结:对于指定长度数组,我们直接cin>>a[i]即可,但对于键盘输入随机长度数组,需要用 getchar()判断是否结束输入.并且采用do{}while();的格式才可以。