使用Julia进行图像处理--使用形态学运算进行图像调整(1)

将转换为二值版本的图像与原始图像放在一起进行对比:

使用restrict函数缩放原始图像和二值图像

img = restrict(img)

img_binary = restrict(RGB.(Gray.(img_binary)))

使用size标识图像缩放版本的宽度

img_width = size(img, 2)

使用填充功能创建新图像,其宽度是原来的两倍

combined_image = fill(RGB4{Float32}(0.,0.,0.), size(img) .* (1, 2))

将图像放在一起进行对比

combined_image[:, 1:img_width] = img

combined_image[:, img_width+1:img_width*2] = img_binary

imshow(combined_image)

图像对比

形态学运算也可以应用于灰度图像。

基本运算


数学形态学是一组与图像的形状或特征有关的非线性运算和技术。图像形态学有两个基本要素:

  1. 二进制或灰度图像

  2. 结构元素

已经讨论了有关图像和配色方案的先决条件,但是结构元素是新的。结构元素通常是一个3x3二值块,可在图像上滑动并更新它。滑动结构元素可以实现两个基本操作:

  1. 图像侵蚀:从对象边界去除像素

  2. 图像膨胀:将像素添加到图像中对象的边界

ImageMorphology包进行的侵蚀和膨胀仅支持3x3结构元素。 3×3正方形是用于形态学运算的最流行的结构元素。较大的结构元素会产生更极端的侵蚀或膨胀效果,通常通过多次重复3x3结构元素运算获得相似的结果。

图像侵蚀

图像侵蚀是数学形态学领域的两个基本运算符之一。侵蚀是缩小图像前景或1值对象的过程。它可以平滑对象边界并去除小物体。

为了了解图像侵蚀的工作方式,首先在包含白噪声的简单图像上进行尝试,然后继续比较将其应用于照片的二值和灰度版本时的结果。

使用侵蚀分离物体

对于此任务,使用如下图片。它具有许多不同的连接图形,并且两侧都添加了噪声:

geometrical_image

从加载图像并将其转换为灰度开始:

using Images, ImageView, ImageMorphology

geom_img = load(“pictures/geometrical-figures-and-noise.jpg”);

geom_img_binary = Gray.(Gray.(geom_img) .> 0.5);#keeps white objects white

接下来,应用erode函数来进行转换:

geom_img_binary_e = erode(geom_img_binary)

imshow(geom_img_binary_e)

以下结果图像将显示在屏幕上。能够看到噪音大大减少并且对象分离得到改善:

erode_image_1

一次运行侵蚀功能并不能完全消除噪音,它使对象保持连接。运行erode函数数次查看结果:

geom_img_binary_e = erode(erode(geom_img_binary_e))

geom_img_binary_e = erode(erode(geom_img_binary_e))

imshow(geom_img_binary_e)

erode_image_5

准备用于文本识别的图像

将图像侵蚀应用于真实照片,将车牌上的字母和数字与其余内容分开:

车牌示例

首先加载图像,然后创建一个二进制版本,然后多次应用erode函数并比较结果:

using Images, ImageView, ImageMorphology

carplate_img = load(“pictures/caribbean-2726429_640.jpg”)

carplate_img_binary = Gray.(Gray.(carplate_img) .< 0.5);

converts black objects to white and vice-versa

carplate_img_binary_e = erode(carplate_img_binary)

imshow(carplate_img_binary)

carplate_img_binary_e = erode(erode(carplate_img_binary_e))

imshow(carplate_img_binary_e)

三次侵蚀图像的结果。图像上没有其他文字,并且车牌清晰。可以用于文本识别任务:

在侵蚀结果

图像膨胀

膨胀是形态学领域中的另一个基本操作。图像膨胀是逐渐扩大前景像素区域的边界或1值对象的大小的过程。因此,前景像素的区域会增大尺寸,平滑对象边界并封闭对象之间的孔和间隙。

合并几乎连接的对象

同样使用在使用侵蚀分离物体部分中使用的图片。它具有许多不同的连接图形,并且两侧都添加了噪声:

geomtrical_image

首先删除几何对象之间的间隙和孔,并使用以下代码比较一次运行膨胀函数一次和三次的情况:

using Images, ImageView, ImageMorphology

geom_img = load(“pictures/geometrical-figures-and-noise.jpg”);

