数字图像处理9:形态学图像处理 III 基于形态学的粒度测定 基于形态学的纹理分割

基于形态学的粒度测定

设计思路

在图像处理方面,粒度测定属于判断图像中颗粒的尺寸分布的领域。
其原理十分简单。对比比背景亮并且具有规则形状的颗粒,该方法由使用逐渐增大的结构元对图像执行开操作组成。

基本思想是,某个特殊尺寸的开操作应该对包含类似尺寸的颗粒的输人图像的区域具有最大的影响。对于每次开操作,计算该开操作中像素值的和。该和有时称为表面区域,它会随着结构元的增大而减小,因为开操作会降低亮特征的灰度。该过程会得到一个这样的数字的一维阵列,阵列中的每个元素等于对应于阵列中该位置的结构元素的大小的开操作中的像素之和。为了强调连续开操作间的变化,计算一维阵列的相邻元素的差。

代码

主函数:

clc;
clear;
close all;

%% 课本图 9.41
im=imread('wood_dowels.tif'); %注意图片的路径要设置正确

%% 图像平滑处理  图像粒度检测
[im1,im2,im3,im4,im5,y] = my_detectSize(im);

%% 将结果保存到当前目录下的result文件夹下
imwrite(im1, sprintf('result/%s.jpg','3_im1'));
imwrite(im2, sprintf('result/%s.jpg','3_im2'));
imwrite(im3, sprintf('result/%s.jpg','3_im3'));
imwrite(im4, sprintf('result/%s.jpg','3_im4'));
imwrite(im5, sprintf('result/%s.jpg','3_im5'));

%% 显示结果
figure;
subplot(231); imshow(im); title('图像'); axis on
subplot(232); imshow(im1); title('平滑图像'); axis on
subplot(233); imshow(im2); title('10图像'); axis on
subplot(234); imshow(im3); title('20图像'); axis on
subplot(235); imshow(im4); title('25图像'); axis on
subplot(236); imshow(im5); title('30图像'); axis on
figure;
x=1:1:35;%x轴上的数据,第一个值代表数据开始,第二个值代表间隔,第三个值代表终止
plot(x,y,'-*b'); %线性,颜色,标记
ylabel('表面区域差')  %x轴坐标描述
xlabel('圆盘半径') %y轴坐标描述

功能函数:

function [im_5,im_10,im_20,im_25,im_30,y] = my_detectSize(im)
%% 半径为5的滤波器进行滤波
im_5 = my_imopen(im,5);
im_5 = my_imclose(im_5,5);

%% 使用滤波后的图像进行边缘处理
y = zeros(1,35);
temp = im_5;
for i = 6:35
    k = my_imopen(im_5,i);
    C = temp - k;
    y(i) = sum(C(:));
    temp = k;
    if(i == 10)
        im_10 = k;%记录这些图像,进行分析
    elseif(i == 20)
        im_20 = k;
    elseif(i == 25)
        im_25 = k;
    elseif(i == 30)
        im_30 = k;
    end
end

end
function im_e = my_imopen(im,R)
% 以半径为R的圆盘进行开操作

%% 求出B
B = zeros(R,R);
for k = -R:1:R
    for l = -R:1:R
        if(k^2+l^2<=R^2)
            B(l+R+1,k+R+1) = 1;
        end
    end
end

%% 腐蚀
im_F = my_imerode(im,B);

%% 膨胀
im_P = my_imdilate(im_F,B);

%% 得出结果
im_e = uint8(im_P);
function im_e = my_imclose(im,R)
% 以半径为R的圆盘进行闭操作

%% 求出B
B = zeros(R,R);
for k = -R:1:R
    for l = -R:1:R
        if(k^2+l^2<=R^2)
            B(l+R+1,k+R+1) = 1;
        end
    end
end

%% 膨胀
im_P = my_imdilate(im,B);

%% 腐蚀
im_F = my_imerode(im_P,B);

%% 得出结果
im_e = uint8(im_F);

3.3实验结果
图 1,它是两种不同大小的木钉图像。木钉中的木纹可能在开操作中引入变化,因此,平滑是一种合理的预处理步骤。图 2 显示了使用形态学滤波器平滑后的图像,该滤波器用半径为 5 的圆盘形结构元。图 3 到图 6 显示了使用半径为 10, 20, 25 和 30 的圆盘形结构元对图像进行开操作的例子。
数字图像处理9:形态学图像处理 III 基于形态学的粒度测定 基于形态学的纹理分割_第1张图片
下图显示了图像的差值阵列的曲线。如前边提到的那样,我们期望半径附近的差值较大 (曲线中的峰值),在该处结构元足够大,以包围近似相同直径的一组颗粒。下图中的结果有两个明 显的峰值,这清楚地表明图像中存在两种主要的物体尺寸。数字图像处理9:形态学图像处理 III 基于形态学的粒度测定 基于形态学的纹理分割_第2张图片

