opencv_图像形态学处理

目录

  • 前言
  • 腐蚀
    • C++
    • Python
    • 结果
  • 膨胀
    • C++
    • Python
    • 结果
  • 开操作
    • C++
    • Python
    • 结果
  • 闭操作
    • C++
    • Python
    • 结果
  • 形态梯度
    • C++
    • Python
    • 结果
  • 顶帽
    • C++
    • Python
    • 结果
  • 黑帽
    • C++
    • Python
    • 结果
  • 整体代码
  • 结果

前言

形态学,即数学形态学(mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质〈最具区分能力-most discriminative)的形状特征,如边界和连通区域等。同时像细化、像素化和修剪毛刺等技术也常应用于图像的预处理和后处理中,成为图像增强技术的有力补充。(选自https://blog.csdn.net/guanzhen3657/article/details/81324310)
腐蚀与膨胀的功能:消除噪声;分割出独立的图像元素,在图像中连接相邻元素;寻找图像中明显的极大值或极小值区域;求出图像的梯度。
注:1、形态学操作是对白色部分而言的,不是黑色部分。
2、可以对彩色图像进行处理。
3、开操作、闭操作、形态梯度、 顶帽、 黑帽函数相同,只是op (形态操作的类型)不同。

腐蚀

卷积核沿着图像滑动,如果与卷积核所对应额原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为0。
处理图像后,图像白色区域会减少。

C++

关键代码

void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )

src - 输入图像; 通道数可以是任意的,但深度应该是CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 输出与src相同大小和类型的图像。
kernel - 用于侵蚀的结构元素; 如果 element = Mat(),则使用 3 x 3 矩形结构元素。可以使用getStructuringElement()创建内核。
anchor - 锚中元素的位置; 默认值 (-1, -1) 表示锚点位于元素中心。
迭代次数 - 应用侵蚀的次数。
borderType - 像素外推方法(有关详细信息,请参阅 borderInterpolate)。
borderValue - 边框常量的边框值

示例

erode(res, out, element, Point(-1, -1),
iterations = 6,
borderType = BORDER_CONSTANT); //此操作共进行了6次腐蚀 

Python

关键代码

cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst

示例

erosion = cv2.erode(res,kernel,iterations = 1)

结果

opencv_图像形态学处理_第1张图片

膨胀

与卷积核对应的原图像的像素值只要有一个是1,中心元素的像素值就是1.
增加图像中白色区域。

C++

关键代码

void dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )

src - 输入图像; 通道数可以是任意的,但深度应该是CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 输出与src相同大小和类型的图像。
kernel - 用于扩张的结构元素; 如果 elemenat = Mat(),则使用 3 x 3矩形结构元素。可以使用getStructuringElement()创建内核
anchor- 锚中元素的位置; 默认值(-1, -1)表示锚点位于元素中心。
迭代 - 应用膨胀的次数。
borderType - 像素外推方法(有关详细信息,请参阅 borderInterpolate)。
borderValue - 边框常量的边框值

示例

dilate(image, out, element, Point(-1, -1),
iterations = 6,
borderType = BORDER_CONSTANT); //iterations=6,6是表示膨胀的次数,表示操作进行了6次膨胀

Python

内联代码片

cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst

示例

dilation = cv2.dilate(res,kernel,iterations = 1)

结果

opencv_图像形态学处理_第2张图片

开操作

先腐蚀再膨胀。
用于消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。

C++

关键代码

void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )

src - 源图像。通道数可以是任意的。深度应为CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 与src具有相同大小和类型的目标映像 。
kernel - 结构元素。它可以使用getStructuringElement()创建。
anchor - 与内核的锚点位置。负值意味着锚位于核心中心。
op -形态操作的类型可以是以下之一:
MORPH_OPEN - 开场操作
MORPH_CLOSE - 结算操作
MORPH_GRADIENT - 形态梯度
MORPH_TOPHAT - “大礼帽”
MORPH_BLACKHAT - “黑帽子”
iterations - 应用侵蚀和膨胀的次数。
borderType - 像素外推法。有关详细信息,请参阅 borderInterpolate。
borderValue - 边框常量的边框值。默认值具有特殊含义。

示例

morphologyEx(img, out, MORPH_OPEN, element);

Python

关键代码

cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst

示例

opening = cv2.morphologyEx(res, cv2.MORPH_OPEN, kernel)

结果

opencv_图像形态学处理_第3张图片

闭操作

先膨胀后腐蚀。
用于排除小型黑洞。

C++

关键代码

void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )

