h-dome算法的matlab实现

关于h-dome算法的原理请查看我之前的两篇翻译论文
翻译论文1
翻译论文2
这两篇文章算是我学习h-dome算法的笔记,内容较为繁杂,表述不是很清楚,建议google:Morphological Grayscale Reconstruction in Image Analysis: Applications and Efficient Algorithms,英文原文看懂的话会更好一些。

先简要介绍一下我的处理思路:

初始化图像及参数——设定二值化阈值——判断是否遍历完255个灰度级——图像二值化——二值重构——重构区域灰度更新——设定二值重构阈值——…——重构区域灰度更新——判断是否遍历完255个灰度级,遍历255个灰度,结束重构——原图像减去灰度重构图

主文件

clear all,clc;%% 获取图像及初步处理
global img_r row col;img = imread('gray.bmp');%原图像
figure(1),imshow(img);
img_h = img - 17;%I-h图像
figure(2),imshow(img_h);[row,col] = size(img);
img_r = zeros(row,col);%灰度重构图
img_result = zeros(row,col);%结果图%灰度区分阈值
for t0 = 0:255t = t0/255;h_dome_region(img,img_h,t);
endimg_r = im2uint8(img_r/255);%%
%mesh(img);img_result = img - img_r;mesh(img_result);
function h_dome_region(img,img_h,t)global img_r row col;
%% 二值重构img_bw = imbinarize(img,t);%原图像二值化img_h_bw = imbinarize(img_h,t);%I-h图像二值化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%             I-h图像是原图像生长的种子点             %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 创建种子点集合(类比堆栈)
stack = zeros(row*col,2);
stack_num = 0;for i = 1:rowfor j = 1:colif(img_h_bw(i,j) == 1)stack_num = stack_num + 1;stack(stack_num,1) = i;stack(stack_num,2) = j;endend
endimg_grow = region_grow(img_bw,stack,stack_num);
%% 重构区域灰度值更新
for i = 1:rowfor j = 1:colif(img_grow(i,j)==1)img_r(i,j) = t*255;endend
end

二值重构这里也可以用测地膨胀,我用的区域生长。

function img_grow = region_grow(img_bw,stack,stack_num)
[row,col] = size(img_bw);
img_grow = zeros(row,col);
while(stack_num>0)% 当无新的种子点生成时停止x = stack(stack_num,1);y = stack(stack_num,2);stack_num = stack_num - 1;%取出种子点
%% 判断规则 种子点周围的8个点循环遍历,满足坐标在图内,值为1,且生长图处不为1的点for i = -1:1for j = -1:1if x+i>0 && y+j>0 && x+i<=row && y+j<=col && img_bw(x+i,y+j)==1 && img_grow(x+i,y+j)~=1 img_grow(x+i,y+j) = 1;stack_num = stack_num + 1;stack(stack_num,1) = x+i;stack(stack_num,2) = y+j;endendend  
end
end


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部