05-图像分割二值化

阅读: 评论:0

05-图像分割⼆值化
图像分割/⼆值化
简介
图像阈值化分割是⼀种传统的最常⽤的图像分割⽅法,因其实现简单、计算量⼩、性能较稳定⽽成为图像分割中最基本和应⽤最⼴泛的分割技术。它特别适⽤于⽬标和背景占据不同灰度级范围的图像。它不仅可以极⼤的压缩数据量,⽽且也⼤⼤简化了分析和处理步骤,因此在很多情况下,是进⾏图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的⽬的是要按照灰度级,对像素集合进⾏⼀个划分,得到的每个⼦集形成⼀个与现实景物相对应的区域,各个区域内部具有⼀致的属性,⽽相邻区域不具有这种⼀致属性。这样的划分可以通过从灰度级出发选取⼀个或多个阈值来实现。阴茎骨
算法理论介绍
1.最⼤类间⽅差法(⼤津阈值法)
⼤津法(OTSU)是⼀种确定图像⼆值化分割阈值的算法,由⽇本学者⼤津于1979年提出。从⼤津法的原理上来讲,该⽅法⼜称作最⼤类间⽅差法,因为按照⼤津法求得的阈值进⾏图像⼆值化分割后,前景与背景图像的类间⽅差最⼤。
它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对⽐度的影响,因此在数字图像处理上得到了⼴泛的应⽤。它是按图像的灰度特性,将图像分成背景和前景两部分。因⽅差是灰度分布均匀性的⼀种度量,背景和前景之间的类间⽅差越⼤,说明构成图像的两部分的差别越⼤,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变⼩。因此,使类间⽅差最⼤的分割意味着错分概率最⼩。
应⽤: 是求图像全局阈值的最佳⽅法,应⽤不⾔⽽喻,适⽤于⼤部分需要求图像全局阈值的场合。
优点: 计算简单快速,不受图像亮度和对⽐度的影响。
缺点: 对图像噪声敏感;只能针对单⼀⽬标分割;当⽬标和背景⼤⼩⽐例悬殊、类间⽅差函数可能呈现双峰或者多峰,这个时候效果不好。
2.⾃适应阈值
前⾯介绍了OTSU算法,但这算法属于全局阈值法,所以对于某些光照不均的图像,这种全局阈值分割的⽅法会显得苍⽩⽆⼒,如下图:
显然,这样的阈值处理结果不是我们想要的,那么就需要⼀种⽅法来应对这样的情况。
这种办法就是⾃适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,⽽是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够⾃适应计算不同的阈值,因此被称为⾃适应阈值法。(其实就是局部阈值法)
如何确定局部阈值呢?可以计算某个邻域(局部)的均值、中值、⾼斯加权平均(⾼斯滤波)来确定阈值。值得说明的是:如果⽤局部的均值作为局部的阈值,就是常说的移动平均法。
基于OpenCV的python实现
1.简单阈值
在这⾥,问题直截了当。对于每个像素,应⽤相同的阈值。如果像素值⼩于阈值,则将其设置为0,否则将其设置为最⼤值。函数
cv.threshold⽤于应⽤阈值。第⼀个参数是源图像,它应该是灰度图像。第⼆个参数是阈值,⽤于对像素值进⾏分类。第三个参数是分配给超过阈值的像素值的最⼤值。OpenCV提供了不同类型的阈值,这由函数的第四个参数给出。通过使⽤cv.THRESH_BINARY类型。所有简单的阈值类型为:
cv.THRESH_BINARY
cv.THRESH_BINARY_INV
cv.THRESH_TRUNC
cv.THRESH_TOZERO
cv.THRESH_TOZERO_INV
该⽅法返回两个输出。第⼀个是使⽤的阈值,第⼆个输出是阈值后的图像。
代码如下:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('qq.JPG')
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
华立通信ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
titles =['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images =[img, thresh1, thresh2, thresh3, thresh4, thresh5]
print(ret)
for i in range(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.show()
效果如下:
2.⾃适应阈值
在上⼀节中,我们使⽤⼀个全局值作为阈值。但这可能并⾮在所有情况下都很好,例如,如果图像在
不同区域具有不同的光照条件。在这种情况下,⾃适应阈值阈值化可以提供帮助。在此,算法基于像素周围的⼩区域确定像素的阈值。因此,对于同⼀图像的不同区域,我们获得了不同的阈值,这为光照度变化的图像提供了更好的结果。
这种⽅法需要我们指定三个参数,返回值只有⼀个。
Adaptive Method 指定计算阀值的⽅法
-cv2.ADAPTIVE_THRESH_MEAN_C:阀值取⾃相邻区域的平均值
-cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阀值取⾃相邻区域的加权和,权重为⼀个⾼斯窗⼝
Block Size 邻域⼤⼩(⽤来计算阀值的区域⼤⼩)
C这就是⼀个常数,阀值就等于的平均值或者加权平均值减去这个常数。
代码如下:
mg = cv2.imread('qq.JPG',cv2.IMREAD_GRAYSCALE)
#print(np.array(img).shape)
#中值滤波
img = dianBlur(img,5)
ret , th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# 11为block size,2为C值
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C , cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C , cv2.THRESH_BINARY,11,2)
titles =['original image','global thresholding (v=127)','Adaptive mean thresholding',
'adaptive gaussian thresholding']
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])
雷经天icks([]),icks([])
plt.show()
效果如下:
可以发现,⽤⾃适应阈值法将图像信息保留的更加完整。
3. OTSU的⼆值化
在全局阈值化中,我们使⽤任意选择的值作为阈值。相反,Otsu的⽅法避免了必须选择⼀个值并⾃动确定它的情况。
考虑仅具有两个不同图像值的图像(双峰图像),其中直⽅图将仅包含两个峰。⼀个好的阈值应该在这两个值的中间。类似地,Otsu的⽅法从图像直⽅图中确定最佳全局阈值。
为此,使⽤了cv.threshold作为附加标志传递。阈值可以任意选择。然后,算法到最佳阈值,该阈值作为第⼀输出返回。
查看以下⽰例。输⼊图像为椒盐噪点图像。在第⼀种情况下,采⽤值为127的全局阈值。在第⼆种情况下,直接采⽤Otsu阈值法。在第三种情况下,⾸先使⽤中值滤波对图像进⾏滤波以去除噪声,然后应⽤Otsu阈值处理。了解噪声滤波如何改善结果。
生死赌门import random
def sp_noise(image,prob):
'''
添加椒盐噪声
prob:噪声⽐例
'''
新沂市王庄中学output = np.zeros(image.shape,np.uint8)
thres =1- prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = random.random()
if rdn < prob:
output[i][j]=0
elif rdn > thres:
output[i][j]=255
else:
output[i][j]= image[i][j]
return output
img = cv2.imread('qq.JPG',cv2.IMREAD_GRAYSCALE)
src2 = sp_noise(img,0.05)
# 全局阈值
ret1,th1 = cv2.threshold(src2,127,255,cv2.THRESH_BINARY)
# Otsu阈值
ret2,th2 = cv2.threshold(src2,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# ⾼斯滤波后再采⽤Otsu阈值
blur = dianBlur(src2,5)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
print(ret2,ret3)
# 绘制所有图像及其直⽅图
images =[img,0, th1,
img,0, th2,
blur,0, th3]
titles =['Original Noisy Image','Histogram','Global Thresholding (v=127)',
'Original Noisy Image','Histogram',"Otsu's Thresholding",
'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
胡筱龙for i in range(3):
plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
plt.title(titles[i*3]), icks([]), icks([])
plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
plt.title(titles[i*3+1]), icks([]), icks([])
plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
plt.title(titles[i*3+2]), icks([]), icks([])
plt.show()
效果如图:
其中,⽤后两种⽅法得到的全局阈值分别为:116 117;
虽然不是双峰图像,但依然可以看出Otsu的作⽤。

本文发布于:2023-06-14 08:21:25,感谢您对本站的认可!

本文链接:https://patent.en369.cn/xueshu/75110.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:阈值   图像   分割   区域   全局   计算   背景
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图