基于形态学的纹理分割

设计思路

形态学的纹理分割目的是以纹理内容为基础找到两个区域的边界,将一幅图像分为不同的区域的处理称为分割。

其原理:使用一个比小斑点大的结构元对图像做闭操作,这些斑点将被删除。之后使用尺寸大于剩余这些斑点间的间隔的结构元对该图像做开操作,则最终结果应该是这样一幅图像,在该图像中,斑点间的亮间隔已被删除,留下了暗色斑点,并且现在这些斑点之间同样有暗色间隔。

最后使用一个元素全为 1 且大小为 3x3 的结构元对该图像执行形态学梯度操作,将给出这两个区域间的边界。

代码

主函数:

%% 运行 main_dark.m 第四个实验
clc;
clear;
close all;

%% 读取图像
im=imread('dark_blobs_on_light_background.tif'); %注意图片的路径要设置正确

%% 处理图像
im_t1 = my_imclose(im,30);
im_t2 = my_imopen(im_t1,60);
im_t3 = my_imGradiant(im_t2,3);
im_t4 = uint8(255*mat2gray(im + im_t3));

%% 将结果保存到当前目录下的result文件夹下
imwrite(im_t1, sprintf('result/%s.jpg','4_im1'));
imwrite(im_t2, sprintf('result/%s.jpg','4_im2'));
imwrite(im_t3, sprintf('result/%s.jpg','4_im3'));
imwrite(im_t4, sprintf('result/%s.jpg','4_im4'));

%% 显示结果
subplot(221); imshow(im); title('图像'); axis on
subplot(222); imshow(im_t1); title('大斑点图像'); axis on
subplot(223); imshow(im_t2); title('边界图像'); axis on
subplot(224); imshow(im_t4); title('边界+原图像'); axis on

my_imopen和my_imclose前面已经给出,这里不再重复

function im_e = my_imGradiant(im,L)
[M,N] = size(im);
im_f = im;
%% 图像延拓
im_f = [im_f(:,1:-1:1),im_f,im_f(:,N-1:N)];
im_f = [im_f(1:-1:1,:);im_f;im_f(M-1:M,:)];
im_f = double(im_f);
%% 求出B
k = 1:L;
l = 1:L;
B(k,l) = 1;

%% 腐蚀 he 膨胀
im_T = zeros(M,N);
im_F = zeros(M,N);
for i = 1:M
    for j = 1:N
        im_sub = im_f(i:i+L-1,j:j+L-1);
        C = im_sub.*B;
        im_F(i,j) = min(C(:));
        im_T(i,j) = max(C(:));
    end
end

%% 梯度
im_e = uint8(im_T - im_F);
end

实验结果

图 1 显示了一幅在亮背景上添加了暗斑点的噪声图像。该图像有两个纹理区域: 右边大斑点组成的区域和左边小斑点组成的区域。
在图 2 中,使用半径为 30 像素的圆盘形结构元对输人图像做闭操作的结果, 斑点的半径
近似为 25 像素,因此,我们得到了一幅亮背景上带有暗色大斑点的图像。
图 3 显示了使用半径为 60 的圆盘形结构元得到的结果,在该图像中,斑点间的亮间隔已被删除,留下了暗色斑点,并且现在这些斑点之间同样有暗色间隔。
使用一个元素全为 1 且大小为 3x3 的结构元对该图像执行形态学梯度操作,将给出这两个区域间的边界。图 4 显示了将形态学梯度操作结果叠加到原图像后所得到的边界。该边界右侧的所有像案表示属于由大斑点表征的纹理区域,而该边界左侧的所有像素属于由小斑点表征的纹理区域。
数字图像处理9:形态学图像处理 III 基于形态学的粒度测定 基于形态学的纹理分割_第3张图片

实验小结

本次实验主要学习了形态学图像处理,形态学的概念和技术构成了从一幅图像中提取感兴趣特征的一组有力工具。形态学图像处理最吸引人的一个方面是,来自形态学技术已有发展的集合论基础。
实现方面的一个显著优点是,膨胀和腐蚀都是基本操作,它们是各类形态学算法的基础。 可以通过膨胀和腐蚀演化出各种各种的形态学算法,例如开操作、闭操作、重建开、重建闭、 边缘提取等等。在这次实验中,也体会到了形态学技术在图像描述中同样起着重要的作用,可以作为广泛应用的图像分割程序的基础。

你可能感兴趣的:(数字图像处理,计算机视觉,matlab)