ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

二值化最佳阈值选取方法以及matlab实现

2026/9/12 10:21:41 拓冰建站 浏览量
二值化最佳阈值选取方法以及matlab实现 文章目录前言一、真彩色图像转换为灰值图像1.转换公式2.转换过程二、最佳阈值选取方法以及matlab实现1.迭代法2.双峰法3.最大类间方差法4.最大熵阈值法前言我们利用arcGIS实现对栅格数据的自动批量矢量化时首先就得需要对栅格图进行二值化处理即先将真彩色栅格图转化为0~255的灰值图像然后选取最佳阈值通过最佳阈值对灰值图像进行归一化处理最后形成像元值为0和1的二值图像。那要使自动矢量化的成果能够达到最佳阈值的选取尤为重要下面介绍几种常见的阈值选取方法以及matlab代码实现。一、真彩色图像转换为灰值图像1.转换公式2.转换过程代码如下示例imshow(imread(影像下载_2208240956.tif)); title(原始图像); RGB_imageimread(影像下载_2208240956.tif); [m,n,l]size(RGB_image); pixelzeros(m,n); for i1:m for j1:n pixel(i,j)0.299*RGB_image(i,j,1)0.587*RGB_image(i,j,2)0.114*RGB_image(i,j,3); end end pixeluint8(pixel); imshow(pixel); title(灰白图像);实现结果二、最佳阈值选取方法以及matlab实现迭代法双峰法最大类间差阈值法最大熵阈值法1.迭代法基本思路迭代法就是利用迭代的方法一次次改变初始阈值使之与由初始阈值计算的新的阈值之间的差值绝对值达到一个足够小或者某一个定值时便可以认为此时的新的阈值为最佳阈值。此方法适用于很多的峰值情况的灰值图。公式初始阈值average_image灰值图的灰度小于初始阈值average_image的平均值灰值图的灰度大于初始阈值T的平均值新的阈值计算新阈值与初始阈值的差值绝对值代码如下示例%迭代平均法 average_imagemean(mean(pixel));%令灰值图像的元素平均值为初始阈值average_image [rows,cols]size(pixel);%求解灰值图像的行列元素值 pixel_numbersrows*cols;%求解灰值图像的元素个数 double_imagedouble(pixel);%将整型灰值图像转换为浮点类型 %前景令灰值图像中大于初始阈值的像元值的总和以及像元个数分别为greater_sum,greater_number greater_sum0;%初始化值 greater_number0;%初始化值 %后景令灰值图像中小于初始阈值的像元值的总和以及像元个数分别为less_sum,less_number less_sum0; less_number0; %初始化迭代阈值 next_image0; %初始化迭代阈值差的绝对值 TOabs(average_image-next_image); sigma0.0001; number_TO0; %开始迭代 while TOsigma %记录迭代次数 number_TOnumber_TO1; for ii1:rows for jj1:cols if double_image(ii,jj)average_image greater_sumgreater_sumdouble_image(ii,jj); greater_numbergreater_number1; end if double_image(ii,jj)average_image less_sumless_sumdouble_image(ii,jj); less_numberless_number1; end end end %计算出前景和后景的平均像元值 average_frontgreater_sum/greater_number; average_behindless_sum/less_number; next_image(average_front-average_behind)/2;%将前后景的均值像元值取平均赋值给迭代阈值 TOabs(average_image-next_image); average_imagenext_image; end %以上迭代之后得到的最佳阈值为average_image,下面进行归一化处理 for iii1:rows for jjj1:cols if double_image(iii,jjj)average_image double_image(iii,jjj)0; else double_image(iii,jjj)1; end end end imshow(double_image); title(迭代法二值图像,color,r,FontSize,15)结果2.双峰法基本原理我们知道一般的灰值图的灰度在0~256上都具有一定的规律首先我们可以先确定其灰度的频率图然后绘制出便可以发现如果呈现出两个峰时我们可以采取两个峰之间的最低值作为最佳阈值。下面两个图分别是灰值图的灰度频率图和灰度直方图由于我运算的图像的灰度值大部分都小于1如果参与阈值的运算则会导致二值化后的图像丢失大部分信息。因此我剔除了小于1的灰度参与运算如果换了图像具体情况视直方图而定。代码如下示例%双峰法,其中pixel为rows*cols灰值图像 mreshape(pixel,1,pixel_numbers);%pixel_numbers为像元个数m是对灰值矩阵进行维度转换便于运算 for op1:256 %查找出行向量m中各灰度值在1~255的255个区间里的频数 num(op,1)length(find(mop mop1)); end sum_numsum(num); for op1:256 %查找出行向量m中各灰度值在1~255的255个区间里的频率 %注意此处除以的是1~255区间的个数将0~1区间的个数剔除 num1(op,1)num(op,1)/sum_num; end %计算出0~1区间的频率和个数 num011-sum(num1); pixel_numbers-sum_num; %说明0~1的频率值太大说明图像的灰度值小于1的太多如果参与阈值的运算将会导致图像的信息丢失 Xlinspace(1,256,256); Ynum1; plot(X,Y); %利用histogrm函数查看图像的灰度值直方图 histogram(double(pixel)); %查找出频率图两个最高峰的灰度值根据图像可以看出左边的最高峰灰度值为28右边的最高峰灰度值为71 [ymax1,tp1]max(Y) ; Y(tp1)min(Y); [ymax2,tp2]max(Y); %以两个最值的平均值来作为最佳阈值 average_image1(tp1tp2)/2; %下面进行归一化处理 double_image1double(pixel); for iii1:rows for jjj1:cols if double_image1(iii,jjj)average_image1 double_image1(iii,jjj)0; else double_image1(iii,jjj)1; end end end imshow(double_image1); title(双峰法二值图像,color,r,FontSize,15)结果3.最大类间方差法最大类间方差法又称为大津法或OSTU算法是由日本学者大津于1979年提出是一种自适应的阈值确定方法。根据初始阈值T取0~256将灰值图分为G0和G1两个区域分别计算其类间方差当方差gt达到最大值时其对应的即为最佳阈值灰度值在0~256的255个区间的频率为 num1公式前景G0组的灰度累计占比后景G1组的灰度累计占比前景G0组的灰度平均值 L(1~256)前景G1组的灰度平均值 L(1~256)类间方差代码如下示例%最大类间方差法 %我们在上一个代码已经算出每一个灰度值出现的概率num1 %G0 包含的像素的灰度值在 0TG1 的灰度值在 T1L-1 %下面计算当T阈值取1~255时第一组W0和第二组W1分别对应的概率和平均灰度值U0和U1 W0cumsum(num1); W11-W0; U0cumsum(X.*num1); flip_num1flip(num1); U1flip(cumsum(X.*flip_num1)); %计算出图像的灰值类间方差以及其gt中最大值对应的灰度值为最佳阈值 gtW0.*W1.*(U0-U1).^2; [gt1,average_image2]max(gt); double_image2double(pixel); for iii1:rows for jjj1:cols if double_image2(iii,jjj)average_image2 double_image2(iii,jjj)0; else double_image2(iii,jjj)1; end end end imshow(double_image2); title(最大类间方差法二值图像,color,r,FontSize,15)结果4.最大熵阈值法由于能力有限基本原理大家可以借鉴《图像二值化阈值选取常用方法》博客网址http://blog.csdn.net/xgmiao具体运算公式如下代码如下示例%最大熵阈值法 %设阈值 t 将图像划分为目标 O 和背景 B 两类他们的概率分布分别为 Ptcumsum(num1); POnum1./Pt; PBnum1./(1-Pt); %则目标 O 和背景 B 的熵函数分别为 lnPOlog(num1); for kk1:256 if lnPO(kk,1)-Inf lnPO(kk,1)1; end end lnPtlog((1-num1)); for kk1:256 if lnPt(kk,1)-Inf lnPt(kk,1)0; end end %O区域 HO-cumsum(num1.*lnPO); HOtlog(Pt)HO./Pt; %B区域 HB-flip(cumsum((1-num1).*lnPt)); HBtlog(flip(cumsum(1-num1)))HB./(flip(cumsum(1-num1))); %图像总熵 HHOtHBt; [H1,average_image3]max(H); double_image3double(pixel); for iii1:rows for jjj1:cols if double_image3(iii,jjj)average_image3 double_image3(iii,jjj)0; else double_image3(iii,jjj)1; end end end imshow(double_image3); title(最大熵法二值图像,color,r,FontSize,15)结果