局部预处理之使用旋转掩膜平均

介绍

本节主要介绍图像平滑方法使用旋转掩膜的平均的算法

基本理论

使用旋转掩膜技术的图像平滑算法如下:

1. 考虑图像的每个像素(i,j)

2.根据式计算像素(i,j)所有可能的旋转掩膜的散步;

3.选择具有最小散布的掩膜。

4.将所选掩膜内的平均亮度赋给输出图像中的像素(i,j)。

使用旋转掩膜的平均(averaging using a rotating mask)是一种非线性的平滑方法,它通过搜索当前像素邻域的同态部分,可以避免边缘模糊。其结果实际上是锐化图像。亮度的平均只在这个区域计算,一个亮度散布用作区域一致性度量。设区域R的像素数目是n且输入图像是g.散布如下计算:

式(5.29)的散布计算的计算复杂度经如下改写后可以减少:

计算出了区域一致性,我们来考虑形态和大小。如图5.11 给出了3x3的掩膜的8种可以的旋转,覆盖了当前像素的一个5x5的邻域。第9个掩膜是当前像素自身的一个3x3邻域。也可以使用其他掩膜形态。图5.12给出了覆盖了当前像素的一个5x5的邻域的另一给8个掩膜。第9个掩膜还是当前像素自身的一个3x3邻域。另一种可能性是旋转一个小的2x1模板覆盖当前像素的3x3邻域。

 

另一种可能是,旋转一个小的2x1模板,以覆盖当前像素的3x3邻域。

使用旋转掩膜技术的图像平滑算法

算法:使用旋转掩膜的平均

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. 1.考虑图像的每个像素(i,j).  
  2. 2.根据(5.29)式计算像素(i,j)所有可能的旋转掩膜的散布.    
  3. 3.选择具有最小散布的掩膜.  
  4. 4.将所选掩膜内的平均亮度赋给输出图像中的像素(i,j).  

此算法可以迭代地使用,迭代过程会相当快地收敛到一个稳定状态。掩膜的大小和形态影响收敛速度。

 

