首页 > 其他分享 >图像分割

图像分割

时间:2024-01-20 23:22:40浏览次数:21  
标签:分割 psnr 阈值 类间 滤波 图像

图像分割

实验目的

(1) 了解图像分割的基本原理,并利用图像分割算法进行图像分割处理;

(2) 掌握数学形态学的基本运算。

实验内容

(1) 利用类间方差阈值算法实现图像的分割处理;

(2) 利用形态学处理进行处理结果修正。

实验原理

(1) 中值滤波原理

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序, 生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为。其中,分别为原始图像和处理后的图像。为二维模板,通常为 3*3、5*5 的区域。

(2) 类间方差阈值算法

按图像的灰度特性,将图像分成背景和目标两部分。背景和目标间的类间方差越大,说明构成图像的两部分差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

(3) 腐蚀和膨胀运算处理

形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算;先腐蚀后膨胀的过程称为开运算。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。先膨胀后腐蚀的过程称为闭运算。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。

实验结果与分析

(1)对输入图像进行平滑处理,以减小噪声对分割处理的影响,比较中值滤波范围取不同值时对图像滤波的效果。

答:读入图像后,采用中值滤波的方式对图像进行平滑处理,在实验中可使用medfilt2()函数。中值滤波的窗口大小分别取3、5、7、9进行滤波处理。计算滤波后的图像的PSNR值,选取PSNR值最大的图像进行后续处理。中值滤波窗口大小分别取3、5、7、9滤波后的图像如下所示:

figure2

观察得知滤波的窗口越大,滤波后的图像噪点越少,但得到的图像也越模糊。

滤波后的图像对应的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,分割后的图像如下所示:

figure3

实验采用的源代码如下:

%类间方差阈值分割

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(),得到的图像如下所示:

figure4

观察得知,采用的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

相关文章

  • Python Matplotlib 多个坐标系下绘制多个图像
    ​ 1、绘制图像使用 plt.subplots()可以创建一个图形对象以及一个或多个子图(axes)对象。使得在同一个窗口中绘制多个图像变得非常简单和直观。使用 plt.subplots(),可以轻松地管理多个子图的布局,并且可以对每个子图进行独立的绘图和自定义设置。常用参数如下,参数说明......
  • 20240119方程图像研究
    事情起因:研究人员:csj、lqy、xzq、yjf方程图像研究要求:描点法画图(使用卡西欧),在\(x\)轴上任取值,对于给定\(x_0\),应在有限时间内求出所有对应的\(y\)。草图绘制(直接绘制):综合方程性质(如定义域、单调性、对称性),明确区间单调性及端点,利用对称性作图、或化归为已知方程并求出其......
  • 图像采集和多缓存项目中的若干总结
    遇到的问题:1.图像滚动:原因:没有读出/写入整幅图像导致;2.图像错位:原因:在读出当前帧前,已向fifo里写入了若干数据;(合理的设置hdmi的启动可以解决这个问题);3.图像撕裂:原因:读到了写入区域;缓存多帧数可以解决这个问题;4.缓存后的图像闪动:原因:没有准确的设置启动,导致不合理的地址跳跃;5.6......
  • 记录--前端实现翻转图像
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助翻转图像是在视觉上比较两个不同图像的常用方法。单击其中一个将翻转它,并显示另一个图像。布局布局结构如下:<divclass="flipping-images"><divclass="flipping-images__inner"><divclass="flip......
  • 分割回文串 131
    这也是用回溯解决,回溯就是多层for循环,但是这一题有点难发现多层for循环体现在哪里。实际上该问题for循环的层数与字符串的间隔有关for循环的层数代表,分割线的个数;for循环的遍历代表这分割线的位置。这里引用卡哥的图:因为分割线不能取前一个的位置,所以要根据之前组合那题的套......
  • Python 图像查看器
    当然,这里是一个简洁而全面的介绍,适合用于在博客中介绍这个图像查看器程序:Python图像查看器在这篇博客中,我将向大家介绍一个由我开发的简单但功能强大的图像查看器。这个图像查看器是用Python编写的,利用了Tkinter图形用户界面库来提供直观的用户体验。它不仅可以浏览单个文件......
  • C++:GDAL中CreateCopy()函数生成的栅格图像如何修改波段数?
      本文介绍基于C++语言GDAL库,为CreateCopy()函数创建的栅格图像添加更多波段的方法。  在C++语言的GDAL库中,我们可以基于CreateCopy()函数与Create()函数创建新的栅格图像文件。其中,CreateCopy()函数需要基于一个已有的栅格图像文件作为模板,将模板文件的各项属性信息(例如空......
  • 【论文笔记#2】Farseg++:用于高空间分辨率遥感图像地理空间对象分割的前景感知关系网络
    论文来源IEEETransactionsonPatternAnalysisandMachineIntelligence作者ZhuoZheng;YanfeiZhong;JunjueWang等发表年代2023使用方法多分支金字塔编码、前景-场景关系、前景感知解码、前景感知优化期刊层次CCFA;计算机科学1区;IF23.6原文链接......
  • Zynq7020 使用 Video Processing Subsystem 实现图像缩放
    1、前言没玩过图像缩放都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。目前市面上主流的FPGA图像缩放方案如下:1:Xilinx的HLS方案,该方案简单,易于实现,但只能用于Xilinx自家的FPGA;2:非纯Verilog方案,大部分代码使用Verilog实现,但中间的fifo或ram等使用了IP,导致......
  • 图像算法(掩膜)
    在图像处理中,掩膜(Mask)是一个用于指定图像中感兴趣区域的二进制图像或矩阵。掩膜通常用于选择、过滤或操作图像的特定区域。掩膜通常表示为一个二进制图像,其中白色像素表示感兴趣的区域,而黑色像素表示不感兴趣的区域。在计算机科学中,掩膜(mask)通常是一个二进制模式,用于对另一个数......