当前位置:   article > 正文

数字图像处理8:形态学图像处理 II 基于形态学的图像分割 (顶帽变换和底帽变换)_数字图像处理灰度图像的顶帽变换

数字图像处理灰度图像的顶帽变换

基于形态学的图像分割

在形态学中,可以利用顶帽变换和底帽变换加上二值化阈值,来进行图像的分割。

设计思路

顶帽变换和底帽变换

图像相减与开操作和闭操作相结合,可产生所谓的顶帽变换和底帽变换。 灰度级图像 f 的顶帽变换定义为 f 减去其开操作。
T h a t ( f ) = f − ( f o b ) T_{hat}(f) = f - (f o b) That(f)=f(fob)
灰度级图像f的底帽变换定义为其闭操作减去f。
B h a t ( f ) = ( f ⋅ b ) − f B_{hat}(f) = (f · b) - f Bhat(f)=(fb)f

这些变换的主要应用之一是:用一个结构元通过开操作或闭操作从一幅图像中删除物体; 然后,差操作得到一幅仅保留已删除分量的图像。
顶帽变换用于暗背景上的亮物体,而底帽变换则用于相反的情况。由于这一原因,这些变换又称为白顶帽变换和黑底帽变换。
顶帽变换的一个重要用途是校正不均匀光照的影响。合适(均匀)的光照在从背景中提取目标的处理中扮演核心的角色。

本次实验思路

首先使用开操作,得到平滑后的图像,之后利用差值(即顶帽变换)得到光照矫正后的图像。将这张图像和原图像分别找到最合适的光照阈值,对图像分割后的图像进行对比分析。

代码

主函数:

%% 运行 main_hat.m 

clc;
clear;
close all;

%% 课本图 9.40
% 读取图片
im = imread('rice_image_with_intensity_gradient.tif');   % 原始图像 uint8
im1 = im2bw(im,0.53);
[im2,im3] = T_hat(im);
im4 = im2bw(im3,0.39);

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

%% 显示结果
subplot(221); imshow(im); title('图像'); axis on
subplot(222); imshow(im1); title('阈值图像'); axis on
subplot(234); imshow(im2); title('开操作图像'); axis on
subplot(235); imshow(im3); title('顶帽图像'); axis on
subplot(236); imshow(im4); title('阈值图像'); axis on
  • 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

功能函数:

function [im_P,im_T]= T_hat(im)

%% 求出B
B = zeros(40,40);
for k = -40:1:40
    for l = -40:1:40
        if(k^2+l^2<=1600)
            B(l+41,k+41) = 1;
        else 
            B(l+41,k+41) = 0;
        end
    end
end

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

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

%% 得出结果
im_T = double(im) - im_P;
im_P = uint8(im_P);
im_T = uint8(255*mat2gray(im_T));
end
  • 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

my_imdilate这个函数在前面的I中已经介绍了,这里不再给出。

function im_e = my_imerode(im,B)
% 以B的结构元进行腐蚀
%% 得到图像尺寸
[M,N] = size(im);
im_f = double(im);

%% 得到B的尺度
[m,n] = size(B);
m_2 = floor((m+1)/2);
n_2 = floor((n+1)/2);

%% 图像延拓
im_f = [im_f(:,n-1:-1:1),im_f,im_f(:,N:-1:N-n+2)];
im_f = [im_f(m-1:-1:1,:);im_f;im_f(M:-1:M-m+2,:)];
im_f = double(im_f);

%% 图像腐蚀
im_e = zeros(M,N);
for i = 1:M
    for j = 1:N
        im_sub = im_f(i+m_2-1:i+m_2+m-2,j+n_2-1:j+n_2+n-2);
        C = im_sub.*B + 255*(1-B);
        im_e(i,j) = min(C(:));
    end
end
%im_e = logical(im_e); 
end
  • 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

实验结果

图一是一幅大小为 600*600 的米粒图像,在非均匀光照下得到的。由于非均匀光照的干扰,导致无法直接选取阈值来进行很好的图像分割。

因此首先对原图像,使用半径为 40 的圆形结构元进行开操作。这个结构元足够大,大到不会拟合任何物体,这样就可以仅仅保留下一个图像的背景。
将原图像减去上面计算出的背景图像,这样图片的亮暗之间不再存在极端的差别,这时候再取最优的阈值进行图像分割,这时可以得到最好的图像分割实验结果。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/79017
推荐阅读
相关标签
  

闽ICP备14008679号