图像处理开闭操作(17)

图像处理开闭操作(17)一定义1开操作:是图像的轮廓变得光滑,断开的较窄的狭颈和消除细的突出物.使结构元B对集合A进行开操作,定义为:A○B=(A⊖B)⊕B含义:先用B对A进行腐蚀,然后用B对结果进行膨胀。2闭操作:同样使图像轮廓变得光滑,但与开操作相反,他能弥合狭窄的间断和细小的沟壑,消除小的空洞,并填

大家好,欢迎来到IT知识分享网。

一 定义

1 开操作: 是图像的轮廓变得光滑,断开的较窄的狭颈和消除细的突出物.

  使结构元B对集合A进行开操作,定义为:

  AB=(AB)B
含义:先用B对A进行腐蚀,然后用B对结果进行膨胀。 
 
2 闭操作:同样使图像轮廓变得光滑,但与开操作相反,他能弥合狭窄的间断和细小的沟壑,消除小的空洞,并填补轮廓线中的裂痕.
使用结构元B对集合A进行闭操作,定义为
 
  AB=(AB)B
 
结构元
图像处理开闭操作(17)
 
图像处理开闭操作(17)

 

集合A

原始图片

 

2 几何解释

1)开操作的何解释 
  A○B的边界由B中的点建立 
  当B在A的边界内侧滚动时,B所能到达的A的边界的最远点。 

图像处理开闭操作(17)

 

(2)闭操作的几何解释 

  A•B的边界由B中的点建立 
  B在A的边界外侧滚动 
  满足〖(B)〗_z⋂A≠”Ø” 的所有点的集合 

图像处理开闭操作(17)

 

 3 相关函数

morphologyEx

函数原型

morphologyEx(   src, 
                op, 
                kernel, 
                dst=None, 
                anchor=None, 
                iterations=None,
                borderType=None, 
                borderValue=None
                )

 

参数介绍

.   @param src Source image. The number of channels can be arbitrary. The depth should be one of
. CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.
          来源图片。通道数可以是任意的。深度应该是其中之一 。 CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
. @param op Type of a morphological operation, see #MorphTypes
        形态操作的类型 cv.MORPH_OPEN, cv.MORPH_CLOSE
.   @param kernel Structuring element. It can be created using #getStructuringElement.
        内核(element)
.   @param anchor Anchor position with the kernel. Negative values mean that the anchor is at the
. kernel center.
        用内核锚定位置。负值意味着锚点位于 。核心中心。
. @param iterations Number of times erosion and dilation are applied.
        侵蚀和扩张的次数。
. @param borderType Pixel extrapolation method, see #BorderTypes
        像素外推方法,
. @param borderValue Border value in case of a constant border. The default value has a special
. meaning.
        边界不变的边界值。默认值有一个特殊值 。含义。

getStructuringElement

  形态学处理的核心就是定义结构元素,在OpenCV-Python中,可以使用其自带的getStructuringElement函数,也可以直接使用NumPy的ndarray来定义一个结构元素。首先来看用getStructuringElement函数定义一个结构元素:

element = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))

 

这就定义了一个5×5的十字形结构元素,如下:

图像处理开闭操作(17)

 

也可以用NumPy来定义结构元素,如下:

NpKernel = np.uint8(np.zeros((5,5)))
for i in range(5):
NpKernel[2, i] = 1 #感谢chenpingjun1990的提醒,现在是正确的
NpKernel[i, 2] = 1

 

这两者方式定义的结构元素完全一样:

[[0 0 1 0 0]
[0 0 1 0 0]
[1 1 1 1 1]
[0 0 1 0 0]
[0 0 1 0 0]]

 

 用OpenCV-Python内置的常量定义椭圆(MORPH_ELLIPSE)和十字形结构(MORPH_CROSS)元素要简单一些,如果定义矩形(MORPH_RECT)和自定义结构元素,则两者差不多。

原文:https://blog.csdn.net/sunny2038/article/details/9137759

4 实验结果展示

先开操作再闭操作,组成形态学滤波器。
a 图是受噪声污染的指纹的二值图像,噪声为黑色背景上的亮元素和亮指纹部分的暗元素
b图是使用的结构元
c图是使用结构元素对图a腐蚀的结果:背景噪声消除了,指纹中的噪声尺寸增加
d图是使用结构元素对图c膨胀的结果:包含于指纹中的噪声分量的尺寸被减小或被完全消除,带来的问题是:在指纹纹路间产生了新的间断
e图是对图d膨胀的结果,图d的大部分间断被恢复,但指纹的线路变粗了
f图是对图e腐蚀的结果,即对图d中开操作的闭操作。最后结果消除了噪声斑点
缺点:指纹线路还是有断点,可以通过加入限制性条件解决。

图像处理开闭操作(17)

图像处理开闭操作(17)

 

5 图片腐蚀

代码

# coding=utf-8
import cv2
import numpy as np

img = cv2.imread('fengjing.jpg', 0)
# OpenCV定义的结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

# 腐蚀图像
eroded = cv2.erode(img, kernel)
# 显示腐蚀后的图像
cv2.imshow("Eroded Image", eroded)

# 膨胀图像
dilated = cv2.dilate(img, kernel)
# 显示膨胀后的图像
cv2.imshow("Dilated Image", dilated)
# 原图像
cv2.imshow("Origin", img)

# NumPy定义的结构元素
NpKernel = np.uint8(np.ones((3, 3)))
Nperoded = cv2.erode(img, NpKernel)
# 显示腐蚀后的图像
cv2.imshow("Eroded by NumPy kernel", Nperoded)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

效果展示

图像处理开闭操作(17)

 

六 图像的开闭操作

代码

import cv2 as cv

def open_image(image):
    '图像开操作'
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    # res=cv.bitwise_not(gray)
    #图像二值化
    ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow('binary',binary)
    #获取形态学结构kernel,采用的形态学方式MORPH_RECT
    kernel=cv.getStructuringElement(cv.MORPH_RECT,(5,5))
    #图像的开操作
    binary=cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
    cv.imshow('open',binary)

def close_image(image):
    '图像闭操作'
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    # res=cv.bitwise_not(gray)
    ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)
    kernel=cv.getStructuringElement(cv.MORPH_RECT,(5,5))
    #操作函数morphologyEx
    binary=cv.morphologyEx(binary,cv.MORPH_CLOSE,kernel)
    cv.imshow('close',binary)

src = cv.imread("fengjing.jpg")
cv.imshow("原来", src)
open_image(src)
close_image(src)
cv.waitKey(0)
cv.destroyAllWindows()

 

效果展示

图像处理开闭操作(17)

 

  闭运算用来连接被误分为许多小块的对象,而开运算用于移除图像噪音形成的斑点.因此,某些情况下可以连续运用这两种运算。如对一副二值图连续使用闭运算和开运算,将获得图像中的主要对象。同样,如果想消除图像中的噪声(即图像中的“小点”),也可以对图像先用开运算后用闭运算,不过这样也会消除一些破碎的对象。

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/31881.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信