第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 表示整数精度。
相关推荐
渡我白衣1 小时前
哈希的暴力美学——std::unordered_map 的底层风暴、扩容黑盒与哈希冲突终极博弈
java·c语言·c++·人工智能·深度学习·算法·哈希算法
zl_vslam1 小时前
SLAM中的非线性优-3D图优化之相对位姿Between Factor(六)
前端·人工智能·算法·计算机视觉·slam se2 非线性优化
ccLianLian1 小时前
计算机视觉·DETR
人工智能·计算机视觉
budingxiaomoli1 小时前
算法--位运算
算法
熊猫_豆豆1 小时前
基于A*算法的雷雨绕飞路径MATLAB实现
算法·matlab·航天·a星算法
_F_y1 小时前
二分:山脉数组的峰顶索引、寻找峰值、寻找旋转排序数组中的最小值、点名
c++·算法
Elias不吃糖1 小时前
克隆图(LeetCode 133)——用数组做映射的 DFS 解法
c++·算法·leetcode·深度优先
iiiiii111 小时前
【论文阅读笔记】IDAQ:离线元强化学习中的分布内在线适应
论文阅读·人工智能·笔记·学习·算法·机器学习·强化学习
秋深枫叶红1 小时前
嵌入式第二十三篇——数据结构基本概念
linux·数据结构·学习·算法