煤矸双能X射线图像多目标区域灰度均值提取算法与MATLAB实现

单目标

对图像目标区域灰度进行提取,图像目标仅有一个,提取灰度之后计算平均灰度值。测试图像如图所示:

Snipaste_2024-04-18_14-38-28.png

Snipaste_2024-04-18_14-38-45.png

\beta 表示图像灰度矩阵的行向量。

3、得到目标区域灰度矩阵 T :

Snipaste_2024-04-18_14-39-53.png

其中diag(\alpha)是由\alpha构成的c x c对角矩阵。

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
45
46
47
clear all,clc;
%读录图像
im = imread( '/Users/yons/Desktop/目标区域灰度提取并统计/mei.png' );
figure;
subplot(1,2,1);imshow(im);title('原始图像');
%转灰度图像
im=rgb2gray(im);
subplot(1,2,2);imshow(im);title('灰度图像');
%对灰度图像进行邻域3x3二维中值滤波
im1=medfilt2(im,[3 3]);
figure;subplot(1,2,1);imshow(im1);title('3x3-中值滤波');
%寻找灰度图像最佳阈值,"Otsu"法阈值分割图像,并进行二值化处理
level=graythresh(im1);
im2=im2bw(im1,level);
subplot(1,2,2);imshow(im2);title('二值化');
im3 = edge(im2,'Canny');
figure,imshow(im3);
%目标区域灰度信息提取
[r,c] = size(im3);
q = ones(r,c);

for i = 1:r
for j = 1:c

if sum(im3(i,1:j)) == 0
q(i,1:j) = 0;
end

if sum(im3(i,j:c)) == 0
q(i,j:c) = 0;
end

if im3(i,j) == 1
q(i,j) = 0;
end

end
end

T = zeros(r,c);
for i = 1:r
T(i,:) = double(im(i,:))*diag(q(i,:));
end
%计算灰度平均值
T1 = T(T~=0);
m = mean(T1);
figure,hist(T1);

输出灰度图像:

Snipaste_2024-04-18_14-42-05.png

对灰度图像进行中值滤波并取二值化:

Snipaste_2024-04-18_14-42-52.png

Canny边缘算子检测:

Snipaste_2024-04-18_14-43-26.png

提取灰度信息,输出灰度频率直方图:

Snipaste_2024-04-18_14-44-01.png

最后求取灰度值平均值:

m = 27.6925


多目标

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 clear all,clc;
%读录图像
im = imread( '/Users/yons/Desktop/目标区域分别提取并统计灰度值/mei.png' );
figure;
subplot(1,2,1);imshow(im);title('原始图像');
%转灰度图像
im=rgb2gray(im);
subplot(1,2,2);imshow(im);title('灰度图像');
%对灰度图像进行邻域3x3二维中值滤波
im1=medfilt2(im,[3 3]);
figure;subplot(1,2,1);imshow(im1);title('3x3-中值滤波');
%寻找灰度图像最佳阈值,"Otsu"法阈值分割图像,并进行二值化处理
level=graythresh(im1);
im2=im2bw(im1,level);
subplot(1,2,2);imshow(im2);title('二值化');
im3 = edge(im2,'Canny');
figure,imshow(im3);
%标记连通区域
im4 = bwlabel(im3);
q = max(max(im4));
[r,c] = size(im4);
%构建元胞数组
A = cell(1,q+1);
A{1,1} = im4;
%分离连通区域
for p = 1:q
im4 = bwlabel(im3);
for i = 1:r
for j = 1:c
if im4(i,j) ~= p
im4(i,j) = 0;
end
end
end
A{1,p} = im4;
end
%循环输出连通区域
for i = 1:q
figure,imshow(A{1,i});
end
%目标连通区域灰度值信息提取
k = cell(1,q);
for i = 1:q
k{1,i} = ones(r,c);
end
for p = 1:q
for i = 1:r
for j = 1:c
if sum(A{1,p}(i,1:j)) == 0
k{1,p}(i,1:j) = 0;
end
if sum(A{1,p}(i,j:c)) == 0
k{1,p}(i,j:c) = 0;
end
if A{1,p}(i,j) == 1
k{1,p}(i,j) = 0;
end
end
end
end

%T为提取目标区域灰度矩阵
T = cell(1,q);
for p = 1:q
T{1,p} = zeros(r,c);
end

for p = 1:q
for i = 1:r
T{1,p}(i,:) = double(im(i,:))*diag(k{1,p}(i,:));
end
end
%求取目标区域灰度值平均值
MEAN = cell (1,q);

for p = 1:q
m = nnz(T{1,p});
MEAN{1,p} = sum(sum(T{1,p}))/m;
end

输出原图像灰度图像:

Snipaste_2024-04-18_14-51-31.png

对灰度图像进行中值滤波及二值化:

Snipaste_2024-04-18_14-51-43.png

将二值化图像进行 Canny 边缘检测:

Snipaste_2024-04-18_14-52-01.png

将边缘检测后的区域进行分离分别输出:

Snipaste_2024-04-18_14-52-29.png

Snipaste_2024-04-18_14-52-15.png

Snipaste_2024-04-18_14-52-22.png

最终求取各目标区域灰度值:

1
2
3
4
5
6
7
8
9
>> MEAN{1,1}
ans =
71.5193
>> MEAN{1,2}
ans =
59.1444
>> MEAN{1,3}
ans =
71.2647

上述通过边缘检测获取目标灰度信息相对繁琐,实际可直接通过二值化图像与灰度图像相乘直接获取无背景灰度图,然后计算灰度信息。