2024年最全使用Julia进行图像处理--图像分割(1)

本文介绍了如何使用手动和自动方法进行图像分割,如使用map和Felzenszwalb算法进行区域平均颜色值替换。着重讨论了Felzenszwalb算法的无监督特性,以及如何通过调整参数优化分割效果。同时,快速扫描算法也被提及,以其高效性和精度对比。文章最后展示了如何使用分割修剪技术提高图像质量。
摘要由CSDN通过智能技术生成

使用map函数将每个像素的块号替换为块的平均颜色值:

imshow(map(i->segment_mean(segments,i), labels_map(segments)))

这将导致图像包含两种颜色,绿色代表草,另一种代表猫。由于图像相对简单并且可以轻松分离猫,因此结果的质量很高:

segments

尽管该方法涉及手动工作,但在为神经网络执行的图像分割任务准备训练数据集时,它可能很方便。

识别复杂对象

尝试分离或分割无法轻易与背景分离或由多个部分组成的对象。尝试使用一张鸟的图像:

bird_image

运行上一节中的代码,看看它是否需要任何改进:

using Images, ImageView, ImageSegmentation

img = load(“bird-3183441_640.jpg”);

seeds = [

(CartesianIndex(220,250), 1), # apprx. object location

(CartesianIndex(220,500), 2) # background location

]

segments = seeded_region_growing(img, seeds)

imshow(map(i->segment_mean(segments,i), labels_map(segments)))

从下面的图像中,可以看出它的最终效果与猫的图像不同。分割过程无法完全分离对象:

segments

复杂之处在于,鸟由多种颜色组成,其中有些与背景相似。尝试定义更多的分割,看看是否可以改善结果。与上一节相同,将鼠标悬停在图像的不同区域上并记下坐标:

img = load(“bird-3183441_640.jpg”);

seeds = [

(CartesianIndex(240,120), 1),

(CartesianIndex(295,70), 2),

(CartesianIndex(319,40), 3),

(CartesianIndex(90,300), 4),

(CartesianIndex(295,325), 5),

(CartesianIndex(76,135), 6) # background color

]

segments = seeded_region_growing(img, seeds)

imshow(map(i->segment_mean(segments,i), labels_map(segments)))

定义更多的分割有助于分离对象。还可以看到每个区域的平均颜色有多大差异,从沙色到黑色变化:

segments

这种方法的最大缺点是必须手动定义分割区域。

无监督方法


无监督方法不需要标记区域或手动选择区域。识别分割块的过程是全自动的,具有一些可用于设置最小块大小和细分程度的超参数。

基于图的方法

使用Felzenszwalb算法,这是一种无监督且高效的基于图的方法。在计算机视觉中广泛应用。使用Felzenszwalb算法的好处如下:

  1. 少数超参数

  2. 快速,线性时间复杂度

Julia在felzenszwalb函数中实现了Felzenszwalb算法,该函数是ImageSegmentation包的一部分。 felzenszwalb具有两个参数:

  1. 区域合并步长的阈值;值越大,分割越大,通常将其设置为10到500

  2. 最小的块大小(可选);通常为20或更高

根据任务,修改参数值。从加载包和图像开始:

using Images, ImageView, ImageSegmentation

img = load(“cat-3352842_640.jpg”);

imshow(img);

尝试使用合并步长阈值为75的Felzenszwalb算法,并比较其在最小段大小的不同值下的性能:

segments_1 = felzenszwalb(img, 75)

segments_2 = felzenszwalb(img, 75, 150)

segments_3 = felzenszwalb(img, 75, 350)

segment_x变量保留有关每个像素及其类的信息。

当比较Felzenszwalb算法的三种不同结果时,将从分割块到颜色的转换作为单独的函数:

segment_to_image(segments) = map(i->segment_mean(segments, i), labels_map(segments))

将结果合并在一起,并用黑线将它们分开:

img_width = size(img, 2)

new_img = hcat(

segment_to_image(segments_1),

segment_to_image(segments_2),

segment_to_image(segments_3)

)

new_img[:, img_width] = new_img[:, img_width*2] .= colorant"black"

imshow(new_img)

