《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算

本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。同时,希望观看本专栏的小伙伴可以理解到OpenCv进行图像处理的强大哦,如有转载,请注明出处(原文链接和作者署名),感谢各位小伙伴啦!

前文参考:
《OpenCv视觉之眼》Python图像处理一 :Opencv-python的简介及Python环境搭建
《OpenCv视觉之眼》Python图像处理二 :Opencv图像读取、显示、保存基本函数原型及使用
《OpenCv视觉之眼》Python图像处理三 :Opencv图像属性、ROI区域获取及通道处理
《OpenCv视觉之眼》Python图像处理四 :Opencv图像灰度处理的四种方法及原理
《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波
《OpenCv视觉之眼》Python图像处理六 :Opencv图像傅里叶变换和傅里叶逆变换原理及实现
《OpenCv视觉之眼》Python图像处理七 :Opencv图像处理之高通滤波和低通滤波原理及构造
《OpenCv视觉之眼》Python图像处理八 :Opencv图像处理之图像阈值化处理原理及函数
《OpenCv视觉之眼》Python图像处理九 :Opencv图像形态学处理之图像腐蚀与膨胀原理及方法
《OpenCv视觉之眼》Python图像处理十 :Opencv图像形态学处理之开运算、闭运算和梯度运算原理及方法

上次博客讲解了图像形态学处理开运算、闭运算和梯度运算、这是图像形态学处理的必要步骤,同时也是需要重点理解的步骤。

本次博客,我们将讲解图像形态学处理的顶帽和黑帽运算,通过原理理解函数功能,一起学习吧!

[Python图像处理十一 ]:Opencv图像形态学处理之顶帽运算与黑帽运算

  • 一、顶帽运算
    • 1、顶帽运算原理
    • 2、顶帽运算功能函数构造
    • 3、OpenCV顶帽运算库的使用
  • 二、黑帽运算
    • 1、黑帽运算原理
    • 2、黑帽运算功能函数构造
    • 3、OpenCV黑帽运算库的使用

一、顶帽运算

  • 图像顶帽运算通常用来解决由于光照不均匀图像分割出错的问题
  • 提取图像中的线噪声(例如直线噪声和曲线噪声,对点噪声提取效果不大或者说是无作用)

1、顶帽运算原理

1)、原理
图像顶帽(或图像礼帽)运算是原始图像减去图像开运算的结果,得到图像的噪声
2)、原理公式如下
顶帽运算(img) = 原始图像(img) - 开运算(img)

2、顶帽运算功能函数构造

1)、定义顶帽运算功能函数

def morph_tophat(img,size):
    #构造卷积核
    #设置卷积核
    kernel = np.ones((size,size), np.uint8)
    #调用opencv开运算库函数
    img1=cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    img2=img-img1#通过原理公式求取图像顶帽运算结果
    return img2

2)、读取图像,调用图像顶帽运函数,进行图像顶帽运算处理

import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf)  #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("d.jpg")
img1=morph_tophat(img,3)#调用图像顶帽运算函数
#显示图像
titles = ['原图', '顶帽运算']  #标题
images = [img, img1]   #图像对比显示
for i in range(2):
    plt.subplot(1,2,i+1), plt.imshow(images[i],"gray")  
    plt.title(titles[i])    
    plt.axis('off')#关闭坐标轴  设置为on则表示开启坐标轴
plt.show()#显示图像

《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算_第1张图片
上面函数构造原理是通过开运算库函数结合使用的,对于开运算原理,小伙伴们可以查看上一篇博客,有编写,这次直接通过开运算库函数进行顶帽运算原理设置哦!

可以看出,上面对图像的线噪声提取效果比较明显,但如果我们换成图像点噪声,则不会有太大效果,如果不调整卷积核尺寸,则没有效果

顶帽运算对椒盐噪声的提取效果如下所示:
《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算_第2张图片
那么我们怎么处理椒盐噪声的提取呢?只有通过调整卷积核的尺寸进行提取,当我们将卷积核尺寸设置为7x7时,得到如下结果:
《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算_第3张图片

顶帽运算对直线噪声提取效果如下所示:
《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算_第4张图片

3、OpenCV顶帽运算库的使用

在OpenCV中,也提供了直接进行顶帽运算的库函数,主要调用morphologyEx()实现,其中参数cv2.MORPH_TOPHAT表示顶帽处理如下介绍
1)、函数原型:result = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

  • img:需要进行图像顶帽运算的图像
  • cv2.MORPH_TOPHAT:图像顶帽运算参数(固定参数,如进行顶帽运算请一定输入该参数)
  • kernel:自定义全1的卷积核,例如:kernel = np.ones((5,5), np.uint8)

2)、顶帽运算库函数使用方法

