图像增强 空域滤波和频域滤波

图像的真强即为图像的滤波,分为空间滤波和频域滤波
空间滤波可分为线性滤波和非线性滤波
空域滤波算法在进行高通或低通滤波时,采用的手法都是一样的,即小区域模版卷积

1.线性平滑滤波器:
用3*3模版中心与待处理图像的每个像素点重合,将模版各值与其下像素点相乘,几种典型模版:
{ 0,1,0,
1,1,1,
0,1,0,
4,3
},
{
1,1,1,
1,0,1,
1,1,1,
8,3
},
{
1,1,1,
1,1,1,
1,1,1,
9,3
},
{
1,1,1,
1,2,1,
1,1,1,
10,3
},
{/高斯滤波模版
1,2,1,
2,4,2,
1,2,1,
16,3
   
     
     
     
     
  1. /*************************************************************************
  2. *
  3. * 函数名称:
  4. * KernelFilter()
  5. *
  6. * 参数:
  7. * BYTE* bmp,LONG width,LONG height ------图像参数
  8. KERNEL kernel ---------模版
  9. *
  10. * 返回值:
  11. * BOOL - 成功返回TRUE,否则返回FALSE。
  12. *
  13. * 说明:
  14. * 该函数对图象进行二维快速沃尔什——哈达马变换。
  15. *
  16. ************************************************************************/
  17. voidKernelFilter(BYTE *bmp,LONG width,LONG height,KERNEL kernel);
  18. /*************************************************************************
  19. *
  20. * 函数名称:
  21. * BmpFilter()
  22. *
  23. * 参数:
  24. * BYTE *srcBmp --------原图像
  25. BYTE *desBmp --------转换后图像
  26. LONG width,LONG height ------图像参数
  27. *
  28. * 返回值:
  29. * BOOL - 成功返回TRUE,否则返回FALSE。
  30. *
  31. * 说明:
  32. * 该函数将原图像转换为由1填充的图像,方便进行模版滤波。
  33. *
  34. ************************************************************************/
  35. voidBmpFilter(BYTE *desBmp,BYTE *srcBmp,LONG width,LONG height);
  36. voidMyProcess::BmpFilter(BYTE *desBmp,BYTE *srcBmp,LONG width,LONG height)
  37. {
  38. LONG i,j;
  39. memset(desBmp,0,(width+6)*(height+2));
  40. for(i=0;i<height;i++)
  41. for(j=0;j<width;j++)
  42. {
  43. desBmp[(i+1)*(width+6)+j+3]=srcBmp[i*width+j];
  44. }
  45. }
  46. voidMyProcess::KernelFilter(BYTE *bmp,LONG width,LONG height,KERNEL kernel)
  47. {
  48. LONG i,j;
  49. //申请一个临时空间,由1包围bmp图像,方便进行模版处理
  50. BYTE *temp_bmp =new BYTE[(width+6)*(height+2)];
  51. BmpFilter(temp_bmp,bmp,width,height);
  52. //模版滤波
  53. for(i=1;i<height+1;i++)
  54. for(j=3;j<width+3;j++)
  55. {
  56. LONG k,m,temp=0;
  57. for(k=-1;k<kernel.Dimention-1;k++)
  58. for(m=-1;m<kernel.Dimention-1;m++)
  59. {
  60. int a = temp_bmp[(i+k)*(width+6)+j+m*3];
  61. int b = kernel.Element[k+1][m+1];
  62. temp+=a*b;
  63. }
  64. temp/=kernel.Divisor;
  65. //            //此处注意,不应将值给待处理对象,而应传给未处理的原图像
  66. // temp_bmp[i*(width+6)+j] = (BYTE)temp;
  67. bmp[(i-1)*width+j-3]= temp;
  68. }
  69. delete[] temp_bmp;
  70. }

线性锐化滤波器:
锐化即使模糊图像变清晰,可用原始图像经放大A倍后,减去低通图像得到,对于这种模版,中心元素为9A-1,系数和为0.例:
-1 -1 -1        -2 -2 -2
-1  8 -1        -2 16 -2
-1 -1 -1        -2 -2 -2
前一种为拉普拉斯算子,可直接调用模版滤波函数

中值滤波:
中值滤波可以在一定程度上克服模糊图像细节的缺点,尤其对脉冲噪声,扫描噪声有较好效果,但图像细节过多时效果不好
把领域像素按灰度级进行排序,取中间值。
   
     
     
     
     
  1. /*************************************************************************
  2. *
  3. * 函数名称:
  4. * MedianFilter()
  5. *
  6. * 参数:
  7. * BYTE* bmp,LONG width,LONG height ------图像参数
  8. *
  9. * 返回值:
  10. * BOOL - 成功返回TRUE,否则返回FALSE。
  11. *
  12. * 说明:
  13. * 该函数对图象进行中值滤波。
  14. *
  15. ************************************************************************/
  16. voidMedianFilter(BYTE *bmp,LONG width,LONG height);
   
     
     
     
     
  1. voidMyProcess::MedianFilter(BYTE *bmp,LONG width,LONG height)
  2. {
  3. LONG i,j;
  4. //申请一个临时空间,由1包围bmp图像,方便进行模版处理
  5. BYTE *temp_bmp =new BYTE[(width+6)*(height+2)];
  6. BmpFilter(temp_bmp,bmp,width,height);
  7. //中值滤波
  8. //待排序值
  9. int value[9];
  10. for(i=1;i<height+1;i++)
  11. for(j=3;j<width+3;j++)
  12. {
  13. LONG k,m,temp=0;
  14. for(k=-1;k<2;k++)
  15. for(m=-1;m<2;m++)
  16. {
  17. value[(k+1)*3+(m+1)]= temp_bmp[(i+k)*(width+6)+j+m*3];
  18. }
  19. sort(value,value+9);
  20. //
  21. //此处注意,不应将值给待处理对象,而应传给未处理的原图像
  22. // temp_bmp[i*(width+6)+j] = (BYTE)temp;
  23. bmp[(i-1)*width+j-3]= value[4];
  24. }
  25. delete[] temp_bmp;
  26. }
还有一种与之类似的排序统计滤波器----百分比滤波器,先对模版下的元素进行排序,再按某个确定的百分比选取序列中相应的像素值作为模版输出。

非线性锐化滤波器:
图像的模糊是由于平均或积分运算而产生的,因此通过积分的逆运算可以达到去除模糊,增强边界的目的。

浮雕滤波特效:
浮雕特效是将图像一侧值减去另一侧的值,代替原值,以使边缘(颜色变化大的地方)突出,例如:
-1 0 0    1 0 0,取图像左上角与右下角的差值,还有如:
0 0 0    0 0 0
0 0 1    0 0 -1
   
     
     
     
     
  1. //浮雕效果模版 下标7到13
  2. {-1,0,0,
  3. 0,0,0,
  4. 0,0,1,
  5. 1,3
  6. },
  7. {1,0,0,
  8. 0,0,0,
  9. 0,0,-1,
  10. 1,3
  11. },
  12. {0,0,-1,
  13. 0,0,0,
  14. 1,0,0,
  15. 1,3
  16. },
  17. {0,0,1,
  18. 0,0,0,
  19. -1,0,0,
  20. 1,3
  21. },
  22. {-1,0,-1,
  23. 0,0,0,
  24. 1,0,1,
  25. 1,3
  26. },
  27. {-1,0,1,
  28. 0,0,0,
  29. 1,0,-1,
  30. 1,3
  31. },
  32. {1,0,1,
  33. 0,0,0,
  34. -1,0,-1,
  35. 1,3
  36. },
  37. {1,0,-1,
  38. 0,0,0,
  39. -1,0,1,
  40. 1,3
  41. }
可利用模版滤波代码,更改一些条件:
增加type,用以判断是否是浮雕处理,浮雕处理的话,kernel除以的系数应为1,且计算后的temp应+128以增强视觉效果,否则非边缘部分会因为颜色值相近而减过后为很小的值,而显示黑色。另外还要使temp在(0,255)内,防止超出。
   
     
     
     
     
  1. voidMyProcess::KernelFilter(BYTE *bmp,LONG width,LONG height,KERNEL kernel,int type)
  2. {
  3. LONG i,j;
  4. //申请一个临时空间,由1包围bmp图像,方便进行模版处理
  5. BYTE *temp_bmp =new BYTE[(width+6)*(height+2)];
  6. BmpFilter(temp_bmp,bmp,width,height);
  7. //模版滤波
  8. for(i=1;i<height+1;i++)
  9. for(j=3;j<width+3;j++)
  10. {
  11. LONG k,m,temp=0;
  12. for(k=-1;k<kernel.Dimention-1;k++)
  13. for(m=-1;m<kernel.Dimention-1;m++)
  14. {
  15. int a = temp_bmp[(i+k)*(width+6)+j+m*3];
  16. int b = kernel.Element[k+1][m+1];
  17. temp+=a*b;
  18. }
  19. temp/=kernel.Divisor;
  20. //
  21. //此处注意,不应将值给待处理对象,而应传给未处理的原图像
  22. // temp_bmp[i*(width+6)+j] = (BYTE)temp;
  23. if(type==1)
  24. {
  25. temp = max(0,min(temp+128,255));
  26. }
  27. bmp[(i-1)*width+j-3]= temp;
  28. }
  29. delete[] temp_bmp;
  30. }
频域滤波:
空域的模版运算即是空域的卷积运算的简单实现,而空域的卷积运算等于频域的乘法运算。处理后的频域图像G=F*H
F为源图像的频域值,H为转移函数。由H的不同,可将频域的处理方法分为低通滤波,高通滤波以及带通,带阻滤波等等

你可能感兴趣的:(图像处理,图像处理,图像增强,空域滤波和频域滤波)