图像二值化

一:大津阈值及其变种

该方法的核心就是计算背景和前景的最大类间方差,把类间方差最大的像素值作为全局二值化的阈值,计算费时。全局阈值,要根据适用场景选择性的应用。

变种:在[0 T] 内继续寻找ostu值, 在[T 255]内继续寻找ostu值。

 

[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. clear;  
  2. close all;  
  3. clc;  
  4.   
  5. G = imread('input.JPG');    
  6. I = rgb2gray(G);    
  7.     
  8. [m,n] = size(I);    
  9. Hist = zeros(255);  
  10. dHist = zeros(255);    
  11. variance = zeros(255);  
  12. PXD = 0;    
  13.     
  14. for i = 1:m    
  15.     for j = 1:n    
  16.         Hist(uint8(I(i,j))) = Hist(uint8(I(i,j))) + 1;    
  17.     end    
  18. end    
  19.     
  20. for i = 1:255    
  21.     dHist(i) = Hist(i)/(m*n);    
  22. end    
  23.     
  24. for PXD = 1:255    
  25.     w0 = 0;    
  26.     w1 = 0;    
  27.     g0 = 0;    
  28.     g1 = 0;    
  29.     for i = 1:PXD    
  30.         g0 = g0 + i*dHist(i);    
  31.         w0 = w0 + dHist(i);    
  32.     end    
  33.     for i = PXD+1 : 255    
  34.         g1 = g1 + i*dHist(i);    
  35.         w1 = w1 + dHist(i);    
  36.     end    
  37.     variance(PXD) = w0*w1*(g0 - g1)*(g0 - g1);    
  38. end    
  39.     
  40. PXD = 1;    
  41. for i = 1:255    
  42.     if variance(PXD) < variance(i)    
  43.         PXD = i;    
  44.     end    
  45. end    
  46.     
  47. for  i = 1:m    
  48.     for j = 1:n    
  49.         if I(i,j) > PXD     
  50.             I(i,j) = 255;    
  51.         else    
  52.             I(i,j) = 0;    
  53.         end    
  54.     end    
  55. end        
  56. imagBW = I  


二:Bernsen算法实现图像二值化,该方法属于局部方法

  1. clc;  
  2. clear;  
  3. close all;    
  4.     
  5. I = imread('input.bmp');    
  6.     
  7. w = 1;  
  8. T = 0;  
  9. max = 0;    
  10. min = 0;    
  11. [m,n] = size(I);    
  12. T = zeros(m - 2*w,n - 2*w);    
  13.     
  14.   
  15. for i = (w + 1):(m - w)    
  16.     for j = (w + 1):(n - w)    
  17.         max = uint8(I(i,j));    
  18.         min = uint8(I(i,j));    
  19.         for k = -w:w    
  20.             for l = -w:w    
  21.                 if max < uint8(I(i + k,j + l))    
  22.                     max = uint8(I(i + k,j + l));    
  23.                 end    
  24.                 if min > uint8(I(i + k,j + l))    
  25.                     min = uint8(I(i + k,j + l));    
  26.                 end    
  27.             end    
  28.         end    
  29.         T(i,j) = 0.5*(max + min);    
  30.     end    
  31. end    
  32. for i = (w + 1):(m - w)    
  33.     for j = (w + 1):(n - w)    
  34.         if I(i,j) > T(i,j)    
  35.             I(i,j) = uint8(255);    
  36.         else    
  37.             I(i,j) = uint8(0);    
  38.         end    
  39.     end    
  40. end    
  41. imshow(I);    


三:Niblack 二值化

该方法仍然是一种二值化方法,阈值的计算公式是T = local_avg + k*v,其中local_avg表示以该像素点为中心的区域的平均灰度值,v是该区域的标准差,k是一个可以调节的系数

  1. clc;  
  2. clear;  
  3. close all;  
  4.   
  5. I = imread('input.bmp');  
  6. I = rgb2gray(I);  
  7.   
  8. w =  2;  
  9. max = 0;     
  10. min = 0;     
  11. [m,n] = size(I);     
  12. T = zeros(m ,n );     
  13.     
  14. for i = (w + 1):(m - w)     
  15.     for j = (w + 1):(n - w)        
  16.         sum = 0;  
  17.         for k = -w:w     
  18.             for l = -w:w     
  19.                 sum = sum + uint32(I(i + k,j + l));  
  20.             end     
  21.         end     
  22.         average = double(sum) /((2*w+1)*(2*w+1));  
  23.         s = 0;  
  24.         for k = -w:w     
  25.             for l = -w:w     
  26.                 s = s +   (uint32(I(i + k,j + l)) - average)*(uint32(I(i + k,j + l)) - average);  
  27.             end     
  28.         end     
  29.         ssqrt(double(s)/((2*w+1)*(2*w+1)));  
  30.           
  31.         T(i,j) = average + 0.2*s;  
  32.     end     
  33. end     
  34. for i =  1:m   
  35.     for j = 1:n   
  36.         if I(i,j) > T(i,j)     
  37.             I(i,j) = uint8(255);     
  38.         else    
  39.             I(i,j) = uint8(0);     
  40.         end     
  41.     end     
  42. end     
  43. imshow(I);    


四:局部block分析二值化方法

Block Analysis大体思想是基于Niblack算法的,只不过把图像进行分块,然后对每一块计算阈值,T = local_avg + k*v,其中local_avg表示以该像素点为中心的区域的平均灰度值,v是该区域的标准差,k是一个可以调节的系数

  1. clc;  
  2. clear;  
  3. close all;  
  4.   
  5. I = imread('100_1243.JPG');  
  6.   
  7. I = rgb2gray(I);  
  8. [m,n] = size(I);  
  9.   
  10. block = 10;  
  11. ver = floor(m/block);  
  12. hor = floor(n/block);  
  13. T = zeros(m,n);  
  14. for b_ver = 1:block  
  15.     for b_hor = 1: block  
  16.         t = 0;  
  17.         for i = (ver * (b_ver - 1)+1) : (ver * b_ver)  
  18.             for j = (hor * (b_hor - 1) + 1):(hor * b_hor)  
  19.                 t = t + uint32(I(i,j));  
  20.             end  
  21.         end  
  22.         t =  double(t)/(ver * hor);  
  23.         std_deviation = 0;  
  24.         for i = (ver * (b_ver - 1)+1) : (ver * b_ver)  
  25.             for j = (hor * (b_hor - 1) + 1):(hor * b_hor)  
  26.                 std_deviation = std_deviation + (uint32(I(i,j)) - t)*(uint32(I(i,j)) - t);  
  27.             end  
  28.         end  
  29.         std_deviation = sqrt(double(std_deviation)/(ver*hor));  
  30.           
  31.         thr = t + 0.2*std_deviation;  
  32.           
  33.         for i = (ver * (b_ver - 1)+1) : (ver * b_ver)  
  34.             for j = (hor * (b_hor - 1) + 1):(hor * b_hor)  
  35.                 if I(i,j) > uint8(floor(thr))  
  36.                     T(i,j) = 255;  
  37.                 else  
  38.                     T(i,j) = 0;  
  39.                 end  
  40.             end  
  41.         end  
  42.     end  
  43. end  
  44. imshow(T);  


五:sauvola二值化算法

将图像分块,每块内的均值为local_avg. 阈值T=local_avg*(1+k*(s/R-1)) 其中k为可以调节的阈值,常取0.5,s为局部像素和均值的标准差,s=(pix_val - local_avg)^2/block_pixel_count. R = 128. 该方法在保留图像细节方面有很强的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值