【问题标题】:How to crop a circular image to inscribed square, then crop to inscribed circle, and finally crop to inscribed square?如何将圆形图像裁剪为内切正方形,然后裁剪为内切圆,最后裁剪为内切正方形?
【发布时间】:2018-07-04 01:22:46
【问题描述】:

我想按照以下方式裁剪下面附上的圆形图片:

  1. 将输入的圆形图像裁剪为圆形内接的唯一正方形。
  2. 将正方形图像裁剪为正方形内接的圆圈
  3. 将上一步的圆形图像向下裁剪为刻有图像的正方形。

我正在使用 python、opencv 和 PIL。我曾尝试使用硬编码坐标进行裁剪,但这显然会在应用于其他图像时出现问题,所以我想要一个通用的解决方案。

我已经包含了我想如何裁剪它的粗略可视化:

另外,我已经附上了原图:

非常感谢您提供带有简要说明的代码 sn-p。

【问题讨论】:

  • 根据输入中圆的直径计算内部正方形的大小似乎相当简单。然后,您可以直接达到最终目标,而无需中间步骤(如果这是您所追求的)。
  • @john 你丢失了附加的img
  • 圆圈是否总是像您的示例中那样完美地融入方形图片?

标签: python image opencv image-processing python-imaging-library


【解决方案1】:

您要裁剪的图像在几何上是以输入图像为中心的正方形,大小是输入图像的一半。这是因为您要记录两次,每次平方缩小 2 的平方根,除以 SQRT(2) 两次与除以 2 相同。

因此,如果您有一个边为 D 的输入正方形(或直径为 D 的圆形图像),您需要做的是裁剪中心 (D/2, D/2) 和边为 D/2。

【讨论】:

  • 是的,我刚刚想出了相同的解决方案。谢谢。
【解决方案2】:

您不需要执行中间裁剪。

只计算结果平方参数。

类似这样的伪代码(我更擅长 c++):

def calcSideOfInscribedSquare(current_size):
    return current_size / sqrt(2)

initial_side = min(image.cols, image.rows)
first_squre_side = calcSideOfInscribedSquare(initial_side)
second_square_side = calcSideOfInscribedSquare(first_squre_side)

cv.Rect result_square(
    image.cols / 2 - second_square_side / 2,
    image.rows / 2 - second_square_side / 2,
    second_square_side,
    second_square_side)

new_image = image(result_square)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多