动态阈值进行图像分割——MATLAB
2019-08-20 19:17
5440 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33668060/article/details/99873919
@ 采用动态阈值进行图像分割
由于在进行图像处理的过程中,当图像中目标的灰度处于不同的灰度域中,单独使用一个全局阈值,可能无法全面的提取所有目标,这时可以采用动态阈值的处理方法,将图像分成多个块,分别对每个块进行操作。
下面一段代码,是将图像rice.png分割成16块,对每一块单独的采用迭代法进行处理,当16块都处理结束后,将其合并,即为所要的处理结果。
代码实现:
A = imread('rice.png'); figure; subplot(121);imshow(A);title('原图') [m,n] = size(A); % A1 = A(1:m/4,1:n/4); % A2 = A(m/4+1:m/3,1:n/4); M = 64; N = 64; B = mat2cell(A,ones(m/M,1)*M, ones(n/N,1)*N); %将矩阵A分成16块,每块的大小为64×64 %分别对每一块矩阵进行处理 for i=1:4 for j=1:4 T = mean2(B{i,j}); %取均值作为初始阈值 done = false; %定义跳出循环的量 a = 0; % while循环进行迭代 while ~done r1 = find(B{i,j}<=T); %小于阈值的部分 r2 = find(B{i,j}>T); %大于阈值的部分 Tnew = (mean(B{i,j}(r1)) + mean(B{i,j}(r2))) / 2; %计算分割后两部分的阈值均值的均值 done = abs(Tnew - T) < 1; %判断迭代是否收敛 T = Tnew; %如不收敛,则将分割后的均值的均值作为新的阈值进行循环计算 a = a+1; end B{i,j}(r1) = 0; %将小于阈值的部分赋值为0 B{i,j}(r2) = 1; %将大于阈值的部分赋值为1 这两步是将图像转换成二值图像 end end J = cell2mat(B); %将分块处理后的矩阵转换成整个矩阵 subplot(122);imshow(J,[]);title('动态阈值+迭代')
处理结果:
从这里的处理结果,与前面两篇采用全局阈值的处理结果相比较,可以发现,采用动态阈值的方法,效果更好。
相关文章推荐
- Matlab 图像分割 (阈值处理)
- Matlab实现通过图像分块的可变阈值处理,使用Otsu方法进行二值化
- Matlab图像处理学习笔记(九):获取叠加物体的数量并进行分割
- matlab基于遗传算法的最大熵值法的双阈值图像分割
- libsvm遥感图像的分类(MATLAB中进行)
- 使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)
- 新手学,java使用分水岭算法进行图像分割(二)
- Matlab进行图像中值滤波和均值滤波算法
- [转]标记法进行图像分割
- 通过HSV色彩空间对图像进行特定部分提取的简单实例的matlab实现
- 局部边缘保持滤波(LEP)高动态范围图像HDR压缩 matlab程序(一)
- Matlab图像处理学习笔记(二):基于颜色的图像分割
- 【图像处理】图像分割-全局固定值阈值分割,局部阈值分割、大津Otsu自适应阈值分割
- 模式识别经典算法——FCM图像聚类分割(最简matlab实现)
- matlab进行图像计算时,一定要将读入的图像double化
- halcon自动全局阈值与动态阈值分割方法
- OpenCV实现局部动态阈值分割
- 模式识别经典算法——Kmeans图像聚类分割(以最短的matlab程序实现)
- 如何使用MATLAB对图像进行批量的修改名称的处理
- Halcon视频学习2.2---图像分割之阈值