1. 程式人生 > >影象增強 空域濾波和頻域濾波

影象增強 空域濾波和頻域濾波

影象的真強即為影象的濾波,分為空間濾波和頻域濾波 空間濾波可分為線性濾波和非線性濾波 空域濾波演算法在進行高通或低通濾波時,採用的手法都是一樣的,即小區域模版卷積 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];