网站设计团队发展,寮步网页设计,做网站需要有公司吗,阜阳公司做网站图像二值化#xff08;Image Binarization#xff09;#xff1a;平均值法、双峰法、大津算法#xff08;OTSU#xff09;
编程实现图像的二值化#xff0c;分析不同的阈值对二值化图像的影响。
问题描述
传统的机器视觉通常包括两个步骤#xff1a;预处理和物体检测…图像二值化Image Binarization平均值法、双峰法、大津算法OTSU
编程实现图像的二值化分析不同的阈值对二值化图像的影响。
问题描述
传统的机器视觉通常包括两个步骤预处理和物体检测。而沟通二者的桥梁则是图像分割Image Segmentation。图像分割通过简化或改变图像的表示形式使得图像更易于分析。最简单的图像分割方法是二值化Binarization。
图像二值化Image Binarization就是将图像上的像素点的灰度值设置为0或255也就是将整个图像呈现出明显的黑白效果的过程。二值图像每个像素只有两种取值要么纯黑要么纯白。
由于二值图像数据足够简单许多视觉算法都依赖二值图像。通过二值图像能更好地分析物体的形状和轮廓。二值图像也常常用作原始图像的掩模又称遮罩、蒙版Mask它就像一张部分镂空的纸把我们不感兴趣的区域遮掉。进行二值化有多种方式其中最常用的就是采用阈值法Thresholding进行二值化。其将大于某个临界灰度值的像素灰度设为灰度极大值小于这个值的为灰度极小值从而实现二值化。
阈值法又分为全局阈值Global Method和局部阈值Local Method又称自适应阈值Adaptive Thresholding。本次实验主要实现全局阈值阈值的选取基于以下三种方法
平均值法双峰法OTSU法
平均值法
为了应对每张图片的灰度值大不相同阈值取为图像本身的平均值.
import cv2
import numpy as np
import matplotlib.pyplot as pltimg_name0 lena_gray.bmp
img0 cv2.imread(img_name0)plt.imshow(img0)
plt.show()def mean_binarization(img):img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)threshold np.mean(img_gray)img_gray[img_graythreshold] 255img_gray[img_graythreshold] 0# For displaying a grayscale image set up the colormapping using the parameters cmapgray, vmin0, vmax255.plt.imshow(img_gray, cmapgray)plt.show()return img_grayimg_gray0 mean_binarization(img0)双峰法
如果物体与背景的灰度值对比明显直方图就会包含双峰(bimodal histogram)它们分别为图像的前景和背景。而它们之间的谷底即为边缘附近相对较少数目的像素点一般来讲这个最小值就为最优二值化的分界点通过这个点可以把前景和背景很好地分开。
from collections import Counterdef hist_binarization(img):img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)hist img_gray.flatten()plt.subplot(121)plt.hist(hist, 256)cnt_hist Counter(hist)most_commons cnt_hist.most_common(2)# get the grey values of bimodal histogrambegin, end most_commons[0][0], most_commons[1][0]if begin end:begin, end end, beginprint(f{begin}: {end})cnt np.iinfo(np.int16).maxthreshold 0for i in range(begin, end1):if cnt_hist[i] cnt:cnt cnt_hist[i]threshold iprint(f{threshold}: {cnt})img_gray[img_graythreshold] 255img_gray[img_graythreshold] 0plt.subplot(122)plt.imshow(img_gray, cmapgray)plt.show()return img_grayimg_gray1 hist_binarization(img0)上述直方图两峰值没有间距故未能较好体现双峰法的作用.
OTSU法
不难发现上述双峰法具有明显的缺陷因为直方图是不连续的有非常多尖峰和抖动要找到准确的极值点十分困难。日本工程师大津展之为这个波谷找到了一个合适的数学表达并于1979年发表。这个二值化方法称为大津算法Otsu’s method。
从大津法的原理上来讲该方法又称作最大类间方差法因为按照大津法求得的阈值进行图像二值化分割后前景与背景图像的类间方差最大。它被认为是图像分割中阈值选取的最佳算法计算简单不受图像亮度和对比度的影响因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致类间差别变小。因此,使类间方差最大的分割意味着错分概率最小。
优化目标
k∗argmaxk∈Lσ2k^* \mathop { \arg \max } \limits _{k\in L} \sigma ^2k∗k∈Largmaxσ2
σ2(MG∗p1−m)2p1(1−p1)\sigma ^2 \frac{(MG*p1-m)^2}{p1(1-p1)}σ2p1(1−p1)(MG∗p1−m)2
推导 由所选定的阈值 kkk 将所有像素分为两类 C1 小于等于 kkk 和 C2大于 kkk 两类像素的均值分别为 m1m1m1、m2m2m2全局均值为 MGMGMG.属于 C1、C2 的概率分别为 p1p1p1、p2p2p2. L 是图像的像素级0255
根据方差定义得到
σ2p1(m1−MG)2p2(m2−MG)2\sigma ^2 p1(m1-MG)^2 p2(m2-MG)^2σ2p1(m1−MG)2p2(m2−MG)2
又
p1∗m1p2∗m2MGp1*m1p2*m2MGp1∗m1p2∗m2MG
p1p21p1p21p1p21
其中
p1∑i0kpip1\sum _{i0} ^k p_ip1i0∑kpi
m1∑i0kipip1m1 \frac{\sum _{i0} ^k ip_i}{p1} m1p1∑i0kipi
m2∑ik1Lipip2m2 \frac{\sum _{ik1} ^L ip_i}{p2} m2p2∑ik1Lipi
pip_ipi 是灰度值为 i 的像素点出现的频率或概率
则
σ2p1p2(m1−m2)2\sigma ^2 p1p2(m1-m2)^2σ2p1p2(m1−m2)2.
进一步化简上式
MG∑i0LipiMG\sum _{i0} ^{L} ip_iMGi0∑Lipi
m∑i0kipim\sum _{i0} ^{k} ip_imi0∑kipi
其中mmm 是灰度阈值 kkk 的累加均值相对整张图片而言的均值而 m1 是 C1 类的类内均值MGMGMG 是全局均值和前文所述一致则
m1mp1m1\frac{m}{p1}m1p1m
m2MG−mp2m2\frac{MG-m}{p2}m2p2MG−m
由此可的最终的类间方差公式
σ2(MG∗p1−m)2p1(1−p1)\sigma ^2 \frac{(MG*p1-m)^2}{p1(1-p1)}σ2p1(1−p1)(MG∗p1−m)2
def otsu(img):img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)h, w img_gray.shape[:2]pixel h * wthreshold_k 0max_var .0for k in range(255):c1 img_gray[img_gray k]p1 len(c1) / pixelif p1 0:continueelif p1 1:breakMG np.sum(img_gray) / pixelm np.sum(c1) / pixeld (MG*p1 - m) ** 2 / (p1 * (1 - p1))if d max_var:max_var dthreshold_k kimg_gray[img_gray threshold_k] 0img_gray[img_gray threshold_k] 255print(f{threshold_k})plt.imshow(img_gray, cmapgray)plt.show()return img_grayimg_gray2 otsu(img0)结果分析
OTSU算法得到的阈值产生了比上述两者都好的分割效果其按图像的灰度特性将Lena分成背景和前景两部分接着遍历阈值找到使得前景、背景二类间方差最大的阈值作为二值化的阈值. ©️Sylvan Ding 转载注明出处 参考文献
Otsu大津算法公式推导及python实现OTSU算法大津法—最大类间方差法原理及实现二值化_初探图像二值化一文搞懂图像二值化算法