感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
对于此任务,使用如下图片。它具有许多不同的连接图形,并且两侧都添加了噪声:
从加载图像并将其转换为灰度开始:
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)
比较打开和侵蚀功能所产生的结果,开运算保持大对象不变,同时消除了小点,而侵蚀减少了所有对象的大小。
图像闭运算
图像闭运算是扩张后侵蚀。与开运算类似,它是从侵蚀和膨胀的基本过程创建的,同样,它可以应用于二进制和灰度图像。
闭运算符的结果与膨胀非常相似,但有一些例外。它主要侧重于消除背景色孔,同时又不破坏目标对象的原始边界形状。
与图像开运算类似,使用具有几何图形的图像并调整代码以执行闭运算操作:
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)
如果将显示的图像与膨胀的结果进行比较,会看到大物体的尺寸没有增大,背景的一小部分变为白色。
当对从图像中获取一些小细节感兴趣时,可以利用 JuliaMorphology软件包的tophat和bothat运算符专注于检索此类细节。
顶帽操作用于增强深色背景上感兴趣的明亮物体。它通过从原始图像中减去运行开运算函数的结果来变换图像。它包含源图像的那些元素,这些元素小于结构元素并且比其相邻元素明亮。
另一方面,低帽操作则相反。也就是说,它用于增强明亮背景上感兴趣的深色物体。低帽操作运算符返回的图像是从图像的形态封闭运算后的图像中减去原始图像的结果。结果包含的对象或元素小于结构元素,并且比其周围环境暗。
Julia使用以下代码在具有几何图形的图像上执行两个滤波器,从而实现了tophat和bothat函数:
using Images, ImageView, ImageMorphology
apply tophat and bothat to an image
geom_img = load(“pictures/geometrical-figures-and-noise.jpg”);
geom_img_gray = Gray.(geom_img);
geom_img_th = tophat(geom_img_gray)
geom_img_bh = bothat(geom_img_gray)
create a preview
geom_img_new = zeros(ColorTypes.Gray{FixedPointNumbers.Normed{UInt8,8}}, size(geom_img_gray) .* (1, 2));
geom_img_new_center = Int(size(geom_img_gray, 2))
geom_img_new[:, 1:geom_img_new_center] = geom_img_th
geom_img_new[:, geom_img_new_center:end - 1] = geom_img_bh
geom_img_new[:, geom_img_new_center] = 1
imshow(Gray.(geom_img_new))
从以下结果中可以看到,tophat函数抑制了所有大对象,只保留了原始图像的小细节:
调整图像对比度
通过将原始图像添加到经过顶帽过滤的图像中,然后减去经过低帽过滤的图像,可以在灰度图像上调整图像对比度:
using Images, ImageView, ImageMorphology
minmax = scaleminmax(Gray, 0, 1) # limit values on a scale from 0 to 1
adjust image contrast
img = load(“pictures/custom_image_name.jpg”);
img_gray = Gray.(img);
img_new = minmax.(img_gray + tophat(img_gray) - bothat(img_gray))
如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!