跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算
摘要:本篇文章结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现。
本文分享自华为云社区《[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽运算》,作者: eastmount。
本篇文章继续深入,结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现。
一.图像顶帽运算
图像顶帽运算(top-hat transformation)又称为图像礼帽运算,它是用原始图像减去图像开运算后的结果,常用于解决由于光照不均匀图像分割出错的问题。其公式定义如下:
图像顶帽运算是用一个结构元通过开运算从一幅图像中删除物体,校正不均匀光照的影响,其效果图如下图所示。
在Python中,图像顶帽运算主要调用morphologyEx()实现,其中参数cv2.MORPH_TOPHAT表示顶帽处理,函数原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
- src表示原始图像
- cv2.MORPH_TOPHAT表示图像顶帽运算
- kernel表示卷积核,可以用numpy.ones()函数构建
假设存在一张光照不均匀的米粒图像,如图所示,我们需要调用图像顶帽运算解决光照不均匀的问题。其Python代码如下所示:
- #encoding:utf-8
- import cv2
- import numpy as np
- #读取图片
- src = cv2.imread('test06.png', cv2.IMREAD_UNCHANGED)
- #设置卷积核
- kernel = np.ones((10,10), np.uint8)
- #图像顶帽运算
- result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
- #显示图像
- cv2.imshow("src", src)
- cv2.imshow("result", result)
- #等待显示
- cv2.waitKey(0)
- cv2.destroyAllWindows()
其运行结果如下,它有效地将米粒与背景分离开来。
二.图像黑帽运算
图像底帽运算(bottom-hat transformation)又称为图像黑帽运算,它是用图像闭运算操作减去原始图像后的结果,从而获取图像内部的小孔或前景色中黑点,也常用于解决由于光照不均匀图像分割出错的问题。其公式定义如下:
图像底帽运算是用一个结构元通过闭运算从一幅图像中删除物体,常用于校正不均匀光照的影响。其效果图如下图所示。
在Python中,图像底帽运算主要调用morphologyEx()实现,其中参数cv2.MORPH_BLACKHAT表示底帽或黑帽处理,函数原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
- src表示原始图像
- cv2.MORPH_BLACKHAT表示图像底帽或黑帽运算
- kernel表示卷积核,可以用numpy.ones()函数构建
Python实现图像底帽运算的代码如下所示:
- #encoding:utf-8
- import cv2
- import numpy as np
- #读取图片
- src = cv2.imread('test06.png', cv2.IMREAD_UNCHANGED)
- #设置卷积核
- kernel = np.ones((10, 10), np.uint8)
- #图像黑帽运算
- result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
- #显示图像
- cv2.imshow("src", src)
- cv2.imshow("result", result)
- #等待显示
- cv2.waitKey(0)
- cv2.destroyAllWindows()
其运行结果如图所示:
三.基于灰度三维图的顶帽黑帽运算
为什么图像顶帽运算会消除光照不均匀的效果呢?通常可以利用灰度三维图来进行解释该算法。灰度三维图主要调用Axes3D包实现,对原图绘制灰度三维图的代码如下:
- # -*- coding: utf-8 -*-
- import numpy as np
- import cv2 as cv
- import matplotlib.pyplot as plt
- from mpl_toolkits.mplot3d import Axes3D
- from matplotlib import cm
- from matplotlib.ticker import LinearLocator, FormatStrFormatter
- #读取图像
- img = cv.imread("test06.png")
- img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
- imgd = np.array(img) #image类转numpy
- #准备数据
- sp = img.shape
- h = int(sp[0]) #图像高度(rows)
- w = int(sp[1]) #图像宽度(colums) of image
- #绘图初始处理
- fig = plt.figure(figsize=(16,12))
- ax = fig.gca(projection="3d")
- x = np.arange(0, w, 1)
- y = np.arange(0, h, 1)
- x, y = np.meshgrid(x,y)
- z = imgd
- surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm)
- #自定义z轴
- ax.set_zlim(-10, 255)
- ax.zaxis.set_major_locator(LinearLocator(10)) #设置z轴网格线的疏密
- #将z的value字符串转为float并保留2位小数
- ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
- # 设置坐标轴的label和标题
- ax.set_xlabel('x', size=15)
- ax.set_ylabel('y', size=15)
- ax.set_zlabel('z', size=15)
- ax.set_title("surface plot", weight='bold', size=20)
- #添加右侧的色卡条
- fig.colorbar(surf, shrink=0.6, aspect=8)
- plt.show()
运行结果如下图所示:
从图像中的像素走势显示了该图受各部分光照不均匀的影响,从而造成背景灰度不均现象,其中凹陷对应图像中灰度值比较小的区域。而通过图像白帽运算后的图像灰度三维图的代码如下:
- # -*- coding: utf-8 -*-
- import numpy as np
- import cv2 as cv
- import matplotlib.pyplot as plt
- from mpl_toolkits.mplot3d import Axes3D
- from matplotlib import cm
- from matplotlib.ticker import LinearLocator, FormatStrFormatter
- #读取图像
- img = cv.imread("test06.png")
- img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
- #图像黑帽运算
- kernel = np.ones((10,10), np.uint8)
- result = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
- #image类转numpy
- imgd = np.array(result)
- #准备数据
- sp = result.shape
- h = int(sp[0]) #图像高度(rows)
- w = int(sp[1]) #图像宽度(colums) of image
- #绘图初始处理
- fig = plt.figure(figsize=(8,6))
- ax = fig.gca(projection="3d")
- x = np.arange(0, w, 1)
- y = np.arange(0, h, 1)
- x, y = np.meshgrid(x,y)
- z = imgd
- surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm)
- #自定义z轴
- ax.set_zlim(-10, 255)
- ax.zaxis.set_major_locator(LinearLocator(10)) #设置z轴网格线的疏密
- #将z的value字符串转为float并保留2位小数
- ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
- # 设置坐标轴的label和标题
- ax.set_xlabel('x', size=15)
- ax.set_ylabel('y', size=15)
- ax.set_zlabel('z', size=15)
- ax.set_title("surface plot", weight='bold', size=20)
- #添加右侧的色卡条
- fig.colorbar(surf, shrink=0.6, aspect=8)
- plt.show()
效果图如下所示,对应的灰度更集中于10至100区间,由此证明了不均匀的背景被大致消除了,有利于后续的阈值分割或图像分割。
跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算的更多相关文章
- Python 图像处理 OpenCV (10):图像处理形态学之顶帽运算与黑帽运算
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python图像处理丨基于OpenCV和像素处理的图像灰度化处理
摘要:本篇文章讲解图像灰度化处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理. 本文分享自华为云社区<[Python图像处理 ...
- 跟我学Python图像处理丨何为图像的灰度非线性变换
摘要:本文主要讲解灰度线性变换,基础性知识希望对您有所帮助. 本文分享自华为云社区<[Python图像处理] 十六.图像的灰度非线性变换之对数变换.伽马变换>,作者:eastmount . ...
- 跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波
摘要:本文讲解基于傅里叶变换的高通滤波和低通滤波. 本文分享自华为云社区<[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波>,作者:eastmount . 一.高通滤波 傅 ...
- 跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样
摘要:本文讲述图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数. 本文分享自华为云社区<[Python图像处理] 二十一.图像金字塔之图像向下取样和向上 ...
- 跟我学Python图像处理丨带你掌握傅里叶变换原理及实现
摘要:傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪.图像增强等处理. 本文分享自华为云社区<[Python图像处理] 二十二.Python图像傅里叶变换原理及实现> ...
- 跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效
摘要:本文讲解常见的图像特效处理,从而让读者实现各种各样的图像特殊效果,并通过Python和OpenCV实现. 本文分享自华为云社区<[Python图像处理] 二十四.图像特效处理之毛玻璃.浮雕 ...
- 跟我学Python图像处理丨获取图像属性、兴趣ROI区域及通道处理
摘要:本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道. 本文分享自华为云社区<[Python图像处理] 三.获取图像属性.兴趣ROI区域及通道处理 ...
- Python图像处理丨认识图像锐化和边缘提取的4个算子
摘要:图像锐化和边缘提取技术可以消除图像中的噪声,提取图像信息中用来表征图像的一些变量,为图像识别提供基础. 本文分享自华为云社区<[Python图像处理] 十七.图像锐化与边缘检测之Rober ...
随机推荐
- 存储器、I/O组织、微处理器
重点知识 存储器的内部结构及访问方法 存储器分段以及存储器中的逻辑地址和物理地址 I/O端口组织及编址方式 时序和总线操作以及系统的工作方式和特点. 存储器组织 8086有20根地址线,可寻址的存储器 ...
- Endeavour OS 安装流程中的一些小问题的对应的解决方案
安装窗口显示"系统未连接到互联网",但实际上已经连接了 Endeavour OS 检测系统是否连接上互联网的方式就是 ping 一个目标站点,这个站点默认写入在 /etc/cala ...
- GO GMP协程调度实现原理 5w字长文史上最全
1 Runtime简介 Go语言是互联网时代的C,因为其语法简洁易学,对高并发拥有语言级别的亲和性.而且不同于虚拟机的方案.Go通过在编译时嵌入平台相关的系统指令可直接编译为对应平台的机器码,同时嵌入 ...
- linux运维基础1
内容概要 运维简介 运维岗位职责 服务器 服务器硬件介绍 磁盘阵列 虚拟化软件及环境 虚拟化软件 安装操作系统 Vmware虚拟机安装及相关配置流程 内容详情 运维简介 运维岗位职责 核心:运行维护应 ...
- 区分 python 爬虫或者是写自动化脚本时遇到的 content与text的作用
通常在使用过程中或许我们能够轻而易举的会使用requsts模块中的content 与 text ,从print结果来看根本看不出任何区别: 总结精髓,text 返回的是unicode 型的数据,一般是 ...
- java中的方法重载(overload)
什么时候方法重载:当两个方法的功能是相似的,可以考虑使用方法重载.若两个方法根本没有关系,无必要使用方法重载. 什么时候代码会发生方法重载:三个条件:1,在同一个类中.2,方法名相同.3,参数列表相同 ...
- Vue3.0系列——「vue3.0性能是如何变快的?」
前言 先学习vue2.x,很多2.x内容依然保留: 先学习TypeScript,vue3.0是用TS重写的,想知其然知其所以然必须学习TS. 为什么学习vue3.0? 性能比vue2.x快1.2-2倍 ...
- rhel修改系统语言
修改系统语言的三种方式 1.yum install system-config-language //挂载本地源,然后安装 system-config-language 2. ...
- Deep Learning-深度学习(一)
深度学习入门 1.人工智能.机器学习.深度学习 1.1 人工智能(AI) 一个比较宽泛的概念.即用来模拟人的智能的理论,并对这个模拟出来的智能进行延伸和开拓.通俗来讲就是要达到用机器模拟人类的聪慧来处 ...
- sudoer文件配置错误修复
以错误配置权限为例,如果是sudoer文件内容配置错误,替换步骤(4)中相关命令即可 (1)建立两个ssh连接,分别记为A.B (2)A:echo $$获取ID (3)B:pkttyagent --p ...