图像分割I

为什么要图像分割?

目标

  1. 掌握图像分割的基本概念
  2. 了解图像分割方法分类
    目标:将图像划分为不同区域
  3. 定义:令集合R代表整个图像区域,对R的图像分割可以看作是将R分成N个满足以下条件的非空子集 R 1 , R 2 , . . . , R N R_1,R_2,...,R_N R1,R2,...,RN:
    ⋃ i = 1 N R i = R , R i ∩ R j = ∅ \bigcup_{i=1}^NR_i = R,R_i\cap R_j = \varnothing i=1NRi=RRiRj=
    应用:医学图像分割、工件表面缺陷检测、实例分割、字符识别

图像分割方法:

  1. 基于图像灰度阈值
  2. 基于边界的方法
  3. 基于区域的方法
  4. 基于聚类的方法
  5. 基于图论及概率模型的方法
  6. 深度学习方法

图像标记:为像素 f ( x , y ) f(x,y) f(x,y)打上准确的离散化标签 g ( x , y ) g(x,y) g(x,y)。4-连通域和8-连通域对打标签的判断标准不一样。

总结:

  1. 图像分割是中层视觉的重要内容,具有广泛应用
  2. 图像分割的主要方法包括阈值法、区域法等
  3. 图像标记为分割后的结果打上不同标签,便于后续处理

基于灰度直方图的阈值分割

目标:

  1. 掌握灰度阈值分割的基本概念
  2. 掌握大津算法的基本思想及实现

灰度阈值分割

  • 假设:图像中的目标区和背景区之间或不同目标区之间,灰度存在明显差异
  • 凡是灰度值包含于z的像素都变成某一灰度值,其他变成另一个灰度值,则该图像就以z为界被分成两个区域
  • 如果=1和=0,分割后的图像为二值图像

自动阈值分割

  • 自动确定最佳阈值,使背景和目标之间的差异最大

大津(Otsu)算法原理I:

  • 根据统计分析理论,最佳阈值确定的最佳二分类应使类内方差最小,等同于类间方差最大
  • 大津算法基本思想:确定使灰度直方图类间方差最大的最佳阈值
  • 假设灰度直方图已经归一化,即
    p i = n i N , ∑ p i = 1 p_i = \frac{n_i}{N}, \sum p_i = 1 pi=Nni,pi=1

大津(Otsu)算法原理II:

  • 假设阈值T将像素灰度划分为两类: C 0 C_0 C0 C 1 C_1 C1,则每一类出现的概率:
    ω 0 = ∑ i = 1 T p i , ω 1 = ∑ i = T + 1 N p i = 1 − ω 0 \omega_0 = \sum_{i=1}^{T}p_i,\omega_1 = \sum_{i = T+1}^Np_i = 1-\omega_0 ω0=i=1Tpi,ω1=i=T+1Npi=1ω0
  • 每类的平均灰度级:
    μ 0 = ∑ i = 1 T i p i / ω 0 = μ 0 ˊ ω 0 , μ 1 = ∑ i = T + 1 N i p i / ω 1 = μ 1 ˊ ω 1 = μ − μ 0 ˊ 1 − ω 0 \mu_0 = \sum_{i=1}^Tip_i/\omega_0= \frac{\acute{\mu_0}}{\omega_0},\mu_1 = \sum_{i=T+1}^Nip_i/\omega_1= \frac{\acute{\mu_1}}{\omega_1} = \frac{\mu-\acute{\mu_0}}{1-\omega_0} μ0=i=1Tipi/ω0=ω0μ0ˊ,μ1=i=T+1Nipi/ω1=ω1μ1ˊ=1ω0μμ0ˊ
    其中 μ = ∑ i = 1 N i p i \mu = \sum_{i=1}^Nip_i μ=i=1Nipi。显然有 ω 0 μ 0 + ω 1 μ 1 = μ \omega_0\mu_0+\omega_1\mu_1=\mu ω0μ0+ω1μ1=μ

大津算法原理III:

  • 两类类内方差:
    σ 0 2 = ∑ i = 1 T ( i − μ 0 ) 2 p i / ω 0 , σ 1 2 = ∑ i = T + 1 N ( i − μ 1 ) 2 p i / ω 1 \sigma_0^2 = \sum_{i=1}^T(i-\mu_0)^2p_i/\omega_0,\sigma_1^2 = \sum_{i=T+1}^N(i-\mu_1)^2p_i/\omega_1 σ02=i=1T(iμ0)2pi/ω0σ12=i=T+1N(iμ1)2pi/ω1
  • 对应的类间方差:
    σ B 2 = ω 0 ( μ 0 − μ ) 2 + ω 1 ( μ 1 − μ ) 2 = ω 0 ω 1 ( μ 1 − μ 0 ) 2 \sigma_B^2 = \omega_0(\mu_0-\mu)^2 + \omega_1(\mu_1-\mu)^2=\omega_0\omega_1(\mu_1-\mu_0)^2 σB2=ω0(μ0μ)2+ω1(μ1μ)2=ω0ω1(μ1μ0)2

大津算法原理IV:

  • 显然, ω B \omega_B ωB是关于最佳阈值T的隐函数,应选取T:
    T = a r g m a x σ B 2 , 1 < = T < L T = ar gmax\sigma_B^2,1<=T<L T=argmaxσB2,1<=T<L
  • 算法实现:遍历灰度取值,使 σ B 2 \sigma_B^2 σB2最大

总结

  1. 大津算法是常用的一类灰度阈值自动选取方式,目标是令类间方差最大
  2. 大津算法求解采用遍历方式,思想直接,实现速度快。