Matlab代码

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. % Usage: im_out = rotmask(im,method,datatype)    
  2. % Outputs:  im_out  [m x n]  Filtered image.     
  3.     
  4. if nargin<3    
  5.   datatype = 'double';    
  6. end    
  7. if nargin<2    
  8.   method = 'vectorized';    
  9. end    
  10.     
  11. imdatatype = class(im);    
  12.     
  13. VECTORIZED = strcmp(lower(method),'vectorized');    
  14. INTEGRAL = strcmp(lower(method),'integral');    
  15. LOOP = strcmp(lower(method),'loop');    
  16.       
  17. if size(im,3)>1    
  18.   error('rot_mask does not work for full-colour images')     
  19. end    
  20.     
  21. mask_size = 9; % size of the rotating mask    
  22. mask=logical(zeros(5,5,mask_size));    
  23.     
  24. im = double(im);      
  25. im_out = zeros(size(im));    
  26.     
  27. if INTEGRAL     
  28. im_integral = feval( datatype, integralim(im) );    
  29. imsquare_integral = feval( datatype, integralim(im.^2) );    
  30.   
  31. mask = zeros(2,4,9);    
  32. mask(:,:,1) = [-3 -3 0 0; -1 2 -1 2];    
  33. mask(:,:,2) = [-3 -3 0 0; -2 1 -2 1];    
  34. mask(:,:,3) = [-3 -3 0 0; -3 0 -3 0];    
  35. mask(:,:,4) = [-2 -2 1 1; -3 0 -3 0];    
  36. mask(:,:,5) = [-1 -1 2 2; -3 0 -3 0];    
  37. mask(:,:,6) = [-1 -1 2 2; -2 1 -2 1];    
  38. mask(:,:,7) = [-1 -1 2 2; -1 2 -1 2];    
  39. mask(:,:,8) = [-2 -2 1 1; -1 2 -1 2];    
  40. mask(:,:,9) = [-2 -2 1 1; -2 1 -2 1];    
  41.     
  42. im_int_mat = zeros( 4,(size(im,1)-4)*(size(im,2)-4), 9,class(im_integral));    
  43. im_sq_mat  = zeros( 4,(size(im,1)-4)*(size(im,2)-4), 9,class(imsquare_integral));    
  44. row_pos = 3 : size(im,1)-2;    
  45. col_pos = 3 : size(im,2)-2;    
  46. for i = 1:9    
  47.   for j = [1 4] % for each of the +corner     
  48.     row_mask_pos = row_pos(1)+mask(1,j,i)+1 : row_pos(end)+mask(1,j,i)+1;    
  49.     col_mask_pos = col_pos(1)+mask(2,j,i)+1 : col_pos(end)+mask(2,j,i)+1;    
  50.     im_int_mat(j,:,i) = ...    
  51.       reshape(im_integral(row_mask_pos,col_mask_pos),1,size(im_int_mat,2));    
  52.     im_sq_mat(j,:,i)  = ...    
  53.       reshape(imsquare_integral(row_mask_pos,col_mask_pos),1,size(im_sq_mat,2));    
  54.   end    
  55.   for j = [2 3]     
  56.     row_mask_pos = row_pos(1)+mask(1,j,i)+1 : row_pos(end)+mask(1,j,i)+1;    
  57.     col_mask_pos = col_pos(1)+mask(2,j,i)+1 : col_pos(end)+mask(2,j,i)+1;    
  58.     im_int_mat(j,:,i) = ...    
  59.      -reshape(im_integral(row_mask_pos,col_mask_pos),1,size(im_int_mat,2));    
  60.     im_sq_mat(j,:,i)  = ...    
  61.      -reshape(imsquare_integral(row_mask_pos,col_mask_pos),1,size(im_sq_mat,2));    
  62.   end    
  63. end    
  64.     
  65. sums = squeeze( sum(im_int_mat,1) )';    
  66. means = sums./mask_size;    
  67. sums_squares = squeeze( sum(im_sq_mat,1) )';    
  68. variances = mask_size*(means.^2) + sums_squares - 2*means.*sums;    
  69.    
  70. [foo,idx_mins] = min(variances);    
  71.   
  72. im_filt = means(sub2ind(size(means),idx_mins,[1:size(means,2)]));    
  73. im_filt = reshape( im_filt, length(row_mask_pos), length(col_mask_pos) );    
  74. im_out(3:end-2,3:end-2) = im_filt;    
  75. else % VECTORIZED and LOOP methods loop over (almost) all pixels in image    
  76. basic_shape = 1;    
  77.   
  78. mask(1:3,3:5,1) = basic_shape;    
  79. mask(1:3,2:4,2) = basic_shape;    
  80. mask(2:4,2:4,9) = basic_shape;    
  81.    
  82. for i = 3:8    
  83.   mask(:,:,i) = rot90( mask(:,:,i-2) );    
  84. end    
  85.   
  86. variances = zeros(1,9);    
  87. for i = 3:size(im,1)-2    
  88.   for j = 3:size(im,2)-2    
  89.     if VECTORIZED    
  90.       sub_mat = im( i-2:i+2, j-2:j+2, ones(9,1) );     
  91.       sub_mat = reshape( sub_mat(mask), mask_size, 9 );     
  92.       means = sum(sub_mat)/mask_size;     
  93.    
  94.       variances = sum( (sub_mat-means(ones(mask_size,1),:)).^2 );    
  95.       [min_disp,idx_min] = min(variances);       
  96.       im_out(i,j) = means(idx_min);              
  97.     elseif LOOP    
  98.       sub_im = im( i-2:i+2, j-2:j+2 );    
  99.       for m = 1:9   
  100.         vec = sub_im( mask(:,:,m) );     
  101.         variances(m) = sum( (vec-sum(vec)/mask_size).^2 );     
  102.       end    
  103.       [min_disp,idx_min] = min(variances);    
  104.       im_out(i,j) = sum( sub_im(mask(:,:,idx_min)) ) / mask_size;    
  105.     else    
  106.       error('Unknown method');    
  107.     end    
  108.   end % for columns     
  109.   fprintf( 1, '\b\b\b\b\b\b\b\b %05.2f %%', 100*(i-2)/(size(im,1)-2) );    
  110. end % for rows    
  111. fprintf(1,'\b\b\b\b\b\b\b\b %05.2f %% \n',100)    
  112. end % if INTEGRAL    
  113.     
  114. if strcmp(imdatatype,'uint8')    
  115.   im_out = uint8(round(im_out));    
  116. end    
  117. if strcmp(imdatatype,'uint16')    
  118.   im_out = uint16(round(im_out));    
  119. end    
  120. if strcmp(imdatatype,'double') | strcmp(imdatatype,'single')    
  121.   im_out = im_out/255;    
  122. end    
  123.     
  124. return; % end of rotmask   

测试输出结果

原始图像如下所示:

输出图像如下所示:

参考文献

[1] Svoboda T.nKybic J., and Hlavac V. "Image Processing Analysis and Machine Vision" Thomson Engineering 2008.

posted @ 2016-06-23 12:35  emg0818  阅读(613)  评论(0编辑  收藏  举报