光照不均匀图像分割技巧1——分块阈值

本文章由wikiwen撰写,转载请注明出处。 
文章链接:http://blog.csdn.net/kk55guang2/article/details/78475414 
作者:wikiwen

前言
  在数字图像处理中,图像分割是很关键的一步,当图像质量较好,光照很均匀的时候只需用全局阈值的方法就能很完美地完成图像分割任务,但是有些时候会遇到光照不均匀的现象,这个时候就需要用一些技巧才能达到比较好的分割效果,本文要介绍的是一种通过分块阈值进行分割的方法。

实例
  在进入正题之前,我们先看一个实例,下面图1和图3为做硬币面额识别拍摄的,可以看到,由于硬币表面的反光以及打光角度的原因,图片存在严重的光照不均现象。 
  如果对两幅图像直接进行全局阈值可以得到图2和图4的结果,可以看到分割的效果很差,比如第一幅,右上角的光照要强一些,而且右上角的硬币存在一定的反光,灰度值整体偏高,导致最后分割效果很差。第二幅则是左边部分光照太强,左边的硬币分割效果很差。 
  本文将用分块阈值的方法解决这一问题。 

   
图1 光照不均匀图像1        图2 全局阈值处理结果 

  
图3 光照不均匀图像2        图4 全局阈值处理结果 
分块阈值思路
  通过将图像分割成若干块,分别进行阈值分割,可以在一定程度上解决光照或反射造成的不均匀影响。选择的块要足够小,以便每个块的光照都近似均匀的,这样自动阈值时,在高灰度区域就会用高阈值分割,在低灰度区域就会用低阈值分割。 
  图5为分块结果,示例中分块与硬币大小相当,分完块之后就可以按块进行全局阈值法(这里采用常用的最大类间方差法,otsu法)处理了,但是需要注意的是有的块中只有背景,这个时候需要进行判断,排除对这种块的处理。 
  对于这种块的判断,笔者尝试过用otsu方法中提到的可分性度量: 
η=σ2Bσ2G
η=σB2σG2

  上式中,σ2G、σ2BσG2、σB2分别为全局方差和类间方差。 
   笔者在计算出各个块的可分性度量之后,发现区分效果并不是很好,后来通过分析最大类间方差法,有个想法就是用分割阈值处的类间平均灰度差判断图像块的可分性,当图像中只有背景或只有物体时,由于灰度值比较接近,则用otsu法算出的“背景”和“前景”平均灰度差(类间灰度差)会很小,类间平均灰度差 ΔmΔm 的数学表达式如下: 
Δm=|m1(T)−m2(T)|
Δm=|m1(T)−m2(T)|

m1(k)=∑i=0kiP(i/C1),m2(k)=∑i=k+1L−1iP(i/C2)
m1(k)=∑i=0kiP(i/C1),m2(k)=∑i=k+1L−1iP(i/C2)

  如图5中各块标注的文字所示,T为分割阈值,d为类间平均灰度差,可以看到当块中只有背景时,平均灰度差与有物体时相差很大,选取特征区分效果很好。本示例中,选灰度差20就能将两种不同的块很好的区分开。 

 
图5 分块情况 

  之后仅对既有物体又有背景的块进行自动阈值处理、二值化、填充孔洞,可以得到图6的结果,可以看到每个硬币都被很好的分割出来 

 
图6 分块阈值处理结果 
代码

%功能:对一副图像进行分块阈值,可解决光照不均分割不足的问题
%通过判断类间灰度差以排除纯背景或纯物体的干扰
%作者:wikiwen
%日期:2017/10/24
%平台:matlab R2014

clc,clear;
close all;

rn=5;cn=5;
I = rgb2gray(imread('d.jpg'));
[R , C]=size(I);%分别返回行和列数
rblk=R/rn;cblk=C/cn;%小块的行数和列数
x = 0:cblk:C;
y = 0:rblk:R;
M = meshgrid(x,y); %产生网格
N = meshgrid(y,x);  %产生网格
imshow(I);
hold on
plot(x,N,'r'); %画出水平横线
plot(M,y,'r'); %画出垂直竖线

T = zeros(rn,cn);
dif = zeros(rn,cn);
J = false(R,C);%初始化二值图
X = uint8(zeros(rblk,cblk));
%分块阈值,并判断类间灰度差以排除纯背景或纯物体的干扰
for r=1:rn
    for c=1:cn
        r0=rblk*(r-1)+1;r1=rblk*r;
        c0=cblk*(c-1)+1;c1=cblk*c;
        X = I(r0:r1,c0:c1);
        T(r,c) = graythresh(X);
        [h,~] = histcounts(X,0:255);
        T_int =uint8(T(r,c)*255);
        dif(r,c) = graydiffer(h,T_int);%计算类间灰度差的函数略

        str = ['T=',num2str(T_int),' d=',num2str(dif(r,c))];
        text(c0+cblk/4,r0+rblk/2,str,'color','black');%显示信息
        if dif(r,c)>20
            J(r0:r1,c0:c1) = ~im2bw(X,T(r,c));
        end
    end
end
J = imfill(J,'holes');%填充孔洞
figure;
imshow(J);
%功能:计算一幅图像前景和背景类间平均灰度差
%输入:直方图数据h,分割阈值T
%输出:类间平均灰度差
%作者:wikiwen
%日期:2017/10/26
function[differ] = graydiffer(h,T)
    s1 = sum(h(1:T));
    s2 = sum(h(T:255));
    n1 = 1:T;
    n2 = T:255;
    u1 = double(n1)*h(1:T)' / s1; %背景灰度均值
    u2 = double(n2)*h(T:255)' / s2; %前景灰度均值

    differ = uint8(u2-u1);
end


————————————————
版权声明:本文为CSDN博主「wikiwen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kk55guang2/article/details/78475414

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值