您好,欢迎来到吉趣旅游网。
搜索
您的当前位置:首页opencv二值化图像详解一文看懂各种二值化方法

opencv二值化图像详解一文看懂各种二值化方法

来源:吉趣旅游网
opencv⼆值化图像详解⼀⽂看懂各种⼆值化⽅法

本⽂介绍使⽤不同的阈值⽅法“⼆值化”图像

固定阈值分割

图解

代码

import cv2 as cv

# 读⼊灰度图像

img = cv.imread('baby_g.jpg', 0)

# 阈值127分割图像

ret, th = cv.threshold(img, 127, 255, cv.THRESH_BINARY)cv.imshow('thresh', th)cv.waitKey(0)

cv.destroyAllWindows()

函数讲解

cv.threshold()⽤来实现阈值分割,ret是return value缩写,代表当前的阈值,暂时不⽤理会。函数有4个参数:参数1:要处理的原图,⼀般是灰度图参数2:设定的阈值

参数3:最⼤阈值,⼀般为255参数4:阈值的⽅式,主要有5种。cv.threshold() 参数4阈值⽅式详解

实验

import cv2 as cv

import matplotlib.pyplot as pltimg = cv.imread('gradient.jpg',0)

# 应⽤5种不同的阈值⽅法

ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)

ret, th2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)ret, th3 = cv.threshold(img, 127, 255, cv.THRESH_TRUNC)ret, th4 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO)

ret, th5 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO_INV)

titles = ['Original', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']images = [img, th1, th2, th3, th4, th5]# 使⽤Matplotlib显⽰for i in range(6):

plt.subplot(2, 3, i + 1)

plt.imshow(images[i], 'gray') plt.title(titles[i], fontsize=8)

plt.xticks([]), plt.yticks([]) # 隐藏坐标轴plt.show()实验输出

官⽹中的说明

⼀点说明

很多⼈误以为阈值分割就是⼆值化。从上图中可以发现,两者并不等同,阈值分割结果是两类值,⽽不是两个值,所以教程开头我把⼆值化加了引号。

⾃适应阈值

简介及函数说明

看得出来固定阈值是在整幅图⽚上应⽤⼀个阈值进⾏分割,它并不适⽤于明暗分布不均的图⽚。 cv.adaptiveThreshold()⾃适应阈值会每次取图⽚的⼀⼩部分计算阈值,这样图⽚不同区域的阈值就不尽相同。它有5个参数:参数1:要处理的原图

参数2:最⼤阈值,⼀般为255参数3:⼩区域阈值的计算⽅式

ADAPTIVE_THRESH_MEAN_C:⼩区域内取均值

ADAPTIVE_THRESH_GAUSSIAN_C:⼩区域内加权求和,权重是个⾼斯核参数4:阈值⽅式(跟前⾯讲的那5种相同)参数5:⼩区域的⾯积,如11就是11*11的⼩块

参数6:最终阈值等于⼩区域计算出的阈值再减去此值

实验

import cv2 as cv

import matplotlib.pyplot as pltimg = cv.imread('paojie_g.jpg',0)

# 固定阈值

ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)# ⾃适应阈值

th2 = cv.adaptiveThreshold(

img, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 15, 4)th3 = cv.adaptiveThreshold(

img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 15, 8)titles = ['Original', 'Global(v = 127)', 'Adaptive Mean', 'Adaptive Gaussian']images = [img, th1, th2, th3]

for i in range(4):

plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray') plt.title(titles[i], fontsize=8) plt.xticks([]), plt.yticks([])plt.show()

实验结果

Otsu 阈值

原理及python⼿动实现实验

import cv2 as cvimport numpy as np

# Read image

img = cv.imread(\"paojie_g.jpg\# Otsu's binarization of Opencv

ret2,th2 = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)print(\"threshold >>\# Save result

cv.imwrite(\"out.jpg\cv.imshow(\"result\cv.waitKey(0)

cv.destroyAllWindows()

实验结果

都看到这⾥了,点个赞再⾛呗。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- jqkq.cn 版权所有 赣ICP备2024042794号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务