基于多尺度形态学的图像分割算法(matlab代码)

先放代码 原理在下面


Img = imread('images\image.bmp');
% 计算1~3的算子结果
Gf1 = Main_Process(Img, 1);
Gf2 = Main_Process(Img, 2);
Gf3 = Main_Process(Img, 3);
% 整合到cell
G{
     1} = Gf1;
G{
     2} = Gf2;
G{
     3} = Gf3;
% 计算系数
ua1 = Coef(Gf1, G);
ua2 = Coef(Gf2, G);
ua3 = Coef(Gf3, G);
% 组合
u = [ua1, ua2, ua3];
% 权重
u = u/sum(u);
% 加权融合
Gf = Edge_One(G, u);
% 显示结果
result = Gf3;
figure;  imshow(Img, []);
figure;  imshow(result, []);
function result = Main_Process(Img, n)
% 灰度化
if ndims(Img) == 3
    I = rgb2gray(Img);
else
    I = Img;
end
% 设置5个算子
g1 = [0 1 0
    0 1 0
    0 1 0];
g2 = [0 0 0
    1 1 1
    0 0 0];
g3 = [0 0 1
    0 1 0
    1 0 0];
g4 = [1 0 0
    0 1 0
    0 0 1];
g5 = [0 1 0
    1 1 1
    0 1 0];
%5个算子,分别多尺度计算
Gi1 = Multi_Process(I, g1, n);
Gi2 = Multi_Process(I, g2, n);
Gi3 = Multi_Process(I, g3, n);
Gi4 = Multi_Process(I, g4, n);
Gi5 = Multi_Process(I, g5, n);
% 整合到cell
G{
     1} = Gi1;
G{
     2} = Gi2;
G{
     3} = Gi3;
G{
     4} = Gi4;
G{
     5} = Gi5;
% 均值系数
ua1 = Coef(Gi1, G);
ua2 = Coef(Gi2, G);
ua3 = Coef(Gi3, G);
ua4 = Coef(Gi4, G);
ua5 = Coef(Gi5, G);
% 组合
u = [ua1, ua2, ua3, ua4, ua5];
% 权重
u = u/sum(u);
% 加权融合
Gf1 = Edge_One(G, u);
result = Gf1;
function [Gi, ng] = Multi_Process(I, g, n)
% 默认参数检测
if nargin < 3
    n = 6;
end
% 初始化
ng = g;
for i = 1:n
    % 膨胀
    ng = imdilate(ng, g);
end
% 依次执行开、膨胀、闭、腐蚀形态学操作
Gi1 = imopen(I, ng);
Gi1 = imdilate(Gi1, ng);
Gi2 = imclose(I, ng);
Gi2 = imerode(Gi2, ng);
% 差分
Gi = imsubtract(Gi1, Gi2);
function Gf = Edge_One(G, u)
if nargin < 2
    % 默认参数
    u = rand(1, length(G));
    u = u/sum(u(:));
end
Gf = zeros(size(G{
     1})); 
for i = 1 : length(G)
    % 加权组合
    Gf = Gf + u(i)*double(G{
     i});
end
% 统一类型
Gf = im2uint8(mat2gray(Gf)); 
function H = compute_infos(I)
% 设置统计量级
level = 256;
% 初始化
dat = double(I);
p = zeros(1, level);
for i = 1 : size(dat, 1)
    for j = 1 : size(dat, 2)
        % 逐层统计直方图
        temp = dat(i,j);
        p(1, temp+1) = p(1, temp+1) + 1;
    end
end
% 归一化
p = p/(size(dat, 1)*size(dat, 2));
H = 0;
for i = 1 : level
    if p(i) ~= 0
        % 累计直方图
        H = H + p(i)*log2(p(i));
    end
end
% 信息值计算
H = -H;
function ua = Coef(fa, f)
% 元素个数
N = length(f);
% 初始化
s = [];
for i = 1 : N
    % 当前结果
    fi = f{
     i};
    % 交叉差分
    si = supoles(fi, f);
    % 存储
    s = [s si];
end
% 归一化处理
sp = min(s(:));
sa = supoles(fa, f);
ka = sp/sa;
k = 0;
for i = 1 : N
    fb = f{
     i};
    s = [];
    for i = 1 : N
        fi = f{
     i};
        % 交叉差分
        si = supoles(fi, f);
        % 存储
        s = [s si];
    end
    % 归一化处理
    sp = min(s);
    sb = supoles(fb, f);
    kb = sp/sa;
    k = k + kb;
end
% 均值
ua = ka/k;
function Inversef = supoles(fa, f)
% 初始化
Inversef = 0;
N = length(f);
for i = 1 : N
    fb = f{
     i};
    % 计算相似结果
    diff_fab = usim(fa, f);
    % 组合
    Inversef = Inversef + diff_fab;
end
function supo = sys_sim(fa, f)
supo = 0;
N = length(f); 
for i = 1 : N
    fb = f{
     i}; 
    supo = supo + norm(double(fa(:)-fb(:)));
end
function diff_fab = usim(fa, f)
% 初始化
diff_fab = 0;
N = length(f);
for i = 1 : N
    fb = f{
     i};
    % 计算差分结果
    diff_ab = usimole(fa, fb);
    % 组合
    diff_fab = diff_fab + diff_ab;
end
function diff_ab = usimole(fa, fb)
% 分别计算信息值
Ha = compute_infos(fa);
Hb = compute_infos(fb);
% 绝对差分
diff_ab = imabsdiff(Ha, Hb);

尺度形态学的图像分割算法

1.1
多尺度形态学分割的基本原理

数学形态学是处理和分析几何结构的一种基本技术,是一种基于集合理论技术,通常应用于图像处理中,是一种非常有用的图像分割工具。其形态算子的实质是表达物体或形状的集合与结构元素间的相互作用,结构元素的形状就决定了这种运算所提取的信号的形状信息。形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的图像进行交、并等集合运算。数学形态学最初是为二进制图像开发的,后来扩展到灰度图像。

结构元素在数学形态学图像处理中有关键性的作用,它决定了被处理图像中物体的形状特征,但它并不是对所有具有形状相同而大小不同的物体都具有同等处理效果。为了解决这一问题,我们将尺度特征加入到结构元素中来。
基于多尺度形态学的图像分割算法(matlab代码)_第1张图片

1.2
多尺度数学形态学法实现步骤

多尺度数学形态学边缘检测算法步骤如下:
基于多尺度形态学的图像分割算法(matlab代码)_第2张图片
基于多尺度形态学的图像分割算法(matlab代码)_第3张图片

此时,各个尺度检测的边缘对最终边缘贡献一样大,但这样提取的边缘效果不是很好。

对于含噪的图像,为了更好地滤除噪声检测的最佳边缘图像,取非均值权值,基本原则是根据不同尺度抗噪性能不同来确定。大尺寸的结构元素去除噪声能力强,小尺寸的结构元素去噪声能力弱,因而可将大尺度的权重取得大一些,小尺度取得小一些。按照以上原则,我们可设计如下的计算不同权值的算法步骤:
基于多尺度形态学的图像分割算法(matlab代码)_第4张图片

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