python 黑白tif提取边界像素坐标_对比Harris算子和Susan算子的建筑物边界规则化方法...

410990c470bb22bcf6c07114332faf80.png

建筑物作为遥感影像中的重要地物要素[1-2],对其精确快速地提取和及时地更新直接影响着城市规划、土地利用等方面[3]。但现在大部分研究都是利用遥感影像[4]、机载LiDAR点云[5]或其他多源数据[6-7]获取建筑物模型,进而应用于对其边界的检测及提取,对后续的规则化问题研究较少。又因受遮挡、阴影、光谱等噪声影响[8-9],粗提取后的建筑物边界效果并不理想,因此,将粗提取后的建筑物边界进行规则化,使之更加拟合其真实边界显得尤为重要。

建筑物边界的主要拟合方法有:①凸包拟合,即寻找一个由这些点构成的凸多边形以将平面上的点全部包含在内;②最小外接矩形拟合[10],即计算待拟合边界与最小外接矩形之间的差值,对其设置一定的阈值从而判断角点的存在性;③直角多边形拟合,即根据提取的直线段主方向及其垂直方向将线段分为两组并进行组内直线段的连接与微调,从而选择适用的策略进行拟合;④最小二乘法直线拟合[11],即依据拟合公式yi=aix+bi逐个对每条线段进行拟合;⑤角点定位拟合,即对粗提取后的边界后进行预处理,然后提取其角点并拟合连接得到规则的建筑物边界。

上述方法虽然对边界规则化的效果较好,但仍存在一些问题,如建模过程烦琐导致解算复杂、理论不严密、只对特殊试验区有效等。因此,为了获取更加接近实际建筑物的真实边界,本文结合Harris算子和Susan算子,提出一种对粗提取后的多边形建筑物顶部边界进行规则化拟合的处理方法。

1 研究方法

1.1 角点检测

角点即二维图像亮度变化十分明显的点或曲线边缘上曲率极大值的点[12]。如果要提取建筑物顶部边界,需要对角点的位置进行准确的识别、提取及规则化拟合连接。因此,精确地检测并提取建筑物顶部边界角点十分重要。

1.1.1 Harris算法角点检测

Harris算子为Harris等在Moravec角点检测算法的基础上提出的基于信号的点特征提取方法[13],主要应用微分方程和自相关矩阵检测图像角点是否存在。其原理为:用一定大小的窗口在图像上滑动,当在任意方向上移动该窗口都会导致窗口中的像素灰度发生较大变化时,该窗口中存在角点。

其角点响应函数的表达式为

2f2e1cf1dae6b8c2e385639024fed489.png(1)

式中,k为常量,一般取经验值0.04~0.06;λ1λ2为自相关阵M的两个特征值;当窗口内某点的R值大于设置的阈值且在邻域内为极大值时,可将其视作角点。

1.1.2 Susan算法角点检测

Susan算法是Smith等提出的一种处理灰度图像的方法[14],有检测图像边缘、提取边界角点、消除噪声等作用。其原理为:提取圆形模板内各点与核心点像素灰度值相近的Usan区域[15]

Susan算法的角点响应函数表达式为

54e26f82d3dc600d7ccecf219fa447d2.png(2)

式中,阈值g=1/2(max(n))。当图像内点的Usan值小于g,则可认为该点是初始角点,再通过对其进行非极大值抑制求得最后的角点。

1.2 角点点号排序

在对建筑物边界进行角点检测时,由于其通过遍历图像以确定角点以致提取的边界角点是杂乱无序的。因此首先要对角点点号进行排序处理,然后再进行规则化拟合连接。

对于单栋的简单矩形、菱形类建筑及凹(凸)多边形类建筑,重心在建筑物内部。假设ABCD点为建筑物顶部边界角点,首先根据已知点坐标计算出重心O的坐标,然后以重心O点作为旋转中心逆时针旋转,可得点A在点B的顺时针方向,则定义点号顺序点A在点B之前。通过如此往复,可得出各角点点号的先后顺序。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Python代码实现Harris算子的过程: ```python import cv2 import numpy as np # 加载图像 img = cv2.imread('test.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算x和y方向的梯度 dx = cv2.Sobel(gray, cv2.CV_64F, 1, 0) dy = cv2.Sobel(gray, cv2.CV_64F, 0, 1) # 计算Harris矩阵的三个分量 Ixx = dx ** 2 Ixy = dx * dy Iyy = dy ** 2 # 对Harris矩阵的分量进行高斯滤波 sigma = 1.5 k = 0.04 kernel = cv2.getGaussianKernel(round(6*sigma+1), sigma) kernel = np.outer(kernel, kernel.transpose()) Ixx = cv2.filter2D(Ixx, -1, kernel) Ixy = cv2.filter2D(Ixy, -1, kernel) Iyy = cv2.filter2D(Iyy, -1, kernel) # 计算Harris响应函数R det = (Ixx * Iyy) - (Ixy ** 2) trace = Ixx + Iyy R = det - k * (trace ** 2) # 阈值处理 threshold = 0.1 * np.max(R) R[R < threshold] = 0 # 在图像上绘制角点 radius = 3 color = (0, 0, 255) thickness = 1 for i in range(R.shape[0]): for j in range(R.shape[1]): if R[i, j] > 0: cv2.circle(img, (j, i), radius, color, thickness) # 显示图像 cv2.imshow('Harris Corners', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码,我们首先加载图像并将其转换为灰度图像。然后,我们计算图像的x和y方向梯度,并使用它们计算Harris矩阵的三个分量。接下来,我们对这些分量进行高斯滤波,并使用它们计算Harris响应函数R。最后,我们对R进行阈值处理,并在图像上绘制角点。 需要注意的是,这个实现的高斯滤波、阈值处理等参数都需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值