3

我目前正在寻找一种裁剪图像的方法,但要在一个角度上。我不认为我可以先旋转图像,因为脚本提供了每个角的特定 x,y 坐标。

因此,如果您可以对此进行成像,则会上传 1280x720 的图像。除了图像,它还提供了裁剪区域的 x,x 坐标。然而,左上角和右上角的坐标不会有相同的 y 位置。

这是一个例子

前

后

有任何想法吗 ?

4

1 回答 1

4

您仍然需要使用三角法来旋转图像,但您可以通过混合不透明度复制和修剪来模拟角度裁剪。

第一的。创建图像蒙版

如果所有的点都给你,并且定义了图像大小,只需绘制需要提取的区域

WIDTH=819
HEIGHT=616
TOP_LEFT=669,117
TOP_RIGHT=784,155
BOTTOM_LEFT=544,495
BOTTOM_RIGHT=659,534
convert -size $WIDTHx$HEIGHT xc:black -fill white -stroke white \
        -draw "polyline $TOP_LEFT $TOP_RIGHT $BOTTOM_RIGHT $BOTTOM_LEFT" \
        mask.png

要裁剪的区域的图像蒙版

掩蔽和背景去除

这种遮罩方法将关闭 Alpha 通道并将背景设置为透明。当我们合成这两个图像时,生成的图像将仅显示我们在蒙版中定义的区域内的内容。(注意:您可能需要将其调整-background为白色或透明。)

convert source.jpg mask.png -alpha Off -compose CopyOpacity \
        -composite -background transparent copyOpacity.png

从复合蒙版复制的不透明度

计算旋转度数

如果你在一个直角上有两个点,你应该能够遵循atan方法。大多数语言都有 atan2 函数。其他三角问题“旋转矩形”和“如何计算两点之间相对于水平轴的角度?

DELTA_Y=$(($HEIGHT-155-534))
DELTA_X=$((784-659))
DEGREE=`awk "BEGIN { pi=4.0*atan2(1.0,1.0)+90; print atan2($DELTA_Y,$DELTA_X)*180/pi; }"`
convert copyOpacity.png -rotate $DEGREE -trim final.png

在此处输入图像描述

幸运的是,您可以一步完成所有操作。

#!/bin/bash

WIDTH=819
HEIGHT=616
TOP_LEFT=669,117
TOP_RIGHT=784,155
BOTTOM_LEFT=544,495
BOTTOM_RIGHT=659,534
DELTA_Y=$(($HEIGHT-155-534))
DELTA_X=$((784-659))
DEGREE=`awk "BEGIN { pi=4.0*atan2(1.0,1.0)+90; print atan2($DELTA_Y,$DELTA_X)*180/pi; }"`

convert source.jpg \( -size $WIDTHx$HEIGHT xc:black -fill white -stroke white \
        -draw "polyline $TOP_LEFT $TOP_RIGHT $BOTTOM_RIGHT $BOTTOM_LEFT" \) \
        -alpha Off -compose CopyOpacity -composite \
        -background transparent -rotate $DEGREE -trim \
        final.png
于 2013-08-18T20:56:52.687 回答