双阈值法的实现

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
int main( )
{
  // 图像读取及判断
  cv::Mat srcImage = cv::imread("..\\images\\hand1.jpg");
  if( !srcImage.data ) 
      return 1;
  // 灰度转换
  cv::Mat srcGray;
  cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);
  cv::imshow("srcGray", srcGray);
  // 初始化阈值参数
  const int maxVal = 255;
  int low_threshold  = 150;
  int high_threshold = 210;
  cv::Mat dstTempImage1, dstTempImage2, dstImage;
  // 小阈值对源灰度图像进行阈值化操作
  cv::threshold( srcGray, dstTempImage1, 
       low_threshold, maxVal, cv::THRESH_BINARY );
  // 大阈值对源灰度图像进行阈值化操作
  cv::threshold( srcGray, dstTempImage2, 
       high_threshold, maxVal,cv::THRESH_BINARY_INV );
  // 矩阵与运算得到二值化结果
  cv::bitwise_and( dstTempImage1, 
      dstTempImage2, dstImage );
  cv::imshow("dstImage", dstImage);
  cv::waitKey(0);
  return 0;
} 
转载:http://blog.youkuaiyun.com/zhuwei1988


### 双阈值法的概念 双阈值法是一种常用的边缘检测技术,在图像处理领域具有广泛应用。该方法通过设定两个不同的阈值来区分强边缘、弱边缘以及非边缘区域。具体来说,高阈值用于识别明显的边缘点,而低阈值则用来捕捉可能属于边缘但强度较弱的像素点。 在实际应用中,双阈值法通常结合其他边缘检测算法(如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、付费专栏及课程。

余额充值