OpenCV中的二值化处理与形态学操作

梦想实践者 2019-04-15 ⋅ 25 阅读

1. 介绍

在图像处理中,二值化处理与形态学操作是非常重要的技术。二值化处理可以将图像转换为黑白两色,简化图像信息,便于后续的图像分析和处理。而形态学操作则可以通过腐蚀、膨胀、开运算和闭运算等操作,从图像中提取出所需的特征。

本文将介绍OpenCV中的二值化处理与形态学操作的原理和应用,并给出相应的代码示例。

2. 二值化处理

二值化处理是将图像转换为黑白两色的过程。在OpenCV中,常用的二值化方法有全局阈值法、自适应阈值法和Otsu's阈值法。

2.1 全局阈值法

全局阈值法将图像的每个像素点与一个全局设定的阈值进行比较,将大于阈值的像素点设为白色,小于阈值的像素点设为黑色。

以下是使用全局阈值法进行二值化处理的代码示例:

import cv2

img = cv2.imread('image.jpg', 0)  # 以灰度图像读取输入图像
_, binary_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # 使用全局阈值法进行二值化处理

cv2.imshow('Binary Image', binary_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.2 自适应阈值法

自适应阈值法将图像分割为多个小区域,对每个小区域设定一个局部阈值进行比较,从而适应不同区域的亮度变化。

以下是使用自适应阈值法进行二值化处理的代码示例:

import cv2

img = cv2.imread('image.jpg', 0)  # 以灰度图像读取输入图像
binary_img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)

cv2.imshow('Binary Image', binary_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.3 Otsu's阈值法

Otsu's阈值法通过寻找图像直方图的双峰位置,自动确定最佳的阈值进行二值化处理。

以下是使用Otsu's阈值法进行二值化处理的代码示例:

import cv2

img = cv2.imread('image.jpg', 0)  # 以灰度图像读取输入图像
_, binary_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

cv2.imshow('Binary Image', binary_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 形态学操作

形态学操作是一种基于图像形状的图像处理技术,包括腐蚀、膨胀、开运算和闭运算等操作。

3.1 腐蚀

腐蚀操作可以消除图像中的孤立点和小的细节,从而使图像变得更加紧凑。

以下是使用腐蚀操作进行图像处理的代码示例:

import cv2
import numpy as np

img = cv2.imread('image.jpg', 0)  # 以灰度图像读取输入图像
kernel = np.ones((3, 3), np.uint8)  # 定义腐蚀操作的核大小
erosion_img = cv2.erode(img, kernel, iterations=1)

cv2.imshow('Erosion Image', erosion_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.2 膨胀

膨胀操作可以扩大图像中的物体区域,从而填充物体的空洞和连接物体。

以下是使用膨胀操作进行图像处理的代码示例:

import cv2
import numpy as np

img = cv2.imread('image.jpg', 0)  # 以灰度图像读取输入图像
kernel = np.ones((3, 3), np.uint8)  # 定义膨胀操作的核大小
dilation_img = cv2.dilate(img, kernel, iterations=1)

cv2.imshow('Dilation Image', dilation_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.3 开运算和闭运算

开运算和闭运算是腐蚀和膨胀操作的叠加,用于去除图像中的噪声和填充物体的空洞。

以下是使用开运算和闭运算进行图像处理的代码示例:

import cv2
import numpy as np

img = cv2.imread('image.jpg', 0)  # 以灰度图像读取输入图像
kernel = np.ones((3, 3), np.uint8)  # 定义开闭运算的核大小
opening_img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closing_img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow('Opening Image', opening_img)
cv2.imshow('Closing Image', closing_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

4. 结语

本文介绍了OpenCV中的二值化处理与形态学操作的原理和应用,并给出了相关的代码示例。通过学习和理解这些图像处理技术,我们可以在实际的图像处理任务中灵活运用,实现更多有趣和有用的效果。希望本文能对你的学习和工作有所帮助!


全部评论: 0

    我有话说: