增加网站产品,什么是ui界面,海口cms模板建站,汕头百度网站排名这里写自定义目录标题 数学原理算法评价参考链接 数学原理
以灰度图像为例#xff0c;对于图像MN大小的矩阵#xff0c;即图像中的像素#xff0c;每一个值即为像素值#xff0c;其中灰度图像像素值在(0~255)之间。 主要实现前景(即目标)和背景的分割#xff1a; 主要公式… 这里写自定义目录标题 数学原理算法评价参考链接 数学原理
以灰度图像为例对于图像M×N大小的矩阵即图像中的像素每一个值即为像素值其中灰度图像像素值在(0~255)之间。 主要实现前景(即目标)和背景的分割 主要公式 前景的像素点数占整幅图像的比例记为ω0前景平均灰度记为μ0 背景像素点数占整幅图像的比例记为ω1其平均灰度记为μ1 图像的总平均灰度记为μ类间方差记为maximum。 假设图像的背景较暗并且图像的大小为M×N图像中像素的灰度值小于阈值optimal threshold的像素个数记作N0 像素灰度大于等于阈值optimalthreshold 的像素个数记作N1 则有 ω0 N0 / ( M × N ) (1) ω1 N1 / ( M × N ) (2) N0 N1 M × N (3) 1 ω 0 ω 1 (4) μ ω0 × μ0 ω1 × μ1 (5) maximum ω0 × ( μ0 − μ ) 2 ω1 × ( μ1 − μ ) 2 (6) 将式(5)代入式(6)得到等价公式(7) maximum ω0 × ω1 × (μ0 − μ1 ) 2 (7) 采用遍历的方法得到使类间方差maximum最大的阈值optimal threshold 实现过程
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:longc
# datetime:2023/11/16 10:30
# software: PyCharm
# function: 图像处理逻辑import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image# otsu算法
def otsu(gray):pixel_number gray.shape[0] * gray.shape[1]mean_weigth 1.0 / pixel_number# #统计各灰度级的像素个数灰度级分为256级# bins必须写到257否则255这个值只能分到[254,255)区间his, bins np.histogram(gray, np.arange(0, 257)) # 计算灰度的直方图计数统计区间为0-257print(bins, bins)print(his, his)# 绘制直方图plt.figure(figsize(12, 8))# plt.hist(gray, 256, [0, 256], label灰度级直方图) # 运行比较慢如果电脑卡顿可以将本行代码注释掉plt.show()final_thresh -1final_value -1intensity_arr np.arange(256) # 灰度分为256级0级到255级# ************************************************************ 采用遍历的方法得到类间方差最大的阈值for t in bins[1:-1]: # 遍历1到254级 (一定不能有超出范围的值)pcb np.sum(his[:t]) # 小于当前灰度对应的所有像素点计数pcf np.sum(his[t:]) # 大于当前灰度对应的所有像素点计数Wb pcb * mean_weigth # 像素被分类为背景的概率Wf pcf * mean_weigth # 像素被分类为目标的概率# if t 100:# print(1, intensity_arr[:t])# print(2, his[:t])# print(3, np.sum(intensity_arr[:t] * his[:t]))# print(4, float(pcb))# print(5, np.sum(intensity_arr[:t] * his[:t]) / float(pcb))mub np.sum(intensity_arr[:t] * his[:t]) / float(pcb) # 分类为背景的像素均值muf np.sum(intensity_arr[t:] * his[t:]) / float(pcf) # 分类为目标的像素均值# print mub, mufvalue Wb * Wf * (mub - muf) ** 2 # 计算目标和背景类间方差# 采用遍历的方法得到使类间方差value最大的阈值final_value和二值化对应最大的final_threshif value final_value:final_thresh t # 进行二值化的操作值final_value valueprint(final_thresh, final_thresh)print(final_value, final_value)# 二值化操作处理# final_img gray.copy()# print(final_thresh)# final_img[gray final_thresh] 255# final_img[gray final_thresh] 0# cv2.imwrite(final_img.jpg, final_img)plt.imshow(gray)plt.show()# 二值化图像多种方法对比ret, binary_image cv2.threshold(gray, final_thresh-15, 255, cv2.THRESH_BINARY)plt.imshow(binary_image, cmapgray)plt.show()# ret, binary_image1 cv2.threshold(gray, final_thresh, 255, cv2.THRESH_TRUNC)# plt.imshow(binary_image1)# plt.show()## ret, binary_image2 cv2.threshold(gray, final_thresh, 255, cv2.THRESH_TOZERO)# plt.imshow(binary_image2)# plt.show()## ret, binary_image3 cv2.threshold(gray, final_thresh, 255, cv2.THRESH_TOZERO_INV)# plt.imshow(binary_image3)# plt.show()imggray cv2.imread(IMG_0004_3.jpg, 0)
plt.title(imggray)
plt.imshow(imggray, cmapgray)
plt.show()# 进行OSTU运算
otsu(imggray)
算法评价
优点算法简单当目标与背景的面积相差不大时能够有效地对图像进行分割。
缺点类间方差法对噪声以及目标大小十分敏感它仅对类间方差为单峰的图像产生较好的分割效果。当目标与背景的大小比例悬殊时例如受光照不均、反光或背景复杂等因素影响类间方差准则函数可能呈现双峰或多峰或者目标与背景的灰度有较大的重叠时效果不不是很理想。
原因该方法忽略了图像的空间信息同时将图像的灰度分布作为分割图像的依据对噪声也相当敏感
原文链接
参考链接
数字图像处理——最大类间方差法OTSU图像阈值分割实例