geom_img_binary = Gray.(1 * Gray.(geom_img) .> 0.5);

geom_img_binary_d = dilate(geom_img_binary)

imshow(geom_img_binary_d)

geom_img_binary_d = dilate(dilate(geom_img_binary_d))

imshow(geom_img_binary_d)

可以看到三次膨胀后图形之间的重叠增加了很多,并且右侧的噪点变成了单个对象。

dilate_image

突出显示细节

尝试将膨胀函数应用于带有车牌的图像。如果侵蚀功能已将车牌字母和数字分开,则膨胀将扩展每个对象的边界:

using Images, ImageView, ImageMorphology

carplate_img = load(“pictures/caribbean-2726429_640.jpg”)

carplate_img_binary = Gray.(Gray.(carplate_img) .< 0.5)

carplate_img_binary_d = dilate(carplate_img_binary)

imshow(carplate_img_binary_d)

突出显示细节

派生操作


开运算和闭运算是形态学的另外两个主要运算符。它们都源自基本操作-侵蚀和扩张。它们同样通常用于二进制或灰度图像。

从技术角度来看,可以通过以下方式描述开运算和闭运算:

  1. 开运算:这是侵蚀后再膨胀

  2. 闭运算:这是膨胀后再侵蚀

侵蚀不是膨胀的逆过程。通常,侵蚀和膨胀交替进行会产生与原始图像不同的图像,并且偶然会产生相同的结果。

与基本形态运算符一样,确切的运算由结构元素确定,该元素在Julia中固定为3x3的块。

图像开运算

图像开运算在某种程度上可与侵蚀相媲美。它被用于去除边缘的前景像素。但是,总的来说,它不如侵蚀有效。

图像开运算的目标是保持前景区域具有与结构元素相似的形状或可以完全包含结构元素,同时消除前景像素的所有其他区域。

为了说明它在实际中是如何工作的,使用几何图形,并观察开运算与侵蚀的不同之处,将opening函数应用于上一张图片:

using Images, ImageView, ImageMorphology

geom_img = load(“pictures/geometrical-figures-and-noise.jpg”);

geom_img_binary = Gray.(1 * Gray.(geom_img) .> 0.5);

geom_img_binary_o = opening(geom_img_binary)

imshow(geom_img_binary_e)

image_opening

比较打开和侵蚀功能所产生的结果,开运算保持大对象不变,同时消除了小点,而侵蚀减少了所有对象的大小。

图像闭运算

图像闭运算是扩张后侵蚀。与开运算类似,它是从侵蚀和膨胀的基本过程创建的,同样,它可以应用于二进制和灰度图像。

闭运算符的结果与膨胀非常相似,但有一些例外。它主要侧重于消除背景色孔,同时又不破坏目标对象的原始边界形状。

与图像开运算类似,使用具有几何图形的图像并调整代码以执行闭运算操作:

using Images, ImageView, ImageMorphology

geom_img = load(“pictures/geometrical-figures-and-noise.jpg”);

geom_img_binary = Gray.(Gray.(geom_img) .> 0.5);

geom_img_binary_c = closing(geom_img_binary)

imshow(geom_img_binary_c)

image_closing

如果将显示的图像与膨胀的结果进行比较,会看到大物体的尺寸没有增大,背景的一小部分变为白色。

顶帽和低帽操作


当对从图像中获取一些小细节感兴趣时,可以利用 JuliaMorphology软件包的tophat和bothat运算符专注于检索此类细节。

顶帽操作用于增强深色背景上感兴趣的明亮物体。它通过从原始图像中减去运行开运算函数的结果来变换图像。它包含源图像的那些元素,这些元素小于结构元素并且比其相邻元素明亮。

另一方面,低帽操作则相反。也就是说,它用于增强明亮背景上感兴趣的深色物体。低帽操作运算符返回的图像是从图像的形态封闭运算后的图像中减去原始图像的结果。结果包含的对象或元素小于结构元素,并且比其周围环境暗。

Julia使用以下代码在具有几何图形的图像上执行两个滤波器,从而实现了tophat和bothat函数:

using Images, ImageView, ImageMorphology

apply tophat and bothat to an image

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

img_convert/252731a671c1fb70aad5355a2c5eeff0.png)

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

img
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值