第13章 图像处理之Harris角点检测算法(二)

三、例程源码

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

def harris(image):
    blockSize = 2
    apertureSize = 3
    k = 0.04

    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    dst = cv.cornerHarris(gray, blockSize, apertureSize, k)

    dst_norm = np.empty(dst.shape, dtype=np.float32)
    cv.normalize(dst, dst_norm, alpha=0, beta=255, norm_type=cv.NORM_MINMAX)

    for i in range(dst_norm.shape[0]):
        for j in range(dst_norm.shape[1]):
            if int(dst_norm[i, j]) > 120:
                cv.circle(image, (j, i), 2, (0, 255, 0), 2)
    return image

src = cv.imread("test.jpg")
result = harris(src)
cv.imshow('result', result)
cv.waitKey(0)
cv.destroyAllWindows()

3.1 cornerHarris

函数原型:dst = cv2.cornerHarris(src, blockSize, ksize, k)

参数说明:

  1. src:输入灰度图像,必须是单通道8位或浮点型
  2. blockSize:邻域窗口大小,决定在多大区域内寻找角点
  3. ksize:Sobel算子的核大小,通常设为3
  4. k:Harris检测方程的自由参数,推荐范围0.04, 0.06

返回值:

dst是返回结果,它是一个numpy.ndarray对象,大小和src相同,每一个数组元素对应一个像素点,其值越大,对应像素点是角的概率越大。

3.2 Sobel算子

Sobel算子是一种常用的边缘检测算法,用于计算图像的梯度,以识别图像中的边缘和结构。它通过在空间域上进行卷积运算,有效提取出图像的边缘信息,尤其适合于检测水平和垂直方向的边缘

Sobel算子使用两个3×3的卷积核(也称为滤波器),分别用于检测水平方向和垂直方向的边缘。这两个卷积核如下:

Sobel核的大小,必须是1,3,5或7

3.3 normalize

OpenCV的cv::normalize()函数用于对数组或图像进行归一化处理,支持范围归一化和范数归一化两种模式。归一化选择的数学公式类型有:

  1. NORM_MINMAX: 数组的数值被平移或缩放到一个指定的范围,线性归一化。
  2. NORM_INF: 归一化数组的(切比雪夫距离)L∞范数(绝对值的最大值)
  3. NORM_L1 : 归一化数组的(曼哈顿距离)L1-范数(绝对值的和)
  4. NORM_L2: 归一化数组的(欧几里德距离)L2-范数

void cv::normalize(InputArray src, InputOutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray())

  1. src:输入数组或图像。
  2. dst:输出数组,与src形状一致。
  3. alpha:归一化目标值或范围下限(范围归一化时为下界)。
  4. beta:仅在范围归一化时使用,为范围上限。
  5. norm_type:归一化类型,支持NORM_L1、NORM_L2、NORM_INF、NORM_MINMAX。
  6. dtype:输出数据类型,若为-1则与输入一致。
  7. mask:可选掩码,指定感兴趣区域。

3.4 circle

cv::circle() 是 OpenCV 提供的一个函数,用于在图像上绘制圆形。它非常适用于在图像处理任务中标记特定的点或区域。这个函数具有多种参数,允许你根据需要控制圆的颜色、位置、半径和边界厚度。

void cv::circle(InputOutputArray img, Point center, int radius, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0)

  1. img (InputOutputArray):
    输入/输出图像。在此图像上绘制圆形。图像可以是灰度图像或彩色图像。
  2. center (Point): 圆心的坐标,用 cv::Point(x, y) 表示。x 和 y 是圆心的像素坐标。
  3. radius (int): 圆的半径,以像素为单位。
  4. color (Scalar):圆的颜色。
    对于彩色图像,颜色通过 cv::Scalar(blue, green, red) 定义,注意顺序为 BGR。
    对于灰度图像,颜色为单个强度值,如 cv::Scalar(255) 表示白色。
  5. thickness (int, 默认值 = 1):圆的边界厚度。
    如果 thickness 为正数,则表示边界线的厚度。
    如果 thickness = FILLED (-1),圆将被填充。
  6. lineType (int, 默认值 = LINE_8):线条的类型,可以是以下选项之一:
    LINE_8:8-connected 线条 (默认值)。
    LINE_4:4-connected 线条。
    LINE_AA:抗锯齿线条(更平滑的圆)。
  7. shift (int, 默认值 = 0):圆心坐标和半径的小数位精度(位移)。默认值 0 表示整数精度。
相关推荐
8Qi828 分钟前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
zhangfeng11331 小时前
计算机视觉vc 3D 希尔伯特曲线 基础介绍,人工智能
人工智能·计算机视觉·3d
youngerwang2 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
KaMeidebaby2 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠3 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
CV-deeplearning3 小时前
YOLO26 正式发布!6 大任务一战封神,n 模型 mAP 40.9 跑 1.7ms,从检测到分割到姿态一条龙
yolo·目标检测·计算机视觉·ultralytics·yolo26
无限码力3 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试
lqqjuly3 小时前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法
吴可可1234 小时前
SolidWorks草图转三维DWG技巧
算法
redaijufeng4 小时前
C++雾中风景7:闭包
c++·算法·风景