求一个用otsu算法的图像分割matlab程序

求一个用otsu算法的图像分割matlab程序,第1张

image_1=imread('E:\ebook\lena.bmp')%读入图片

image_1=rgb2gray(image_1)%灰度化

[m,n]=size(image_1)%计算图片的像素点个数,行列,n是列数,Gray

num=zeros(1,256)%存放各灰度级出现的次数

p=zeros(1,256)%存放慧铅各灰度级的比率

image_1=double(image_1)%双精度化

for i=1:m

for j=1:n

num(image_1(i,j)+1)=num(image_1(i,j)+1)+1%统计各灰度级的像素点个数

end

end

for i=1:256

p(i)=num(i)/(m*n)%计中碧销算各灰度级出现的比率

end

for i=2:256

if p(i)~=0

st=i+1%实现寻找出现比卖游率不为0的最小灰度值

break

end

end

for i=256:-1:1

if p(i)~=0

nd=i-1%实现找出出现比率不为0的最大灰度值

break

end

end

%以下程序实现利用最小方差和法找出门阈值

w=infth=0

for t=st:nd%最小非零比率灰度值到最大非零比率灰度值

qt1=0qt2=0%前景后景像素点比率

u1=0 u2=0%前景后景均值

v1=0 v2=0%

for i=1:t

qt1=qt1+p(i)

end

for i=1:t

u1=u1+i*p(i)/qt1

end

for i=1:t

v1=v1+((i-u1)^2)*p(i)/qt1

end

for i=t+1:256

qt2=qt2+p(i)

end

for i=t+1:256

u2=u2+i*p(i)/qt2

end

for i=t+1:256

v2=v2+((i-u2)^2)*p(i)/qt2

end

if qt1*v1+qt2*v2<w

th=tw=qt1*v1+qt2*v2

end

end

for i=1:m

for j=1:n

if (image_1(i,j)+1>th)

image_2(i,j)=255

else

image_2(i,j)=0

end

end

end

image_2=uint8(image_2)%读入读出变换

figure,imshow(image_2)%显示二值化后的图片

       图像处理的很多任务都离不开图像分割。因为图像分割在cv中实在太重要(有用)了,就先把图像分割的常用算法做个总结。

        接触机器学习和深度学习时间已经不短了。期间看过各种相关知识但从未总结过。本文过后我会尽可能详细的从工程角度来总结,从传统机器学习算法,传统计算机视觉库算法到深度学习目前常用算法和论文,以及模型在各平台的转化,量化,服务化部署等相关知识总结。

  桐凯      图像分割常用算法大致分为下面几类。由于图像的能量范函,边缘追踪等方法的效果往往只能解决特定问题,效果并不理想,这里不再阐述。当然二值化本身也可以分割一些简单图像的。但是二值化算法较多,我会专门做一个文章来总结。这里不再赘述。

        1.基于边缘的图像分割算法:

            有利用图像梯度的传统算法算子的sobel,roberts,prewitt,拉普拉斯以及canny等。

            这些算法的基本思想都是采用合适的卷积算子,对图像做卷积。从而求出图像对应的梯度图像。(至于为什么通过如图1这样的算子卷积,即可得到图像的梯度图像,请读者复习下卷积和倒数的概念自行推导)由于图像的边缘处往往是图像像素差异较大,梯度较大地方。因此我们通过合适的卷积核得到图像的梯度图像,即得到了图像的边缘图像。至于二阶算子的推导,与一阶类似。优点:传统算子梯袜空度检测,只需要用合适的卷积核做卷积,即可快速得出对应的边缘图像。缺点:图像边缘不一定准确,复杂图像的梯度不仅仅出现在图像边缘,可以能出现在图像内部的色彩和纹理上。

             也有基于深度学习方法hed,rcf等。由于这类网络都有同一个比较严重的缺陷,这里只举例hed网络。hed是基于FCN和VGG改进,同时引出6个loss进行优化训练,通过多个层输出不同scale的粒度的边缘,然后通过一个训练权重融合各个层的边缘结果。hed网络结构如下:

可以得到一个比较完整的梯度图像,可参考github的hed实现。优点:图像的梯度细节和边缘完整性,相比传统的边缘算子要好很多。但是hed对于边缘的图像内部的边缘并不能很好的区分。当然我们可以自行更改loss来尝试只拟合外部的图像边缘。但最致命的问题在于,基于vgg的hed的网络表达能力有限,对于图像和背景接近,或者图像和背景部分相融的图片,hed似乎就有点无能为力了。

        2.基于区域分割的算法:

            区域分割比较常用的如传统的算法结合遗传算法,区域生长算法,区域分裂合并,分水岭算法等。这里传统算法的思路是比较简单易懂的,如果有无法理解的地方,欢迎大家一起讨论学习。这里不再做过多的分析。

            基于区域和语意的深度学习分割算法,是目前图像分割成果较多和研究的主要方向。例如FCN系列的全卷积网络,以及经典的医学图像分割常用的unet系列,以及rcnn系列发展下的maskrcnn,以及18年底的PAnet。基于语意的图像分割技术,无疑会成为图像分割技术的主流。

            其中,基于深度学习语意的其他相关算法也可以间接或直接的应用到图像分割。如经典的图像matting问题。18年又出现了许多非常优秀的算法和论文。如Deep-Image-Matting,以及效果非常优秀的MIT的 semantic soft segmentation(sss).

            基于语意的图像分割效果明显要好于其他的传统算法。我在解决图像分割的问题时,首先尝试用了hed网络。最后的效果并不理想。虽然也参考github,做了hed的一些fine-tune,但是还是上面提到的原因,在我多次尝试后,最终放弃。转而适用FCN系列的网络。但是fcn也无法解决图像和背景相融的问题。图片相融的分割,感觉即需要大的感受野,又需要未相融部分原图像细节,所以单原FCN的网络,很难做出准确的分割。中间还测试过很多其局好唤他相关的网络,但都效果不佳。考虑到感受野和原图像细节,尝试了resnet和densenet作为图像特征提取的底层。最终我测试了unet系列的网络:

                unet的原始模型如图所示。在自己拍照爬虫等手段采集了将近1000张图片。去掉了图片质量太差的,图片内容太过类似的。爬虫最终收集160多张,自己拍照收集200张图片后,又用ps手动p了边缘图像,采用图像增强变换,大约有300*24张图片。原生unet网络的表现比较一般。在将unet普通的卷积层改为resnet后,网络的表达能力明显提升。在将resnet改为resnet101,此时,即使对于部分相融的图像,也能较好的分割了。但是unet的模型体积已经不能接受。

                在最后阶段,看到maskrcnn的实例分割。maskrcnn一路由rcnn,fasterrcnn发展过来。于是用maskrcnn来加入自己的训练数据和label图像进行训练。maskrcnn的结果表现并不令人满意,对于边缘的定位,相比于其他算法,略显粗糙。在产品应用中,明显还不合适。                

        3.基于图的分割算法

            基于深度学习的deepgrab,效果表现并不是十分理想。deepgrab的git作者backbone采用了deeplabv2的网络结构。并没有完全安装原论文来做。

论文原地址参考: https://arxiv.org/pdf/1707.00243.pdf

整体结构类似于encode和decoder。并没有太仔细的研究,因为基于resent101的结构,在模型体积,速度以及deeplab的分割精度上,都不能满足当前的需求。之前大致总结过计算机视觉的相关知识点,既然目前在讨论移动端模型,那后面就分模块总结下移动端模型的应用落地吧。

由于时间实在有限。这里并没有针对每个算法进行详细的讲解。后续我会从基础的机器学习算法开始总结。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12524395.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存