如何将2D环面上的点映射到矩形上

3

enter image description here

我的问题是我有一条线(左边的红色),我想要将其转换为右图所示的东西。(这是一个二值化图像,所以除了这里是白色的(红色)线外,其他都是黑色。)黑点表示灰色圆的中心。因此,显然,红线的点不能适应1个圆的边缘,但存在r1、r2(半径)两个圆,它们共同创建了一个环,其表面(图上的灰色)可以容纳红线的所有点。对于不同的图片,r1和r2可能不同,但保证r2>r1>0。

因此,我需要一个映射,它可以将红线的点(numpy矩阵)从灰色环转换为矩形。 “没有公式”,我会想象这样切割环,并将其折叠成一个矩形。


不确定你是否可以“无公式”地完成这个任务。这样的映射存在,并且使用三角学很容易进行公式化。但是,对于离散化方案来说,可能会更加困难。这似乎是一个更数学导向的问题,而不是Python相关的。 - Mateo Vial
6
请参阅 https://docs.opencv.org/4.1.1/da/d54/group__imgproc__transform.html#ga49481ab24fdaa0ffa4d3e63d14c0d5e4 中的warpPolar()函数。 - fmw42
1个回答

3

正如@fmw42所指出的那样,您可以使用cv2.warpPolar。以下是一个例子。

import math

import cv2

ring = cv2.imread("so71416458-crop.png")
size = ring.shape[0]  # assumes square image

outer_radius = size // 2
inner_radius_factor = 0.7  # 0.70 measured empirically from image

# Unwarp ring
warped = cv2.warpPolar(ring, (size, int(size * math.pi)), (outer_radius, outer_radius), outer_radius, 0)
# Rotate 90 degrees
straightened = cv2.rotate(warped, cv2.ROTATE_90_COUNTERCLOCKWISE)
# Crop to ring only
cropped = straightened[: int(straightened.shape[0] * (1 - inner_radius_factor)), :]

cv2.imwrite("so71416458-straight.png", cropped)

输入:so71416458-crop.png

输入图像描述

这里出现的“摆动”是由于我的裁剪不精确 - 环的中心点并不完全在图像的中点。

输出:so71416458-straight.png

输出图像描述


这正是我一直在寻找的!谢谢。是的,这张图片只是一个例子,为了更好地展示我的问题,所以中心点不完全在中心位置 :) - Dániel Grimm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接