src - 源图像。通道数可以是任意的。深度应为CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 与src具有相同大小和类型的目标映像 。
kernel - 结构元素。它可以使用getStructuringElement()创建。
anchor - 与内核的锚点位置。负值意味着锚位于核心中心。
op -形态操作的类型可以是以下之一:
MORPH_OPEN - 开场操作
MORPH_CLOSE - 结算操作
MORPH_GRADIENT - 形态梯度
MORPH_TOPHAT - “大礼帽”
MORPH_BLACKHAT - “黑帽子”
iterations - 应用侵蚀和膨胀的次数。
borderType - 像素外推法。有关详细信息,请参阅 borderInterpolate。
borderValue - 边框常量的边框值。默认值具有特殊含义。

示例

morphologyEx(img, out, MORPH_CLOSE, element);

Python

关键代码

cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst

示例

closing = cv2.morphologyEx(res, cv2.MORPH_CLOSE, kernel)

结果

opencv_图像形态学处理_第4张图片

形态梯度

膨胀图与腐蚀图只差。
用于将团块的边缘突出出来,我们可以用形态学梯度来保留物体的边缘轮廓。

C++

关键代码

void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )

src - 源图像。通道数可以是任意的。深度应为CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 与src具有相同大小和类型的目标映像 。
kernel - 结构元素。它可以使用getStructuringElement()创建。
anchor - 与内核的锚点位置。负值意味着锚位于核心中心。
op -形态操作的类型可以是以下之一:
MORPH_OPEN - 开场操作
MORPH_CLOSE - 结算操作
MORPH_GRADIENT - 形态梯度
MORPH_TOPHAT - “大礼帽”
MORPH_BLACKHAT - “黑帽子”
iterations - 应用侵蚀和膨胀的次数。
borderType - 像素外推法。有关详细信息,请参阅 borderInterpolate。
borderValue - 边框常量的边框值。默认值具有特殊含义。

示例

morphologyEx(img, out, MORPH_GRADIENT, element);

Python

关键代码

cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst

示例

closing = cv2.morphologyEx(res, cv2.MORPH_GRADIENT, kernel)

结果

opencv_图像形态学处理_第5张图片

顶帽

原图像与开运算得到的图像的差。

C++

关键代码

void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )

src - 源图像。通道数可以是任意的。深度应为CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 与src具有相同大小和类型的目标映像 。
kernel - 结构元素。它可以使用getStructuringElement()创建。
anchor - 与内核的锚点位置。负值意味着锚位于核心中心。
op -形态操作的类型可以是以下之一:
MORPH_OPEN - 开场操作
MORPH_CLOSE - 结算操作
MORPH_GRADIENT - 形态梯度
MORPH_TOPHAT - “大礼帽”
MORPH_BLACKHAT - “黑帽子”
iterations - 应用侵蚀和膨胀的次数。
borderType - 像素外推法。有关详细信息,请参阅 borderInterpolate。
borderValue - 边框常量的边框值。默认值具有特殊含义。

示例

morphologyEx(img, out, MORPH_TOPHAT, element);

Python

关键代码

cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst

示例

closing = cv2.morphologyEx(res, cv2.MORPH_TOPHAT, kernel)

结果

opencv_图像形态学处理_第6张图片

黑帽

进行闭运算与原始图像的差。

C++

关键代码

void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )

src - 源图像。通道数可以是任意的。深度应为CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 与src具有相同大小和类型的目标映像 。
kernel - 结构元素。它可以使用getStructuringElement()创建。
anchor - 与内核的锚点位置。负值意味着锚位于核心中心。
op -形态操作的类型可以是以下之一:
MORPH_OPEN - 开场操作
MORPH_CLOSE - 结算操作
MORPH_GRADIENT - 形态梯度
MORPH_TOPHAT - “大礼帽”
MORPH_BLACKHAT - “黑帽子”
iterations - 应用侵蚀和膨胀的次数。
borderType - 像素外推法。有关详细信息,请参阅 borderInterpolate。
borderValue - 边框常量的边框值。默认值具有特殊含义。

示例

morphologyEx(img, out, MORPH_BLACKHAT, element);

Python

关键代码

cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst

示例

closing = cv2.morphologyEx(res, cv2.MORPH_BLACKHAT, kernel)

结果

opencv_图像形态学处理_第7张图片

整体代码

python

import cv2
import numpy as np
img = cv2.imread('github1.jpg')
res = cv2.resize(img,(400, 400), interpolation = cv2.INTER_CUBIC)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(res,kernel,iterations = 1)
dilation = cv2.dilate(res,kernel,iterations = 1)
opening = cv2.morphologyEx(res, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(res, cv2.MORPH_CLOSE, kernel)
gradient = cv2.morphologyEx(res, cv2.MORPH_GRADIENT, kernel)
tophat = cv2.morphologyEx(res, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(res, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow("res", res)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)
cv2.imshow("opening", opening)
cv2.imshow("closing", closing)
cv2.imshow("gradient", gradient)
cv2.imshow("tophat", tophat)
cv2.imshow("blackhat", blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果

opencv_图像形态学处理_第8张图片

你可能感兴趣的:(OpenCV)