'''
图像顶帽运算-OpenCV库函数使用方法
'''
import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf)  #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("d.jpg")
#设置卷积核
kernel = np.ones((3,3), np.uint8)
#调用图像顶帽运算库函数
img1=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
#显示图像
titles = ['原图', '顶帽运算']  #标题
images = [img, img1]   #图像对比显示
for i in range(2):
    plt.subplot(1,2,i+1), plt.imshow(images[i],"gray")  
    plt.title(titles[i])    
    plt.axis('off')#关闭坐标轴  设置为on则表示开启坐标轴
plt.show()#显示图像

《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算_第5张图片
在图像顶帽运算的开始我们说到,图像顶帽运算通常用来解决由于光照不均匀图像分割出错的问题,这个怎么理解,如下图所示:
《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算_第6张图片
可以看到,上面的是一张光照不均匀的米粒图像,我们需要调用图像顶帽运算解决光照不均匀的问题,我们将卷积核调整为10x10的尺寸,得到的顶帽运算结果如下所示:
《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算_第7张图片

二、黑帽运算

  • 图像黑帽运算通常用来获取图像内部的小孔或前景色中黑点
  • 也常用于解决由于光照不均匀图像分割出错的问题

1、黑帽运算原理

1)、原理
图像黑帽运算是图像闭运算操作减去原始图像的结果,得到图像内部的小孔,或者前景色中的小黑点
2)、原理公式如下所示:
黑帽运算(img) = 闭运算图像(img) - 原始图像(img)

2、黑帽运算功能函数构造

1)、黑帽运算功能函数构造

'''
图像黑帽运算
'''
def morph_blackhat(img,size):
    #设置卷积核
    kernel = np.ones((size,size), np.uint8)
    #调用opencv开运算库函数
    img1=cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    img2=img1-img#通过原理公式求取图像黑帽运算结果
    return img2

2)、读取图像,调用黑帽运算函数进行图像的黑帽运算

import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf)  #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("c.jpg")
img1=morph_blackhat(img,7)#调用图像黑帽运算函数,设置卷积核为7x7尺寸
#显示图像
titles = ['原图', '黑帽运算']  #标题
images = [img, img1]   #图像对比显示
for i in range(2):
    plt.subplot(1,2,i+1), plt.imshow(images[i],"gray")  
    plt.title(titles[i])    
    plt.axis('off')#关闭坐标轴  设置为on则表示开启坐标轴
plt.show()#显示图像

《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算_第8张图片
图像黑帽运算通常用来提取图像的内部噪声点,不同的图像通过调节卷积核大小的尺寸来进行图像内部噪声点的提取。

以上函数构造借助闭运算的opencv库函数进行构造的,如需了解闭运算构造原理,请参照前面其他几章博客教程!

3、OpenCV黑帽运算库的使用

OpenCV中同样有针对黑帽运算的库函数,介绍如下
1)、函数原型:result = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

  • img:需要进行图像顶帽运算的图像
  • cv2.MORPH_BLACKHAT:图像黑帽运算参数(固定参数,如进行黑帽运算请一定输入该参数)
  • kernel:自定义全1的卷积核,例如:kernel = np.ones((5,5), np.uint8)

2)、黑帽运算库函数使用方法

'''
图像黑帽运算-OpenCV库函数使用方法
'''
import cv2
import numpy as np
#np.set_printoptions(threshold=np.inf)  #打印数组中的全部内容
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
#读取图像
img=cv2.imread("c.jpg")
#设置卷积核
kernel = np.ones((7,7), np.uint8)
#调用图像顶帽运算库函数
img1=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
#显示图像
titles = ['原图', '黑帽运算']  #标题
images = [img, img1]   #图像对比显示
for i in range(2):
    plt.subplot(1,2,i+1), plt.imshow(images[i],"gray")  
    plt.title(titles[i])    
    plt.axis('off')#关闭坐标轴  设置为on则表示开启坐标轴
plt.show()#显示图像

《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算_第9张图片
同样的,在黑帽运算开始的时候提到黑帽运算也常用于解决由于光照不均匀图像分割出错的问题,将卷积核尺寸设置为10x10,如下所示:
《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算_第10张图片

图像顶帽运算和黑帽运算在图像处理中用得较少,但在特定场合也会使用,例如检测纺织布图中的瑕疵等等,都非常有作用,但如果只针对普通图片处理来说,用到的不多,了解原理就行啦!

以上就是本次博客的全部内容,遇到问题的小伙伴记得留言评论,学长看到会为大家进行解答的,这个学长不太冷!

人人都会碰到这些事情。在原地走一条陌路。在山顶听一场倾诉。在海底看一眼尸骨。在沙发想一夜前途。这是默片,只有上帝能给你配字幕。朋友不能陪你看完,但会在门口等你散场,然后傻笑着去新的地方 —— 一路陪你笑着逃亡

陈一月的又一天编程岁月^ _ ^

你可能感兴趣的:(Opencv视觉之眼,python,图像顶帽,黑帽运算,《OpenCV视觉之眼》,OpenCV图像处理,计算机视觉)