本文章由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 η = σ B 2 σ G 2

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

Δm=|m1(T)−m2(T)| Δ m = | m 1 ( T ) − m 2 ( T ) |

\Delta m = \left| {{m_1}(T) - {m_2}(T)} \right|

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

{m_1}(k) = \sum\limits_{i = 0}^k {iP(i/{C_1})} , {m_2}(k) = \sum\limits_{i = k + 1}^{L - 1} {iP(i/{C_2})}
  如图5中各块标注的文字所示,T为分割阈值,d为类间平均灰度差,可以看到当块中只有背景时,平均灰度差与有物体时相差很大,选取特征区分效果很好。本示例中,选灰度差20就能将两种不同的块很好的区分开。


图5 分块情况

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


图6 分块阈值处理结果

代码

%功能:对一副图像进行分块阈值,可解决光照不均分割不足的问题
%通过判断类间灰度差以排除纯背景或纯物体的干扰
%作者:wikiwen
%日期:2017/10/24
%平台:matlab R2014clc,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:rnfor c=1:cnr0=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)>20J(r0:r1,c0:c1) = ~im2bw(X,T(r,c));endend
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

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

  1. 两幅二值图像叠加_【显微视界】光照不均匀图像分割技巧1——分块阈值

    今日光电        有人说,20世纪是电的世纪,21世纪是光的世纪:知光解电,再小的个体都可以被赋能.欢迎来到今日光电! ----与智者为伍 为创新赋能---- 前言   在数字图像处理中,图像分 ...

  2. python去除图像光照不均匀_【转载】光照不均匀图像分割技巧

    1. 案例描述 在数字图像处理中,图像分割是很关键的一步,当图像质量较好,光照很均匀的时候只需用全局阈值的方法就能很完美地完成图像分割任务,但是有些时候会遇到光照不均匀的现象,这个时候就需要用一些技巧 ...

  3. python去除图像光照不均匀_python+opencv——去除图像光照不均匀

    使用python版本的opencv去除图像中的光照不均匀 在图像处理中,如果图像中存在光照不均匀,则会影响图像处理的效果,比如在图像文本识别和图像分割中.本博客对于图像均衡化的处理主要参考文章:一种基 ...

  4. Matlab实现基于二维伽马函数的光照不均匀图像自适应校正算法

    Matlab程序: %% % 基于二维伽马函数的光照不均匀图像自适应校正算法 % %% clc,close all; tic; im=imread('你的图片.jpg'); figure; imsho ...

  5. php图像去光照,如何用ps去除脸部光照不均匀?

    如何用ps去除脸部光照不均匀? 用ps去除脸部光照不均匀的方法: 1.用鼠标拖动这个图层到下方的新建图层按钮,这个我们就可以复制一个图层出来.如图所示. 2.选择图层副本,点击下方的图层调整层,我们用 ...

  6. 去光照不均匀matlab 算法和代码放出

    其他原创博客http://blog.csdn.net/baolinq 主要看第三部分就可以,前面是一些其他常见 的基本图像方法.基于二维伽马函数的光照不均匀图像自适应校正算法 在视频和图像的采集过程中 ...

  7. matlab中采集图片的光照不均匀,一种光照不均匀图像的处理方法及系统与流程

    本方面涉及图像处理技术领域,具体地说是一种光照不均匀图像的处理方法及系统. 背景技术: 人体横断面彩色图像在采集的过程中,由于环境光照的变化,存在光照不均匀的情况,直接影响了图像的质量,进而影响图像的 ...

  8. python去除图像光照不均匀_低光照环境下图像增强相关

    Low-Light Image Enhancement via a Deep Hybrid Network [TIP2019] Underexposed Photo Enhancement using ...

  9. 矩阵初等变换的“打洞技巧”与“分块矩阵的行列式公式”

    矩阵打洞(初等变换矩阵)是线性代数的基本功. 打洞技巧是矩阵一行减另一行的若干倍,或一列减另 一列的若干倍这两类初等变换的推广 利用分块矩阵的乘法将矩阵的某个块变为零 ( A B C D ) = ( ...

最新文章

  1. Android 内存管理 amp;Memory Leak amp; OOM 分析
  2. vs 创建控制器 一直收集信息_日产Pro-Pilot的ADAS控制器拆解
  3. .net core编写转发服务(三) 接入Polly
  4. 函数wait、waitpid、孤儿进程、僵尸进程
  5. 对HashMap的思考及手写实现
  6. NBA TopShot中勒布朗·詹姆斯的数字收藏卡以4.75万美元售出
  7. ajax的url怎么将后缀补上_球形门锁怎么拆装?球形门锁安装的方法都包括哪些?
  8. 运维工程师必备技能:网络排错思路讲解
  9. Critical dependency: require function dependencies cannot be statically extracted
  10. 彻底解决Python包下载慢问题
  11. 常用的17个运维监控系统(必备知识)
  12. 用java完成身高预测
  13. win7 关闭计算机休眠,技术编辑教您win7下怎么关闭休眠
  14. Python字符串切片总结
  15. 【云服务器搭建游戏私服】全流程
  16. Ubuntu18.04编译Openwrt 15.05.1 Chaos Calmer版本固件遇到的问题汇总
  17. 一般网站有哪些常见漏洞?
  18. 2020大二下期学期计划
  19. 全国计算机竞赛能保送清华北大吗,2020这些人将被保送至清华北大!
  20. 小米系统不显示手动选择安装包

热门文章

  1. python 学习笔记一 自动抢票软件
  2. 使用计算机的人数统计,计算机二级Access:如何使用查询统计
  3. ArcGIS 分幅分割栅格
  4. 多伦多大学计算机专音乐专业,多伦多音乐专业学院
  5. 如何看电脑显卡的好坏?且听我分析
  6. HS6621低功耗调试(HS6621CG)
  7. AutoCAD.NET 不使用P/Invoke方式调用acad.exe或accore.dll中的接口(如acedCommand、acedPostCommand等)...
  8. time_wait 处理方法
  9. 基于物品的协同过滤算法ItemCF
  10. Pytest.fixture