如何将点从二维环的表面映射到矩形

How to map points from a surface of 2D ring to a rectangle

我的问题是我有一条线(左边是红色的),我想将它转换成右图那样的东西。 (这是一个二值化图像,所以一切都是黑色的,除了这里的(红色)线在图片上是白色的。)黑点象征着灰色圆圈的中心。所以很明显,红线的点不能适合 1 个圆的边缘,但存在 2 个圆,r1,r2(半径)共同构成一个环,它的表面(图片上的灰色)可以包含所有红线的点。不同的图片r1和r2可以不同,但​​是保证r2>r1>0.

所以我需要一个映射,它可以将红线的点(x,y)(numpy矩阵)从灰色环转换为矩形。 “没有公式”我会想象这就像在某个地方切割环,然后将其折叠成一个矩形。

正如@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