Shaos wrote:вот тут ещё можно подсмотреть и попробовать матрицы коэффициентов для сглаживания и подчёркивания границ: https://generic-github-user.github.io/Image-Convolution-Playground/src/
(значения в матрице брались с википедии: https://en.wikipedia.org/wiki/Kernel_%28image_processing%29 - интересно, что в русской версии статьи есть дополнительные матрицы)
Вот матрицы фильтров из моей дипломной работы (метод Filter был частью класса для работы с изображениями в градациях серого BWS, который я написал в 1995 году):
Code: Select all
int BWS::Filter(int f)
{ double d;
int i,j,i1,j1,n,o,m[3][3];
switch(f)
{ case SMOOTH:
n=9;
m[0][0]=1;m[0][1]=1;m[0][2]=1;
m[1][0]=1;m[1][1]=1;m[1][2]=1;
m[2][0]=1;m[2][1]=1;m[2][2]=1;
break;
case GAUSS:
n=16;
m[0][0]=1;m[0][1]=2;m[0][2]=1;
m[1][0]=2;m[1][1]=4;m[1][2]=2;
m[2][0]=1;m[2][1]=2;m[2][2]=1;
break;
case STRESS1:
n=1;
m[0][0]=0;m[0][1]=-1;m[0][2]=0;
m[1][0]=-1;m[1][1]=5;m[1][2]=-1;
m[2][0]=0;m[2][1]=-1;m[2][2]=0;
break;
case STRESS2:
n=1;
m[0][0]=-1;m[0][1]=-1;m[0][2]=-1;
m[1][0]=-1;m[1][1]=9;m[1][2]=-1;
m[2][0]=-1;m[2][1]=-1;m[2][2]=-1;
break;
case STRESS3:
n=1;
m[0][0]=1;m[0][1]=-2;m[0][2]=1;
m[1][0]=-2;m[1][1]=5;m[1][2]=-2;
m[2][0]=1;m[2][1]=-2;m[2][2]=1;
break;
}
CopyScrMem();
for(i=0;i<(col-2);i++){
for(j=0;j<(row-2);j++){
d=0.0;
for(i1=0;i1<3;i1++){
for(j1=0;j1<3;j1++){
d+=m[i1][j1]*GetPixelMem(i+i1,j+j1);
}}
d/=n;
o=round(d);
if(o<0)o=0;
if(o>63)o=63;
PutPixelScr(i+1,j+1,o);
}}
DelMem();
return err;
}
