图像分割-传统算法-阈值分割原理与实践

固定阈值法------直方图双峰法

手动设定一个全局阈值 T。 简单、速度快。

缺点:对光照不均、对比度变化敏感。

python 复制代码
img_ori = cv2.imread('./test/test_img.jpg', 0)
width, height = img_ori.shape
cv2.imshow('img', img_ori)
''' 直方图双峰法 '''
img = copy.deepcopy(img_ori)
x, img1 = cv2.threshold(img_ori, 150, 255, cv2.THRESH_BINARY)
x, img2 = cv2.threshold(img_ori, 150, 255, cv2.THRESH_TRUNC)
x, img3 = cv2.threshold(img_ori, 150, 255, cv2.THRESH_TOZERO)
cv2.imshow('BINARY', img1)
cv2.imshow('TRUNC', img2)
cv2.imshow('TOZERO', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

迭代阈值图像分割

通过对图像的灰度值进行迭代,不断调整阈值使得分割更加准确。

对于大尺寸图像,迭代阈值图像分割的计算速度可能成为其一个缺点。

python 复制代码
img = copy.deepcopy(img_ori)
threshold = 150
delta = 1
while delta > 0:
    foreground = []
    background = []
    for y in range(height):
        for x in range(width):
            if img[x, y] > threshold:
                background.append(img[x, y])
            else:
                foreground.append(img[x, y])
    avr_foreground = np.mean(foreground)
    avr_background = np.mean(background)
    new_threshold = (avr_foreground + avr_background) // 2
    delta = abs(new_threshold - threshold)
    print('delta', delta)
    threshold = new_threshold
for y in range(height):
    for x in range(width):
        if img[x, y] > threshold:
            img[x, y] = 255
        else:
            img[x, y] = 0

cv2.imshow('iter result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

自适应阈值图像分割

根据像素邻域的灰度分布(如均值、高斯加权和)动态计算阈值。 能处理光照不均或渐变图像。

缺点:速度较慢,可能有"块效应"。

python 复制代码
img = copy.deepcopy(img_ori)
block_size = 3
img_thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow('adapt result', img_thresh)

大津法(OTSU)

自动寻找使类间方差最大的阈值。 全自动,对双峰直方图效果极佳。

缺点:对非双峰直方图或噪声敏感。

python 复制代码
img = copy.deepcopy(img_ori)
ret, img_thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow('OTSU result', img_thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

全部代码

python 复制代码
import cv2
import numpy as np
import copy

img_ori = cv2.imread('./test/test_img.jpg', 0)
width, height = img_ori.shape

''' 直方图双峰法 '''
img = copy.deepcopy(img_ori)
x, img1 = cv2.threshold(img, 150, 255, cv2.THRESH_BINARY)
x, img2 = cv2.threshold(img, 150, 255, cv2.THRESH_TRUNC)
x, img3 = cv2.threshold(img, 150, 255, cv2.THRESH_TOZERO)
cv2.imshow('img', img_ori)
cv2.imshow('BINARY', img1)
cv2.imshow('TRUNC', img2)
cv2.imshow('TOZERO', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

''' 迭代阈值图像分割 '''
img = copy.deepcopy(img_ori)
threshold = 150
delta = 1
while delta > 0:
    foreground = []
    background = []
    for y in range(height):
        for x in range(width):
            if img[x, y] > threshold:
                background.append(img[x, y])
            else:
                foreground.append(img[x, y])
    avr_foreground = np.mean(foreground)
    avr_background = np.mean(background)

    new_threshold = (avr_foreground + avr_background) // 2
    delta = abs(new_threshold - threshold)
    print('delta', delta)
    threshold = new_threshold
for y in range(height):
    for x in range(width):
        if img[x, y] > threshold:
            img[x, y] = 255
        else:
            img[x, y] = 0

cv2.imshow('img', img_ori)
cv2.imshow('iter result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

''' 自适应阈值图像分割 '''
img = copy.deepcopy(img_ori)
block_size = 3
img_thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow('img', img_ori)
cv2.imshow('adapt result', img_thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

'''  大津法(OTSU) '''
# 大津法阈值分割
img = copy.deepcopy(img_ori)
ret, img_thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow('img', img_ori)
cv2.imshow('OTSU result', img_thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

参考
图像分割参考1
图像分割参考2

相关推荐
2401_841495648 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
神奇霸王龙9 小时前
GB/T 46886 闭环屠夫:5 旗舰多模态 LLM 工业质检实测
人工智能·计算机视觉·ai·开源·ai编程·本地部署
爱刷碗的苏泓舒12 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
Microvision维视智造14 小时前
10ppm是什么概念?锂电生产管控国标给AI视觉下了硬指标
人工智能·计算机视觉·视觉检测·机器视觉
烬羽15 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米15 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠16 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA17 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel17 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构
陕西企来客18 小时前
2026年7月技术好GEO优化方案:算法适配与内容策略
人工智能·算法·机器学习·技术好geo优化