Arrays 为什么不是';是否覆盖数组值?
我用一个名为Arrays 为什么不是';是否覆盖数组值?,arrays,image-processing,julia,global,Arrays,Image Processing,Julia,Global,我用一个名为contourCrop()的函数裁剪了一个图像数组,但当我尝试使用循环更改数组的各个值时,这些值保持不变。例如,mat2[122411]的值仍然是0.027450980392156862,即使该值小于0.2。奇怪的是,如果我改变全局mat2[r,c]=0到类似于全局mat2[r,c]=200数组元素不会改变,但是如果我使用imshow()显示图像,图像会改变。有没有一种简单的方法可以手动更改图像的数组值 img = load("C:\\Users\\josep\\Downl
contourCrop()
的函数裁剪了一个图像数组,但当我尝试使用循环更改数组的各个值时,这些值保持不变。例如,mat2[122411]
的值仍然是0.027450980392156862,即使该值小于0.2。奇怪的是,如果我改变全局mat2[r,c]=0代码>到类似于全局mat2[r,c]=200
数组元素不会改变,但是如果我使用imshow()
显示图像,图像会改变。有没有一种简单的方法可以手动更改图像的数组值
img = load("C:\\Users\\josep\\Downloads\\archive\\no\\2 no.jpeg");
imgg = Gray.(img);
mat = convert(Array{Float64}, imgg);
mat2 = contourCrop(mat);
for r in size(mat2, 1), c in size(mat2, 2)
if mat2[r, c] < 0.2
global mat2[r, c] = 0;
end
end
println(mat2[122, 411]);
img=load(“C:\\Users\\josep\\Downloads\\archive\\no\\2 no.jpeg”);
imgg=灰色(img);
mat=转换(数组{Float64},imgg);
mat2=等高作物(mat);
尺寸为r(mat2,1),尺寸为c(mat2,2)
如果mat2[r,c]<0.2
全局mat2[r,c]=0;
结束
结束
println(mat2[122411]);
您的问题可能是size
给出的是一个整数,而不是一个范围,因此对于r的大小(mat2,1)
只迭代一个值。您可以编写1:size(mat2,1)
,或者更好地使用轴
:
julia> mat2 = randn(2,5)
2×5 Array{Float64,2}:
0.426329 0.153334 2.50947 0.669216 -0.51994
-1.08846 -1.16639 -0.786405 0.451461 -1.893
julia> for r in axes(mat2, 1), c in axes(mat2, 2)
if mat2[r, c] < 0.2
mat2[r, c] = 0;
end
end
julia> mat2
2×5 Array{Float64,2}:
0.426329 0.0 2.50947 0.669216 0.0
0.0 0.0 0.0 0.451461 0.0
julia>mat2=randn(2,5)
2×5数组{Float64,2}:
0.426329 0.153334 2.50947 0.669216 -0.51994
-1.08846 -1.16639 -0.786405 0.451461 -1.893
julia>对于轴中的r(mat2,1),轴中的c(mat2,2)
如果mat2[r,c]<0.2
mat2[r,c]=0;
结束
结束
朱莉娅>马特2
2×5数组{Float64,2}:
0.426329 0.0 2.50947 0.669216 0.0
0.0 0.0 0.0 0.451461 0.0
或者更好,编写mat2.=mat2.*(mat2.<0.2)
或类似map的东西!(x->x您的问题可能是size
给出了一个整数,而不是一个范围,因此对于r的大小(mat2,1)
只迭代一个值。您可以编写1:size(mat2,1)
,或者更好,使用轴:
julia> mat2 = randn(2,5)
2×5 Array{Float64,2}:
0.426329 0.153334 2.50947 0.669216 -0.51994
-1.08846 -1.16639 -0.786405 0.451461 -1.893
julia> for r in axes(mat2, 1), c in axes(mat2, 2)
if mat2[r, c] < 0.2
mat2[r, c] = 0;
end
end
julia> mat2
2×5 Array{Float64,2}:
0.426329 0.0 2.50947 0.669216 0.0
0.0 0.0 0.0 0.451461 0.0
julia>mat2=randn(2,5)
2×5数组{Float64,2}:
0.426329 0.153334 2.50947 0.669216 -0.51994
-1.08846 -1.16639 -0.786405 0.451461 -1.893
julia>对于轴中的r(mat2,1),轴中的c(mat2,2)
如果mat2[r,c]<0.2
mat2[r,c]=0;
结束
结束
朱莉娅>马特2
2×5数组{Float64,2}:
0.426329 0.0 2.50947 0.669216 0.0
0.0 0.0 0.0 0.451461 0.0
或者更好的方法是编写mat2.=mat2.*(mat2.<0.2)
或类似map!(x->xI使用VSCode执行以下文件:
using Images
using TestImages
function contourCrop(img::Array{T,2}) where {T}
return img[1:1000,1:1000]
end
img = testimage("earth_apollo17")
imgg = Gray.(img)
mat = convert(Array{Float64}, imgg)
mat2 = contourCrop(mat)
mat2[122, 411] = 0.027450980392156862
for r in size(mat2, 1), c in size(mat2, 2)
println("r: $r, c: $c")
if mat2[r,c] < 0.2
global mat2[r,c] = 0;
end
end
println(mat2[122, 411])
正如您所看到的,您并没有迭代r和c的所有值,而是迭代了(r=1000,c=1000)处的最后一个像素
让我们先修复循环
for r in 1:size(mat2, 1), c in 1:size(mat2, 2)
#println("r: $r, c: $c")
if mat2[r,c] < 0.2
global mat2[r,c] = 0;
end
end
println(mat2[122, 411])
这里有一种更好的方法可以遍历图像:
for I in CartesianIndices(mat2)
#println("r: $(I[1]), c: $(I[2])")
global mat2
if mat2[I] < 0.2
mat2[I] = 0;
end
end
println(mat2[122, 411])
Cartesianindice(mat2)中I的
#println(“r:$(I[1]),c:$(I[2]))
全球mat2
如果mat2[I]<0.2
mat2[I]=0;
结束
结束
println(mat2[122411])
我使用VSCode在文件中执行了以下操作:
using Images
using TestImages
function contourCrop(img::Array{T,2}) where {T}
return img[1:1000,1:1000]
end
img = testimage("earth_apollo17")
imgg = Gray.(img)
mat = convert(Array{Float64}, imgg)
mat2 = contourCrop(mat)
mat2[122, 411] = 0.027450980392156862
for r in size(mat2, 1), c in size(mat2, 2)
println("r: $r, c: $c")
if mat2[r,c] < 0.2
global mat2[r,c] = 0;
end
end
println(mat2[122, 411])
正如您所看到的,您并没有迭代r和c的所有值,而是迭代了(r=1000,c=1000)处的最后一个像素
让我们先修复循环
for r in 1:size(mat2, 1), c in 1:size(mat2, 2)
#println("r: $r, c: $c")
if mat2[r,c] < 0.2
global mat2[r,c] = 0;
end
end
println(mat2[122, 411])
这里有一种更好的方法可以遍历图像:
for I in CartesianIndices(mat2)
#println("r: $(I[1]), c: $(I[2])")
global mat2
if mat2[I] < 0.2
mat2[I] = 0;
end
end
println(mat2[122, 411])
Cartesianindice(mat2)中I的
#println(“r:$(I[1]),c:$(I[2]))
全球mat2
如果mat2[I]<0.2
mat2[I]=0;
结束
结束
println(mat2[122411])
这就解决了问题。谢谢你指出这一点。我以为我快疯了,但我忽略了一些简单的东西。我尝试一下,你建议的代码看起来更优雅了。这就解决了问题。谢谢你指出这一点。我以为我快疯了,但我忽略了一些简单的东西。你建议的代码看起来更优雅了我试试看。