小言_互联网的博客

在OpenCV里实现全局阈值分割1

533人阅读  评论(0)

在前面学习了平滑的处理,接着下来将要学习图像分割。当人们观察一个图片时,会把图片里的物体进行分割出来,这样才能知道这张图片里包含有什么物体,然后根据物体的形态进行理解。因此在图像处理里,如果能把图像里的物体分割出来,再进行归类,就可以进一步地进行识别出来。图像分割(image segmentation)技术是计算机视觉领域的一个重要的研究方向,是图像语义理解的重要一环。图像分割是指将图像分成若干具有相似性质的区域的过程,从数学角度来看,图像分割是将图像划分成互不相交的区域的过程。近些年来随着深度学习技术的逐步深入,图像分割技术有了突飞猛进的发展,该技术相关的场景物体分割、人体前背景分割、人脸人体Parsing、三维重建等技术已经在无人驾驶、增强现实、安防监控等行业都得到广泛的应用。接着下来主要围绕着阈值分割技术展开,它是一种基于区域的、简单的通过灰度值信息提取形状的技术,因其实现简单、计算量小、性能稳定而成为图像分割中最基本和应用最广泛的分割技术。如果在阈值分割里,只有两种灰度值:255和0,那么这种分割也叫做二值化处理。阈值分割处理主要是根据灰度信息提取前景,所以对前景物体与背景有较强对比度的图像的分割特别有用。如果对比度比较弱,需要使用前面平滑处理方法进行增强。

对于全局阈值分割,OpenCV提供了下面的函数:

double cv::threshold (InputArray src, OutputArray dst, double thresh, double maxval, int type )

 

Python:

 

retval, dst=cv.threshold(src, thresh, maxval, type[, dst])

参数说明:

src:原图像。

dst:结果图像。

thresh:当前阈值。

maxVal:最大阈值,一般为255.

thresholdType:阈值类型,主要有下面几种:

enum ThresholdTypes {

    THRESH_BINARY     = 0,

    THRESH_BINARY_INV = 1,

    THRESH_TRUNC      = 2,

    THRESH_TOZERO     = 3,

    THRESH_TOZERO_INV = 4,

    THRESH_MASK       = 7,

    THRESH_OTSU       = 8,

    THRESH_TRIANGLE   = 16

};

返回值:

 retval: 与参数thresh一致

dst: 结果图像

 

下面来根据上面的参数来进一步学习,以便理解每个参数的作用。首先来测试THRESH_BINARY类型,它的意思就是把大于thresh的值设置为maxval,小于等于它的值置为0。演示的例子如下:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np

#图像数据
src = np.array([[100, 157, 245], [20, 51, 250], [50, 2, 200]], np.uint8)
#阈值处理
retval, dst = cv2.threshold(src, 150, 255, cv2.THRESH_BINARY)

print(src)
print(retval,'\n', dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

[[100 157 245]

 [ 20  51 250]

 [ 50   2 200]]

150.0

 [[  0 255 255]

 [  0   0 255]

 [  0   0 255]]

其实它的作用如下图:

运算公式如下:

下面来对一幅图片进行处理,阈值设置为100,代码如下:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np

#图片的路径
imgname = "imgbin1.png"

#读取图片
image = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)

#图片的高度和宽度
h,w = image.shape[:2]
print('imagesize={}-{}'.format(w,h))

#显示原图
cv2.imshow("Image",image)

#阈值分割
retval, out = cv2.threshold(image, 100, 255, cv2.THRESH_BINARY)

cv2.imshow("out",out)


cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

输入图片

输出图片

https://blog.csdn.net/caimouse/article/details/51749579


转载:https://blog.csdn.net/caimouse/article/details/101294483
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场