灰度阈值分割实战演练

目标:

  1. 掌握如何使用OpenCV实现基于边缘的分割
  2. 掌握大津算法的OpenCV实现

基于边缘轮廓的分割

  • 可以在边缘检测的基础上,基于闭合边缘构建分割后的结果
  • 该算法基于Suzuki,S.“Topological structural analysis of digitized binary images by border following.”

相关函数

  • 找到目标轮廓
image, contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
#image:单通道图像矩阵,可以是灰度图,但更常用的是经过边缘检测算子处理后的二值图像;
#contours:定义为"vector<vector<Point>>contours",是一个轮廓列表;
#hierachy:存在嵌套轮廓时,分别为第i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号;
#mode:包括CV_CHAIN_APPROX_SIMPLE仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours等;
#offset:所有的轮廓信息相对于原始图像对应的偏移量,缺省不设置。

实例:

要求:检测图中的米粒
算法步骤:

  1. 图像采集(取得图像)
  2. 图像预处理或后处理
  3. 基于灰度的阈值分割
  4. 得到最终结果
import cv2
import matplotlib.pyplot as plt
import copy
#打开图像
filename = r'C:/python/img/rice.png'
image = cv2.imread(filename)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#大津算法灰度阈值化
thr, bw = cv2.threshold(gray, 0, 0xff, cv2.THRESH_OTSU)
print('Threshold is:', thr)

#画出灰度直方图
plt.hist(gray.ravel(), 256, [0, 256])
plt.show()

element = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
bw = cv2.morphologyEx(bw, cv2.MORPH_OPEN, element)

seg = copy.deepcopy(bw)
#计算轮廓
cnts, hier = cv2.findContours(seg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#cnts:分割后的所有轮廓
#hier:分割后的结果

count = 0
#遍历所有区域,并去除面积过小的
for i in range(len(cnts), 0, -1):
    c = cnts[i-1]
    area = cv2.contourArea(c)
    if area < 10:
        continue
    count = count + 1
    print("blob", i, " : ", area)

    #区域画框并标记
    x, y, w, h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 0, 0xff), 1)
    cv2.putText(image, str(count), (x,y), cv2.FONT_HERSHEY_PLAIN, 0.5, (0, 0xff, 0))

print("米粒数量:", count)
cv2.imshow("源图", image)
cv2.imshow("阈值化图", bw)

cv2.waitKey()
cv2.destroyAllWindows()

由于没有进行前处理,右下角出现漏点。

局部阈值分割实战演练

目标:

  1. 了解局部阈值法分割基本原理
  2. 了解多阈值分割的基本原理

全局阈值法的问题:背景存在光照不均时,分割效果变差

局部阈值法

在这里插入图片描述
将原图片划分区域,分别看但各区域内灰度值极值的差值,对大于一定值的区域单独进行大津算法分割。

多阈值分割原理

对比:类间方差(二类):
σ B 2 = ω 0 ( μ 0 − μ ) 2 + ω 1 ( μ 1 − μ ) 2 = ω 0 ω 1 ( μ 1 − μ 0 ) 2 \sigma_B^2 = \omega_0(\mu_0 - \mu)^2 + \omega_1(\mu_1 - \mu)^2 = \omega_0\omega_1(\mu_1 - \mu_0)^2 σB2=ω0(μ0μ)2+ω1(μ1μ)2=ω0ω1(μ1μ0)2
类间方差(多类):
σ B 2 = ∑ k = 1 K ω k ( μ k − μ ) 2 \sigma_B^2 = \sum_{k=1}^K\omega_k(\mu_k-\mu)^2 σB2=k=1Kωk(μkμ)2
其中 ∑ k = 1 K ω k = 1 \sum_{k=1}^K\omega_k = 1 k=1Kωk=1
选择最优阈值 T 1 , . . . . . . , T k T_1,......,T_k T1,......,Tk:
( T 1 , . . . . . . , T k ) = a r g m a x σ B 2 ( T 1 , . . . . . . , T k ) , 1 < = T 1 < . . . < T k < L (T_1,......,T_k) = argmax \sigma_B^2(T_1,......,T_k),1<=T_1<...<T_k<L (T1,......,Tk)=argmaxσB2(T1,......,Tk),1<=T1<...<Tk<L
图像差别可通过峰值信噪比(PSNR)评价:
定义均方误差:
M S E = 1 m n ∑ x = 0 m − 1 ∑ y = 0 n − 1 ∥ f ( x , y ) − g ( x , y ) ∥ 2 MSE = \frac{1}{mn}\sum_{x=0}^{m-1}\sum_{y=0}^{n-1}\|f(x,y)-g(x,y)\|^2 MSE=mn1x=0m1y=0n1f(x,y)g(x,y)2
原图像和处理后图像逐像素作差的平方和除以图像像素数
定义PSNR:
P S N R = 10 ⋅ l o g 10 ( f M A X 2 M S E ) = 20 ⋅ l o g 10 ( f M A X 2 M S E ) , f M A X 对 应 最 大 灰 度 值 PSNR = 10\cdot log_{10}(\frac{f_{MAX}^2}{MSE}) = 20\cdot log_{10}(\frac{f_{MAX}^2}{\sqrt{MSE}}),f_{MAX}对应最大灰度值 PSNR=10log10(MSEfMAX2)=20log10(MSE fMAX2)fMAX

总结:

  1. 局部阈值法可有效解决照明不均的问题
  2. 多阈值法是二值化分割方法的扩展,可解决多指目标的分割问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值