跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算
摘要:本篇文章结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现。
本文分享自华为云社区《[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽运算》,作者: eastmount。
本篇文章继续深入,结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现。
一.图像顶帽运算
图像顶帽运算(top-hat transformation)又称为图像礼帽运算,它是用原始图像减去图像开运算后的结果,常用于解决由于光照不均匀图像分割出错的问题。其公式定义如下:
![](https://pic4.zhimg.com/80/v2-057ac232f422265752aafd1732cced37_720w.jpg)
图像顶帽运算是用一个结构元通过开运算从一幅图像中删除物体,校正不均匀光照的影响,其效果图如下图所示。
![](https://pic3.zhimg.com/80/v2-5e05d7d8fe51de5207b1aa858840bc6a_720w.jpg)
在Python中,图像顶帽运算主要调用morphologyEx()实现,其中参数cv2.MORPH_TOPHAT表示顶帽处理,函数原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
- src表示原始图像
- cv2.MORPH_TOPHAT表示图像顶帽运算
- kernel表示卷积核,可以用numpy.ones()函数构建
假设存在一张光照不均匀的米粒图像,如图所示,我们需要调用图像顶帽运算解决光照不均匀的问题。其Python代码如下所示:
![](https://pic2.zhimg.com/80/v2-6189d7e419094fe79482ce0a1269fab9_720w.jpg)
#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()
其运行结果如下,它有效地将米粒与背景分离开来。
![](https://pic2.zhimg.com/80/v2-6f44ccf0cab4db20bdc8114aa64b9e05_720w.jpg)
二.图像黑帽运算
图像底帽运算(bottom-hat transformation)又称为图像黑帽运算,它是用图像闭运算操作减去原始图像后的结果,从而获取图像内部的小孔或前景色中黑点,也常用于解决由于光照不均匀图像分割出错的问题。其公式定义如下:
![](https://pic4.zhimg.com/80/v2-a50e4fceececb350420872ee81c951d3_720w.jpg)
图像底帽运算是用一个结构元通过闭运算从一幅图像中删除物体,常用于校正不均匀光照的影响。其效果图如下图所示。
![](https://pic3.zhimg.com/80/v2-9b16393a1df4c0abd0ec5ee8eb5fc7b6_720w.jpg)
在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()
其运行结果如图所示:
![](https://pic2.zhimg.com/80/v2-44baff1ae733bd5801136e175a48c195_720w.jpg)
三.基于灰度三维图的顶帽黑帽运算
![](https://pic2.zhimg.com/80/v2-b9cb0daaa63bfa6142f9495e85c80d45_720w.jpg)
为什么图像顶帽运算会消除光照不均匀的效果呢?通常可以利用灰度三维图来进行解释该算法。灰度三维图主要调用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()
运行结果如下图所示:
![](https://pic4.zhimg.com/80/v2-a428f9e4a3d70e298a61a6c75324287b_720w.jpg)
从图像中的像素走势显示了该图受各部分光照不均匀的影响,从而造成背景灰度不均现象,其中凹陷对应图像中灰度值比较小的区域。而通过图像白帽运算后的图像灰度三维图的代码如下:
# -*- 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区间,由此证明了不均匀的背景被大致消除了,有利于后续的阈值分割或图像分割。
![](https://pic4.zhimg.com/80/v2-811daf79d9d2789c175146c0cb5554ef_720w.jpg)
相关文章
- centos7.3下安装Python3.5及安装pip3
- Python库之urllib
- Python使用Redis数据库
- Python正则表达式模块re
- Python日志模块logging
- CentOS7.3中将Python2.7.5 升级到Python3.5.1
- Win10下Python虚拟环境virtualenv安装和使用
- Python中几个常用的类方法
- python爬虫之lxml库xpath的基本使用
- Python操作Excel表格
- 彻底搞懂Python pip
- Python3.11正式版,它来了!
- Python猜数字小游戏
- 你真的会整理文件吗(FindDupFile去重+Python批量重命名)
- 优雅整理Python中的import
- python的环境,你再也不用愁
- Python下Tesseract Ocr引擎及安装介绍
- Python 操作Excel-openpyxl模块使用
- Python-数据的多种存储形式
- python3 http.server模块 搭建简易 http 服务器