img = load(“sample-images/bird-3183441_640.jpg”);
convert image to grayscale and binarise the only channel
1. 将图像转换为灰度
2. 将所有大于0.5的值转换为true,而小于0.5的所有值转换为false
3. 通过将1乘以结果数组,它将true和false值转换为1或0
img_binary = 1 * (Gray.(img) .> 0.5);
将转换为二值版本的图像与原始图像放在一起进行对比:
使用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)
形态学运算也可以应用于灰度图像。
数学形态学是一组与图像的形状或特征有关的非线性运算和技术。图像形态学有两个基本要素:
-
二进制或灰度图像
-
结构元素
已经讨论了有关图像和配色方案的先决条件,但是结构元素是新的。结构元素通常是一个3x3二值块,可在图像上滑动并更新它。滑动结构元素可以实现两个基本操作:
-
图像侵蚀:从对象边界去除像素
-
图像膨胀:将像素添加到图像中对象的边界
从ImageMorphology
包进行的侵蚀和膨胀仅支持3x3结构元素。 3×3正方形是用于形态学运算的最流行的结构元素。较大的结构元素会产生更极端的侵蚀或膨胀效果,通常通过多次重复3x3结构元素运算获得相似的结果。
图像侵蚀
图像侵蚀是数学形态学领域的两个基本运算符之一。侵蚀是缩小图像前景或1值对象的过程。它可以平滑对象边界并去除小物体。
为了了解图像侵蚀的工作方式,首先在包含白噪声的简单图像上进行尝试,然后继续比较将其应用于照片的二值和灰度版本时的结果。
使用侵蚀分离物体
对于此任务,使用如下图片。它具有许多不同的连接图形,并且两侧都添加了噪声:
从加载图像并将其转换为灰度开始:
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函数数次查看结果:
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函数并比较结果:
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值对象的大小的过程。因此,前景像素的区域会增大尺寸,平滑对象边界并封闭对象之间的孔和间隙。
合并几乎连接的对象
同样使用在使用侵蚀分离物体
部分中使用的图片。它具有许多不同的连接图形,并且两侧都添加了噪声:
首先删除几何对象之间的间隙和孔,并使用以下代码比较一次运行膨胀函数一次和三次的情况:
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)
可以看到三次膨胀后图形之间的重叠增加了很多,并且右侧的噪点变成了单个对象。
突出显示细节
尝试将膨胀函数应用于带有车牌的图像。如果侵蚀功能已将车牌字母和数字分开,则膨胀将扩展每个对象的边界:
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)
开运算和闭运算是形态学的另外两个主要运算符。它们都源自基本操作-侵蚀和扩张。它们同样通常用于二进制或灰度图像。
从技术角度来看,可以通过以下方式描述开运算和闭运算:
-
开运算:这是侵蚀后再膨胀
-
闭运算:这是膨胀后再侵蚀
侵蚀不是膨胀的逆过程。通常,侵蚀和膨胀交替进行会产生与原始图像不同的图像,并且偶然会产生相同的结果。
与基本形态运算符一样,确切的运算由结构元素确定,该元素在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)
比较打开和侵蚀功能所产生的结果,开运算保持大对象不变,同时消除了小点,而侵蚀减少了所有对象的大小。
图像闭运算
图像闭运算是扩张后侵蚀。与开运算类似,它是从侵蚀和膨胀的基本过程创建的,同样,它可以应用于二进制和灰度图像。
闭运算符的结果与膨胀非常相似,但有一些例外。它主要侧重于消除背景色孔,同时又不破坏目标对象的原始边界形状。
现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。
分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!