arrays - 在 Julia 的数组中创建一个填充的矩形
问题描述
我是 Julia 的新手,我正在尝试了解基本的数据可视化。我正在创建一个二维噪声数组:
xRange, yRange = 1:1:300, 1:1:300
maxVal = 0.3
noiseArr = rand(length(xRange),length(yRange))*maxVal
生成的数组如下所示(左)。我想识别特定的像素——由具有长度、宽度和旋转的矩形定义——并将这些值设置为已知数字。最终,我想要如下图(右)所示的东西。
我没有包偏好,但我一直在研究图像、OpenCV 等。我希望有一种直接的方法可以做到这一点。
解决方案
我想识别特定的像素——由具有长度、宽度和旋转的矩形定义
知道长度、宽度和旋转不足以在平面上唯一地定位一个矩形。你还需要翻译。
这是一个简单的代码,它为您提供了一个示例(它不是超级高效,但对于演示目的来说足够快):
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)
在其中 - 而不是传递旋转、缩放和平移,我认为更容易假设您传递矩形x1
、x2
和的三个顶点x3
(假设它的边由x1-x2
和x1-x3
对形成)并计算您需要的仿射变换。val
是矩形内的像素应该得到的值。
请注意,本质上我们所做的是计算矩形到单位正方形的反向仿射变换,并检查哪些点位于单位正方形内(这很容易)。
(正如上面提到的评论者 - 这不是一个最佳方法,因为你做了很多不需要的计算,但我希望它的好处是更容易理解;Julia的好处是编写这样的循环不是问题,它仍然运行得足够快)