图像分割
实验目的
(1) 了解图像分割的基本原理,并利用图像分割算法进行图像分割处理;
(2) 掌握数学形态学的基本运算。
实验内容
(1) 利用类间方差阈值算法实现图像的分割处理;
(2) 利用形态学处理进行处理结果修正。
实验原理
(1) 中值滤波原理
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序, 生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为。其中,分别为原始图像和处理后的图像。为二维模板,通常为 3*3、5*5 的区域。
(2) 类间方差阈值算法
按图像的灰度特性,将图像分成背景和目标两部分。背景和目标间的类间方差越大,说明构成图像的两部分差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
(3) 腐蚀和膨胀运算处理
形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算;先腐蚀后膨胀的过程称为开运算。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。先膨胀后腐蚀的过程称为闭运算。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。
实验结果与分析
(1)对输入图像进行平滑处理,以减小噪声对分割处理的影响,比较中值滤波范围取不同值时对图像滤波的效果。
答:读入图像后,采用中值滤波的方式对图像进行平滑处理,在实验中可使用medfilt2()函数。中值滤波的窗口大小分别取3、5、7、9进行滤波处理。计算滤波后的图像的PSNR值,选取PSNR值最大的图像进行后续处理。中值滤波窗口大小分别取3、5、7、9滤波后的图像如下所示:
观察得知滤波的窗口越大,滤波后的图像噪点越少,但得到的图像也越模糊。
滤波后的图像对应的PSNR值分别如下:
实验采用的源代码如下:
clear();
img=rgb2gray(imread('Boat.png'));
figure
imshow(img)
title("原始图片");
%中值滤波
medianFilteredImg=cell(1,4);
psnr_=zeros(1,4);
max_psnr_index=1;
max_psnr=0;
figure
for i=1:4
medianFilteredImg{i}=medfilt2(img,[2*i+1,2*i+1]);
psnr_(i)=psnr(medianFilteredImg{i},img);
if(psnr_(i)>max_psnr)
max_psnr=psnr_(i);
max_psnr_index=i;
end
subplot(2,2,i)
imshow(medianFilteredImg{i})
title(['范围为',num2str(2*i+1)]);
end
fprintf("最合适的中值滤波窗口大小是:%d\n",2*max_psnr_index+1);
mImg=medianFilteredImg{max_psnr_index};
(2)选择适合的中值滤波范围,并利用类间方差阈值算法对滤波处理后图像进行分割处理,获取分割图像。
答:由(1)得知,最合适的中值滤波窗口大小应为3,故选取以3为窗口大小进行中值滤波后的图像进行后续处理。用tabulate()函数进行像素灰度级统计,抽取得到矩阵的第一列(灰度值)和第三列(元素的百分比)进行后续计算。阈值t从0到255依次进行遍历,分别计算每一个t对应的类间方差,选取最大类间方差对应的阈值作为最佳阈值,对图像进行分割。实验得到最佳阈值为124,分割后的图像如下所示:
实验采用的源代码如下:
%类间方差阈值分割
figure
pixelCounts = tabulate(mImg(:));
grayLevels = pixelCounts(:, 1);
probabilities = pixelCounts(:, 3) / 100; % 转换为小数
totalPixels = numel(mImg);
classVariances = zeros(256,1);
for t = 1:256
% 计算类间方差
w0 = sum(probabilities(1:t));
mu0 = sum(grayLevels(1:t) .* probabilities(1:t)) / w0;
w1 = sum(probabilities(t+1:end));
if(w1>0)
mu1 = sum(grayLevels(t+1:end) .* probabilities(t+1:end)) / w1;
else
mu1=0;
end
classVariances(t) = w0 * w1 * (mu0 - mu1)^2;
end
% 选择最佳阈值
[~,optimalThreshold] = max(classVariances);
fprintf("类间方差阈值算法的最佳阈值为:%d\n",optimalThreshold);
% 阈值分割
binaryImg = mImg > optimalThreshold;
imshow(binaryImg)
title("类间方差阈值算法分割的图像");
(3)利用数学形态学中的腐蚀和膨胀运算处理,剔除分割处理结果中的一些细小的残余误分割点,在进行腐蚀和膨胀运算时可采用半径为r的圆形结构元素,注意比较选取不同r值时的处理结果(r分别取3、5、7)。
答:圆形结构元素的半径值r依次取3、5、7,对上一步类间方差阈值算法分割得到的图像先进行腐蚀再进行膨胀运算,腐蚀和膨胀分别使用函数imerode()和imdilate(),得到的图像如下所示:
观察得知,采用的r越大,得到的图像细节越不突出。
实验采用的源代码如下:
% 进一步腐蚀和膨胀运算
figure
dilatedImg=cell(1,3);
for r=1:3
SE=strel('disk',2*r+1);
erodedImg=imerode(binaryImg,SE);
dilatedImg{r}=imdilate(erodedImg,SE);
subplot(1,3,r)
imshow(dilatedImg{r})
title(['腐蚀膨胀后图像,半径为',num2str(2*r+1)]);
end
标签:分割,psnr,阈值,类间,滤波,图像
From: https://www.cnblogs.com/Silverplan/p/17977328