形态学操作

  • 1 连通性
  • 1.1 邻接关系
  • 1.2 连通性
  • 2 形态学操作
  • 2.1 腐蚀和膨胀
  • 2.2 开、闭运算
  • 2.3 礼帽和黑帽


  目标:

  理解图像的邻域,连通性

  了解不同的形态学操作:腐蚀、膨胀、开闭运算,礼帽和黑帽等,以及不同操作之间的关系。

opencv连通域算法 opencv 连通域_opencv连通域算法

1 连通性

1.1 邻接关系

  在图像中,最小的单位是像素,每个像素周围有8个临接相思树,常见的邻接关系有3种:4邻域、8邻域、D邻域。

opencv连通域算法 opencv 连通域_opencv_02

1.2 连通性

  定义: 是描述区域和边界的重要概念,两个像素连通的两个必要条件是:1)两个像素位置是否相邻;2)两个像素的灰度值是否满足特定的相似性准则。

  连通分类:

  有4联通、8联通和m连通三种

  (1)4连通:对于具有值V的像素p和q,如果q在集合N4(p)中,则称这两个像素是四连通的。

  (2)8连通:对于具有值V的像素p和q,如果q在集合N8(p)中,则称这两个像素是8连通的。

opencv连通域算法 opencv 连通域_高亮_03


  (3)m连通:对于具有值V的像素p和q,如果1)q在集合N4§中,或q在集合ND(p)中;2)且N4(p)与N4(q)的交集为空,则称两个像素是m连通的,既4连通和D连通的混合连通。

opencv连通域算法 opencv 连通域_opencv_04

2 形态学操作

定义: 形态学转换是基于图像形状的一些简单操作,它通常在二进制图像(二值图像,值为0或者1)上执行。
  腐蚀和膨胀是两个基本的形态学运算符。然后它的变体形式,如开运算,闭运算,礼帽黑帽等

2.1 腐蚀和膨胀

  腐蚀和膨胀是最基本的形态学操作,腐蚀和膨胀都是针对白色部分(高亮部分)而言的。

  (1)膨胀:

  是使图像中高亮部分扩张,效果图拥有比原图更大的高亮区域;是求局部最大值的操作.

  具体操作: 用一个结构元素扫描图像中的每个像素,用结构元素中的每个像素与其覆盖的像素做‘与’操作,如果都为0,则该像素为0,否则为1。

opencv连通域算法 opencv 连通域_python_05


  作用: 将与物体接触的所有背景点合并到物体中,使目标增大,可填补目标中的孔洞

  API: cv2.dilate(img,kernel,iterations)

  参数:

    img:要处理的图像

    kernel:核结构

    iterations:膨胀的次数,默认是1  (2)腐蚀:

  是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域;是求局部最小值的操作。

  具体操作: 用一个结构元素扫描图像中的每个像素,用结构元素中的每个像素与其覆盖的像素做‘与’操作,如果都为1,则该像素为1,否则为0。

opencv连通域算法 opencv 连通域_opencv连通域算法_06


  作用: 消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点。

  API: cv2.erode(img,kernel,iterations)

  参数:

    img:要处理的图像

    kernel:核结构

    iterations:腐蚀的次数,默认是1

import cv2
import matplotlib.pyplot as plt
import numpy as np
#1. 读取图像
img=cv2.imread('erode.png')

#2. 腐蚀和膨胀

# 2.1 创建核结构
kenel=np.ones((5,5),np.uint8)

# 2.2 腐蚀和膨胀
erode_img=cv2.erode(img,kenel,1)
dilate_img=cv2.dilate(img,kenel,1)

#3.显示图像
cv2.imshow('origin',img)
cv2.imshow('erode',erode_img)
cv2.imshow('dilate',dilate_img)
cv2.waitKey(0)

2.2 开、闭运算

  (1)开运算:

  定义: 先腐蚀后膨胀,其作用是:分离物体,消除小区域。

  特点: 消除噪点,去除小干扰,而不影响原来的图像

opencv连通域算法 opencv 连通域_opencv_07


  (2)闭运算

  定义: 先膨胀后腐蚀,其作用是:消除闭合物体里面的孔洞

  特点: 可以填充闭合区域

opencv连通域算法 opencv 连通域_opencv连通域算法_08


  (3)API:

  cv2.morphologyEx(img,op,kernel)

  参数:

    img:要处理的图像

    op:处理方式,若进行开运算,则设为cv2.MORPH_OPEN;若进行闭运算,则设为cv2.MORPH_CLOSE

    kernel:核结构

import cv2
import matplotlib.pyplot as plt
import numpy as np
#1. 读取图像
img=cv2.imread('open_close.png')

#2. 开运算和闭运算

# 2.1 创建核结构
kenel=np.ones((10,10),np.uint8)

# 2.2 开运算和闭运算
open_img=cv2.morphologyEx(img,cv2.MORPH_OPEN,kenel)#开运算
close_img=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kenel)#闭运算

#3.显示图像
cv2.imshow('origin',img)
cv2.imshow('open',open_img)
cv2.imshow('close',close_img)
cv2.waitKey(0)

2.3 礼帽和黑帽

  (1)礼帽运算:

  原图像与开运算之差

  (2)黑帽运算:

  闭运算与原图像之差

  API:

  cv2.morphlogyEx(img,op,kernel)

  参数:

    img:要处理的图像

    op:处理方式

opencv连通域算法 opencv 连通域_高亮_09