opencv 阈值分割的具体使用

1. opencv 阈值分割简介

OpenCV(Open Source Computer Vision)是一个开源计算机视觉库,提供了很多图像处理、计算几何、计算机视觉等方面的实现。阈值分割是opencv中最基本和常用的图像分割方法之一,常用来将图像分成前景和背景。 阈值分割是将图像转换为二值图像的过程,它的核心是在图像中寻找阈值,将所有灰度值大于该阈值的像素设置为一个值,将其他像素设为另一个值。此过程后,像素值为该值的就是二值化后的前景像素,否则就是背景像素。

2. opencv 阈值分割的应用场景

阈值分割在人工智能和机器学习技术发展的今天,正越来越受到关注。阈值分割应用广泛,例如自动识别目标、边缘检测、文字识别、人脸检测、图像增强等领域。在模式识别和计算机视觉中,阈值分割的效果和实施方案的确立是非常重要的,不仅能够提高识别率,而且能够节省大量的时间和资源。

3. opencv 阈值分割的具体操作

3.1 二值化图像

二值化图像是一种将图像转为黑白像素的过程。主要方法是将原图像的像素值与设定的阈值进行比较,高于阈值的部分在二值化图像中变为白色像素(值为255),低于阈值的部分变为黑色像素(值为0)。

示例代码:

import cv2

import numpy as np

img = cv2.imread('image_test.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

cv2.imshow("original", img)

cv2.imshow("binary", binary)

cv2.waitKey(0)

cv2.destroyAllWindows()

在上述示例代码中,cv2.imread('image_test.png') 读入原始图像并转为灰度图像,cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) 二值化图像,其中参数127 是阈值,小于阈值灰度值的像素点变为黑色,大于阈值的像素点变为白色。

3.2 自动选择阈值

在二值化图像中,阈值的选择通常是一个比较难以确定的问题,参数的选择需要针对不同的应用场景进行调整。其实,opencv提供了许多自动选择阈值的算法。例如Otsu算法和自适应阈值算法,自动选择最佳的阈值。自动选择阈值能够提高阈值分割结果的准确性。

示例代码:

import cv2

import numpy as np

img = cv2.imread('image_test.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

cv2.imshow("original", img)

cv2.imshow("OTSU binary", binary)

cv2.waitKey(0)

cv2.destroyAllWindows()

在上述示例代码中,cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) 中的cv2.THRESH_OTSU 就是设置使用Otsu算法自适应选择阈值。当然,自适应阈值算法也是一个不错的选择,它自动调整像素阈值以适应不同的场景,例如亮度不均的情形。

3.3 腐蚀与膨胀处理

腐蚀操作可以将二值化的图像中的小噪点和毛刺去掉,而膨胀操作则可以用来连接图像中存在的多个互不连通的前景区域。在threshhold阈值分割后进行腐蚀和膨胀操作,可以得到好的效果。

示例代码:

import cv2

import numpy as np

img = cv2.imread('image_test.png')

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

kernel = np.ones((5,5), np.uint8)

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

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

cv2.imshow("original", img)

cv2.imshow("erosion", erosion)

cv2.imshow("dilation", dilation)

cv2.waitKey(0)

cv2.destroyAllWindows()

在上述示例代码中,erosion = cv2.erode(binary, kernel, iterations=1) 使用腐蚀操作滤除噪点和毛刺,dilation = cv2.dilate(binary, kernel, iterations=1) 使用膨胀操作连接前景区域。

4. opencv 阈值分割的优缺点分析

4.1 优点

阈值分割方法简单易行,适用于一些较为简单的场景。同时,阈值分割方法不需要复杂的模型和算法,其计算速度也非常快。其次阈值分割方法可以直接跟踪画面中的物体并将其分离出来。

4.2 缺点

阈值分割方法对于画面中光照不均、噪点多、物体连接或存在复杂背景等情况时,阈值分割就很难识别出正确的目标了。同时阈值分割方法是一种单点处理方法,不能全局考虑图像中每个像素点的特性,缺乏灵活性。

5. opencv 阈值分割的应用案例

阈值分割方法应用非常广泛,例如下面几个领域。

5.1 OCR 文字识别

OCR 文字识别是阈值分割应用最典型的领域之一。在对其它复杂或模糊的图像进行文字识别时,通常需要使用二值化和自适应阈值来提高识别的准确性。

5.2 物体边缘检测

阈值分割在物体边缘检测中也有广泛应用。物体边缘检测是通过检测目标区域和背景像素之间的像素差距,来提取目标像素的边缘信息。

5.3 荧光显微镜图像分割

荧光显微镜图像分割是阈值分割在医学领域中的应用之一。因为荧光显微镜图像光线强度不均,且存在噪点干扰,所以需要使用阈值分割去除噪点和前景区域,并提取样本信息。

6. 总结

本文从阈值分割基础知识入手,介绍了阈值分割的具体操作和应用案例。阈值分割方法虽然简单,但它可以非常有效地解决各种应用场景下的图像分割问题,如文字识别、物体边缘检测、医学图像标记等。但是在使用阈值分割算法时,一定要注意选择合适的参数,避免由于参数选择不当而导致的识别错误和偏差。

后端开发标签