最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

OpenCV——开闭操作

互联网 admin 0浏览 0评论

OpenCV——开闭操作

目录

  • 前言
  • 正文
    • 开操作
    • 闭操作
    • 其他形态学操作
      • 顶帽
      • 闭帽
      • 梯度
        • 基本梯度
        • 内外梯度
  • 参考

前言

开操作和闭操作都是基于膨胀和腐蚀操作组合形成的。先腐蚀再膨胀就是开操作,先膨胀再腐蚀就是闭操作了。用开操作可以去除噪声,也可以提取水平或者垂直的直线。闭操作将错误分开成小片的物体从新连接成一个整体。而开操作则是去除一小块的噪点。
开操作:
开操作 = 腐蚀+膨胀 ,输入图像 + 结构元素
作用:主要是应用在二值图像分析中,灰度图像亦可;用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积.提取水平或竖直的线
闭操作:
开操作 = 膨胀+腐蚀 ,输入图像 + 结构元素
作用:主要是应用在二值图像分析中,灰度图像亦可;用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。

正文

这里演示一下使用开操作来去除对应的水平或垂直线

开操作

去除水平线效果图

code

def open_demo(image):gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)cv.imshow("binary image",binary)kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,15))morphoImage = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)cv.imshow("morphoImage",morphoImage)

去除垂直线效果图

code

def open_demo(image):gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)cv.imshow("binary image",binary)kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,1))morphoImage = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)cv.imshow("morphoImage",morphoImage)

其实就只要修改里面的那个kernel就可以了。

若是要去除斜线,则将那个kernel直接修改成(3,3)即可。

闭操作

我尝试了一下,也是可以实现对应的效果的。
效果图

code

def close_demo(image):gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)cv.imshow("binary image",binary)kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,15))morphoImage = cv.morphologyEx(binary,cv.MORPH_CLOSE,kernel)cv.imshow("morphoImage",morphoImage)

其他形态学操作

顶帽

又称礼帽,是原始图像与进行开运算之后得到的图像的差。
因为开运算到来的结果是放大了裂痕或者局部低亮度的区域,因此,从原图中减去运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。
顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
code

def top_hatDemo(image):print(image.shape)gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow("binary", gray)kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))  # 如果提取的是圆形,那么使用的是MORPH_ELLIPSEmorphoImage = cv.morphologyEx(gray, cv.MORPH_TOPHAT, kernel)cImage = np.array(gray.shape,np.uint8)cImage = 100;morphoImage = cv.add(cImage,morphoImage)cv.imshow("top_hatDemo morphoImage", morphoImage)

这里为了让现实的图片更加清楚一些,做了一个add的动作。
效果图

闭帽

又称为黑帽。是进行闭运算以后得到的图像与原图像的差。黑帽运算之后的效果图突出了与原图像轮廓周围的区域更暗的区域,且这一操作和选择的核大小相关。所以黑帽运算用来分离比邻近点暗一些的斑块。
code

def black_hatDemo(image):print(image.shape)gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow("binary", gray)kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))  # 如果提取的是圆形,那么使用的是MORPH_ELLIPSEmorphoImage = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel)cImage = np.array(gray.shape,np.uint8)cImage = 100;morphoImage = cv.add(cImage,morphoImage)cv.imshow("black_hatDemo morphoImage", morphoImage)

效果图

还可以用在检在不良品。例如下图:

梯度

基本梯度

效果图

code

def hat_binaryDemo(image):print(image.shape)gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow("binary", gray)kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))  # 如果提取的是圆形,那么使用的是MORPH_ELLIPSEmorphoImage = cv.morphologyEx(gray, cv.MORPH_GRADIENT, kernel)cImage = np.array(gray.shape,np.uint8)cImage = 100;morphoImage = cv.add(cImage,morphoImage)cv.imshow("black_hatDemo morphoImage", morphoImage)

内外梯度

效果图

code

def gradient2_demo(image):kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))dm = cv.dilate(image,kernel)em = cv.erode(image,kernel)dst1 = cv.subtract(image,em)dst2 = cv.subtract(dm,image)cv.imshow("internel",dst1)cv.imshow("external",dst2)

参考

  1. OpenCV学习笔记-开闭操作
  2. OpenCV+python:开闭操作
  3. OpenCV 2 学习笔记(23): 开操作与闭操作
  4. OpenCV学习笔记-顶帽、黑帽、形态学梯度