尽管该算法的性能不如监督方法,但结果仍然可以接受。还应该注意三个不同图像上的细节数量。通过将最小片段大小从0像素增加到150和350像素,第二张图像减少了的细节数量,第三张图像中删除了的大多数前景和背景细节。

felzenszwalb

为前例中鸟的图像运行相同的代码,然后为这两个参数尝试不同的值。在下面的代码示例中,使用设置(10),(30,50)和(35,300)来运行felzenszwalb函数。

load an image

img = load(“bird-3183441_640.jpg”);

find segments

segments_1 = felzenszwalb(img, 10)

segments_2 = felzenszwalb(img, 30, 50)

segments_3 = felzenszwalb(img, 20, 350)

the rest of the code from a previous example

第一次分割将鸟分离得很好,并保留了图像的大部分细节。第二个和第三个版本都是原始图像的简化版本,第三个图像很好地选择了前景区域,如下图所示:

felzenszwalb

快速扫描算法

快速扫描算法是另一种无监督的图像分割算法。快速扫描算法可有效用于食物,运动和医学图像。它通过扫描图像中的像素并将相似阈值内相似的相邻像素分组来工作。

Julia在fast_scanning函数中实现了快速扫描算法,该函数是Julia的ImageSegmentation软件包的一部分。 fast_scanning函数具有三个输入参数:

  1. 图像:彩色或灰度

  2. 阈值:图像范围内的浮点值或矩阵

  3. diff_fn(可选):计算差异的自定义函数

为每个分割图使用不同的值:0.05,0.15和0.2。值越高,将创建的分割数越少:

using Images, ImageView, ImageSegmentation

convert image segments to mean color value

segment_to_image(segments) = map(i->segment_mean(segments, i), labels_map(segments))

img = load(“cat-3352842_640.jpg”);

find segments

segments_1 = fast_scanning(img, 0.05)

segments_2 = fast_scanning(img, 0.15)

segments_3 = fast_scanning(img, 0.2)

preview the results

img_width = size(img, 2)

new_img = hcat(

segment_to_image(segments_1),

segment_to_image(segments_2),

segment_to_image(segments_3)

)

new_img[:, img_width] = new_img[:, img_width*2] .= colorant"black"

imshow(new_img)

该算法的执行速度比Felzenszwalb算法快得多。结果也具有较高的精度,如下所示:

Fast_scanning第三张图像的唯一问题是快速扫描算法保留了一些小分割块。

使用分割修剪技术,类似于种子区域增长算法,将最小分割块大小设置为350像素。prune_segments函数要求定义两个匿名函数-一个用于识别小分割块像素,另一个用于实际替换:

deletion_rule = i -> (segment_pixel_count(segments_3, i) < 350)

replacement_rule = (i, j) -> (-segment_pixel_count(segments_3, j))

segments_n = prune_segments(segments_3, deletion_rule, replacement_rule)

imshow(segment_to_image(segments_n))

图像上没有噪点,并且猫的修剪效果非常好:

Fast_scanning

继续观察并比较该算法在鸟类图像上的性能:

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
programming language for data science and its applications. It also serves as a guide to handle data in the most available formats, and shows how to crawl and scrape data from the Internet. Chapter 2, Metaprogramming, covers the concept of metaprogramming, where a language can express its own code as a data structure of itself. For example, Lisp expresses code in the form of Lisp arrays, which are data structures in Lisp itself. Similarly, Julia can express its code as data structures. Chapter 3, Statistics with Julia, teaches you how to perform statistics in Julia, along with the common problems of handling data arrays, distributions, estimation, and sampling techniques. Chapter 4, Building Data Science Models, talks about various data science and statistical models. You will learn to design, customize, and apply them to various data science problems. This chapter will also teach you about model selection and the ways to learn how to build and understand robust statistical models. Chapter 5, Working with Visualizations, teaches you how to visualize and present data, and also to analyze and the findings from the data science approach that you have taken to solve a particular problem. There are various types of visualizations to display your findings, namely the bar plot, the scatter plot, pie chart, and so on. It is very important to choose an appropriate method that can reflect your findings and work in a sensible and an aesthetically pleasing manner. Chapter 6, Parallel Computing, talks about the concepts of parallel computing and handling a lot of data in Julia.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值