煤矸双能X射线透射图像经过去噪校正后一般背景比较单一均匀,采用阈值法即可有效分割出前景目标。待分割图像如下图所示:
上图成像特点体现为明暗不均,类似于可见光成像的光照不均匀。煤密度小成像亮,贴近背景;矸石密度大成像暗,较好分割。煤矸厚度越大成像也越暗,因此阈值的选择尤为关键。既要保障分割全部目标,又要保障分割出全部的目标区域。
分割方法一:基于空皮带图像背景区域最小值的目标分割
基于空皮带图像背景区域最小值的目标分割,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| clc clear all; close all;
I = imread('C:\Users\雷子\Desktop\煤矸双能X射线透射图像分割方法\2020_8_20_15_52_11_144_H.bmp'); I=I(:,:,1); I_k= I(800:1000,500:600);
figure(1),subplot(1,2,1),imshow(I); subplot(1,2,2),imshow(I_k);
I= medfilt2(I,[3,3]);
min_I_k = min(min(I_k));
[m,n] = size(I); img_I = I; for i = 1 : m for j = 1 : n if img_I (i,j) > min_I_k img_I (i,j) = 0; else img_I (i,j) = 1; end end end
img_I_d= bwareaopen(img_I,10); figure(2),subplot(1,2,1),imshow(img_I,[0,1]); subplot(1,2,2);imshow(img_I_d);
|
分割后的图像如下图所示:
从分割后的图像中可以看到,采用基于空皮带图像背景区域最小值的目标分割方法可以分割出全部的目标,但是目标存在有粘连区域。
分割方法二:OTSU阈值分割(大津法)
采用大津法分割图像,又称OTSU阈值分割法,通过MATLAB中graythresh获取阈值,然后基于阈值thersh_H分割图像。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| clc clear all; close all;
I = imread('C:\Users\雷子\Desktop\煤矸双能X射线透射图像分割方法\2020_8_20_15_52_11_144_H.bmp');
I=I(:,:,1);
thersh_H = graythresh(I); High_im_bw = im2bw(I,thersh_H);
High_im_bw = ~High_im_bw; High_im_bw = bwareaopen(High_im_bw,50); imshow(High_im_bw);
img_I_d= bwareaopen(High_im_bw,10); imshow(img_I_d);
|
分割后的图像如下图所示:
从分割后的图中可以看到,部分小目标由于成像接近背景而未被有效分割。
分割方法三:迭代阈值分割
迭代阈值分割通过迭代方式计算最佳阈值,具有一定的自适应性,迭代阈值分割主要步骤如下:
①设定初始参数T0,初始阈值T1;
②使用阈值T1分割图像,G1部分像素值低于T1,G2部分像素值高于T1;
③计算G1和G2各自像素平均值m1和m2,更新阈值T2=(m1+m2)/2;
④若|T1-T2|<T0,则T2为最优阈值,否则令T1=T2,重复②~④。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| clc clear all; close all;
I = imread('C:\Users\雷子\Desktop\煤矸双能X射线透射图像分割方法\2020_8_20_15_52_11_144_H.bmp'); I=im2double(I);
T0=0.01; T1=(min(I(:))+max(I(:)))/2;
r1=find(I>T1); r2=find(I<=T1);
T2=(mean(I(r1))+mean(I(r2)))/2;
if abs(T2-T1)<T0 J=imbinarize(I,T2); else while abs(T2-T1)>=T0 T1=T2; r1=find(I>T1); r2=find(I<=T1); T2=(mean(I(r1))+mean(I(r2)))/2; end J=imbinarize(I,T2); end J=~J; subplot(121),imshow(I); title('原始图像'); subplot(122),imshow(J); title('迭代式阈值分割后的图像');
|
分割结果如下如:
采用迭代阈值分割结果与采用OTSU阈值分割结果相当。
分割方法四:分块OTSU阈值分割
分块OTSU阈值分割通过将图像分割成若干块,对每一块计算类间最大方差分别选取阈值来削弱成像明暗不均匀造成的漏分割。分块后需要判断分块中只有背景的情况,排除对这种分块的处理。当图像中只有背景或只有煤矸时,灰度值比较接近,采用OTSU算出的“背景”和“前景”平均灰度差Δm会很小。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| clc clear all; close all;
I = imread('C:\Users\雷子\Desktop\煤矸双能X射线透射图像分割方法\2020_8_20_15_52_11_144_H.bmp'); I=I(:,:,1);
rn = 4;cn = 4; [R , C] = size(I); rblk = R/rn;cblk = C/cn; x = 0:cblk:C+1; y = 0:rblk:R+1; M = meshgrid(x,y); N = meshgrid(y,x); figure,imshow(I),hold on; plot(x,N,'g'); plot(M,y,'g');
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),' △m=',num2str(dif(r,c))]; text(c0+cblk/4,r0+rblk/2,str,'color','black'); if dif(r,c)>30 J(r0:r1,c0:c1) = ~im2bw(X,T(r,c)); end end end
bw_F = bwareaopen(J,50); bw_F = J; figure,imshow(bw_F);
|
注意!调用函数graythresh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| %功能:计算一幅图像前景和背景类间平均灰度差 %输入:直方图数据h,分割阈值T %输出:类间平均灰度差 %作者:LEI HE %日期:2024/04/08 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
|
分块图像如下图所示:
分块OTSU阈值分割算法将图像分为四列,保证每一个块中都包含背景区域,在此基础上降低分块数量可提高计算效率。图中T为单个区域分块的最佳分割阈值,Δm为此分块对应类间灰度差。设定类间灰度差Δm为一个合适的阈值,如Δm=30,即只对Δm>30的分块进行阈值二值化处理,而Δm<30的分块全部像素点均置零。
分割后的图像如下图所示:
采用分块OTSU阈值分割,在保证分割全部目标的同时,不会引入大量的粘连。
原图像的灰度直方图:
使用背景阈值分割将分布在150附近的灰度值划分到前景中,这是粘连的主要原因。采用背景阈值分割获得的区域边缘一定为目标X射线成像的真实边缘,而分块OTSU阈值分割会舍弃此部分边缘。X射线透射成像在不遇到物体时背景值不会降低,一但像素值低于背景像素值那么则说明有物体被穿透。但为了避免引入大量不必要的重叠粘连,选择分块OTSU阈值分割对图像进行二值化处理。
本文源码对应博士论文第三章,第5节内容。