课程学习——双阈值分割

本文介绍使用Matlab进行图像处理中的双峰阈值分割方法。包括将彩色图像转换为灰度图像、统计灰度直方图、手动设置阈值进行二值化分割以及利用Otsu算法自动确定最佳阈值的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

双峰阈值分割:
1.通过将原图转化为灰度图像,并计算每点的灰度值从而得到直方图。
2.通过手动输入灰度值,将此灰度值作为阈值,小于阈值的为黑,大于阈值的为白,从而生成二值化图像。
3.调用matlab中自带的函数,实现双峰阈值分割。
4.调用matlab中自带的ostu函数,实现ostu阈值分割。
5.对比原图,直方图,双峰阈值分割,ostu分割,从而分析分割结果是否理想。
matlab:实现双阈值分割
代码:

% 双峰法是一种简单的阈值分割方法,即如果灰度级直方图呈现明显的双峰状,
% 则选双峰之间的谷底所对应的灰度级作为阈值分割。
clc; 
clear all; 
close all;
I = imread('E:\matlabCX\图片\3.jpg');
if ndims(I) == 3
    I = rgb2gray(I);
end
fxy = imhist(I, 256); %统计每个灰度值的个数
figure;
subplot(2, 2, 1); 
imshow(I, []); 
title('原图')
subplot(2, 2, 2); 
plot(fxy); %画出灰度直方图
title('直方图')
p1 = {'Input Num:'}; 
p2 = {'180'};
p3 = inputdlg(p1,'Input Num:1~256',1,p2);
p = str2num(p3{1}); 
p = p/255;
bw = im2bw(I, p); %小于阈值的为黑,大于阈值的为白
subplot(2, 2, 3); 
imshow(bw); 
title('双峰阈值分割')
bw1 = im2bw(I, graythresh(I));
subplot(2, 2, 4); 
imshow(bw1); 
title('ostu阈值分割')

结果:
在这里插入图片描述

少年不被楼层误,余生不羁尽自由。
加油,加油!

### 双阈值法的概念 双阈值法是一种常用的边缘检测技术,在图像处理领域具有广泛应用。该方法通过设定两个不同的阈值来区分强边缘、弱边缘以及非边缘区域。具体来说,高阈值用于识别明显的边缘点,而低阈值则用来捕捉可能属于边缘但强度较弱的像素点。 在实际应用中,双阈值法通常结合其他边缘检测算法(如Canny边缘检测器)一起使用。这种方法能够有效减少噪声干扰并保留更多的细节信息[^1]。 ### 双阈值法的实现方法 #### 1. 边缘梯度计算 首先,利用Sobel算子或其他类似的微分算子对输入图像进行卷积操作,以计算每个像素位置上的水平和垂直方向的一阶偏导数。随后,根据这两个偏导数值可以求得各点处的梯度幅值与角度: ```python import cv2 import numpy as np def compute_gradient(image): # 使用Sobel算子分别沿X轴和Y轴方向计算一阶导数 grad_x = cv2.Sobel(image, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=3) grad_y = cv2.Sobel(image, ddepth=cv2.CV_64F, dx=0, dy=1, ksize=3) # 计算梯度幅度和方向角 gradient_magnitude = np.sqrt(grad_x ** 2 + grad_y ** 2) gradient_angle = np.arctan2(grad_y, grad_x) * (180 / np.pi) return gradient_magnitude, gradient_angle ``` #### 2. 设置高低阈值 依据经验或统计分析确定合适的高低阈值范围。一般而言,高阈值设为最大梯度值的一个比例因子乘积形式,而低阈值则是高阈值的一部分百分比。 #### 3. 强弱边缘分类 遍历整个图像矩阵,对于那些超过高阈值的像素标记为“强边缘”,介于两阈值之间的视为“潜在弱边缘”。低于低阈值的部分直接忽略掉。 #### 4. 连接跟踪机制 采用连接追踪策略进一步确认哪些被初步判定为弱边缘的实际确实构成连续轮廓线段一部分。如果某个候选弱边缘与其邻近存在已知的确切强边缘相连,则将其升级认定为最终输出结果中的正式成员之一;反之舍弃不用。 以下是完整的Python代码示例展示如何基于上述流程构建一个简单的双阈值边缘检测函数: ```python def double_threshold_hysteresis(gradient_magnitude, low_ratio=0.05, high_ratio=0.2): max_val = np.max(gradient_magnitude) # 定义高低阈值 high_thresh = int(max_val * high_ratio) low_thresh = int(high_thresh * low_ratio) M, N = gradient_magnitude.shape result = np.zeros((M,N), dtype=np.int32) weak_pixel_value = 75 strong_pixel_value = 255 # 初始化状态数组 for i in range(M): for j in range(N): if gradient_magnitude[i,j] >= high_thresh: result[i,j] = strong_pixel_value elif gradient_magnitude[i,j] < high_thresh and gradient_magnitude[i,j] > low_thresh: result[i,j] = weak_pixel_value # 开始滞后效应传播过程 directions = [(1,0),(1,-1),(0,-1),(-1,-1), (-1,0),(-1,1),(0,1),(1,1)] for y in range(1,M-1): for x in range(1,N-1): if result[y,x]==weak_pixel_value: try: if any(result[y+i][x+j]==strong_pixel_value for i,j in directions): result[y,x]=strong_pixel_value else: result[y,x]=0 except IndexError: pass return result ``` ### 结果评估 经过以上步骤处理后的二值化图像即代表了原始图片的主要边界特征分布情况。这种做法相比单一固定门限方式更加灵活稳健,尤其适合复杂背景下的目标提取任务需求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值