第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 表示整数精度。
相关推荐
淡海水8 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan8 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy9 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
乐迪信息9 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
AndrewHZ10 小时前
图像处理入门025 | 非线性灰度变换:伽马校正与 Log 变换——暗图救星的两条曲线
图像处理·伽马校正·log变换·非线性点运算·自动伽马·lut加速·暗图增强
AndrewHZ11 小时前
图像处理入门024 | 线性灰度变换:亮度与对比度调整
图像处理·性能基准·线性灰度变换·亮度 β·对比度 α·uint8溢出·hsv/lab
木井巳11 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊11 小时前
归并排序之翻转对(hard)
数据结构·算法
白山编程大哥12 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
shehuiyuelaiyuehao12 小时前
算法34,位运算符操作,总结
算法