首页 > 解决方案 > 在 Julia 的数组中创建一个填充的矩形

问题描述

我是 Julia 的新手,我正在尝试了解基本的数据可视化。我正在创建一个二维噪声数组:

xRange, yRange = 1:1:300, 1:1:300
maxVal = 0.3
noiseArr = rand(length(xRange),length(yRange))*maxVal

生成的数组如下所示(左)。我想识别特定的像素——由具有长度、宽度和旋转的矩形定义——并将这些值设置为已知数字。最终,我想要如下图(右)所示的东西。

我没有包偏好,但我一直在研究图像、OpenCV 等。我希望有一种直接的方法可以做到这一点。

在此处输入图像描述

标签: arraysjuliaoverlaprectangles

解决方案


我想识别特定的像素——由具有长度、宽度和旋转的矩形定义

知道长度、宽度和旋转不足以在平面上唯一地定位一个矩形。你还需要翻译。

这是一个简单的代码,它为您提供了一个示例(它不是超级高效,但对于演示目的来说足够快):

function rectangle!(x1, x2, x3, noiseArr, val)
    A = [x2-x1 x3-x1]
    b = x1
    iA = inv(A)

    for i in axes(noiseArr, 1), j in axes(noiseArr, 2)
        it, jt = iA * ([i, j]-b)
        0 <= it <= 1 && 0 <= jt <= 1 && (noiseArr[i, j] = val)
    end
end

x1 = [40, 140]
x2 = [230, 100]
x3 = [50, 170]
rectangle!(x1, x2, x3, noiseArr, 0.0)

在其中 - 而不是传递旋转、缩放和平移,我认为更容易假设您传递矩形x1x2和的三个顶点x3(假设它的边由x1-x2x1-x3对形成)并计算您需要的仿射变换。val是矩形内的像素应该得到的值。

请注意,本质上我们所做的是计算矩形到单位正方形的反向仿射变换,并检查哪些点位于单位正方形内(这很容易)。

(正如上面提到的评论者 - 这不是一个最佳方法,因为你做了很多不需要的计算,但我希望它的好处是更容易理解;Julia的好处是编写这样的循环不是问题,它仍然运行得足够快)


推荐阅读