如何将点从二维环的表面映射到矩形
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
我的问题是我有一条线(左边是红色的),我想将它转换成右图那样的东西。 (这是一个二值化图像,所以一切都是黑色的,除了这里的(红色)线在图片上是白色的。)黑点象征着灰色圆圈的中心。所以很明显,红线的点不能适合 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
这里明显的“摆动”是我草率裁剪的结果——圆环的中心点不完全在图像的中点。