OpenCV——开闭操作

目录

  • 前言
  • 正文
    • 开操作
    • 闭操作
    • 其他形态学操作
      • 顶帽
      • 闭帽
      • 梯度
        • 基本梯度
        • 内外梯度
  • 参考

前言

开操作和闭操作都是基于膨胀和腐蚀操作组合形成的。先腐蚀再膨胀就是开操作,先膨胀再腐蚀就是闭操作了。用开操作可以去除噪声,也可以提取水平或者垂直的直线。闭操作将错误分开成小片的物体从新连接成一个整体。而开操作则是去除一小块的噪点。
开操作:
开操作 = 腐蚀+膨胀 ,输入图像 + 结构元素
作用:主要是应用在二值图像分析中,灰度图像亦可;用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积.提取水平或竖直的线
闭操作:
开操作 = 膨胀+腐蚀 ,输入图像 + 结构元素
作用:主要是应用在二值图像分析中,灰度图像亦可;用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。

正文

这里演示一下使用开操作来去除对应的水平或垂直线

开操作

去除水平线效果图

code

def open_demo(image):gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)cv.imshow("binary image",binary)kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,15))morphoImage = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)cv.imshow("morphoImage",morphoImage)

去除垂直线效果图

code

def open_demo(image):gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)cv.imshow("binary image",binary)kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,1))morphoImage = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)cv.imshow("morphoImage",morphoImage)

其实就只要修改里面的那个kernel就可以了。

若是要去除斜线,则将那个kernel直接修改成(3,3)即可。

闭操作

我尝试了一下,也是可以实现对应的效果的。
效果图

code

def close_demo(image):gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)cv.imshow("binary image",binary)kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,15))morphoImage = cv.morphologyEx(binary,cv.MORPH_CLOSE,kernel)cv.imshow("morphoImage",morphoImage)

其他形态学操作

顶帽

又称礼帽,是原始图像与进行开运算之后得到的图像的差。
因为开运算到来的结果是放大了裂痕或者局部低亮度的区域,因此,从原图中减去运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。
顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
code

def top_hatDemo(image):print(image.shape)gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow("binary", gray)kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))  # 如果提取的是圆形,那么使用的是MORPH_ELLIPSEmorphoImage = cv.morphologyEx(gray, cv.MORPH_TOPHAT, kernel)cImage = np.array(gray.shape,np.uint8)cImage = 100;morphoImage = cv.add(cImage,morphoImage)cv.imshow("top_hatDemo morphoImage", morphoImage)

这里为了让现实的图片更加清楚一些,做了一个add的动作。
效果图

闭帽

又称为黑帽。是进行闭运算以后得到的图像与原图像的差。黑帽运算之后的效果图突出了与原图像轮廓周围的区域更暗的区域,且这一操作和选择的核大小相关。所以黑帽运算用来分离比邻近点暗一些的斑块。
code

def black_hatDemo(image):print(image.shape)gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow("binary", gray)kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))  # 如果提取的是圆形,那么使用的是MORPH_ELLIPSEmorphoImage = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel)cImage = np.array(gray.shape,np.uint8)cImage = 100;morphoImage = cv.add(cImage,morphoImage)cv.imshow("black_hatDemo morphoImage", morphoImage)

效果图

还可以用在检在不良品。例如下图:

梯度

基本梯度

效果图

code

def hat_binaryDemo(image):print(image.shape)gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow("binary", gray)kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))  # 如果提取的是圆形,那么使用的是MORPH_ELLIPSEmorphoImage = cv.morphologyEx(gray, cv.MORPH_GRADIENT, kernel)cImage = np.array(gray.shape,np.uint8)cImage = 100;morphoImage = cv.add(cImage,morphoImage)cv.imshow("black_hatDemo morphoImage", morphoImage)

内外梯度

效果图

code

def gradient2_demo(image):kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))dm = cv.dilate(image,kernel)em = cv.erode(image,kernel)dst1 = cv.subtract(image,em)dst2 = cv.subtract(dm,image)cv.imshow("internel",dst1)cv.imshow("external",dst2)

参考

  1. OpenCV学习笔记-开闭操作
  2. OpenCV+python:开闭操作
  3. OpenCV 2 学习笔记(23): 开操作与闭操作
  4. OpenCV学习笔记-顶帽、黑帽、形态学梯度
发布评论

评论列表 (0)

  1. 暂无评论