gpt4 book ai didi

R光栅绘制图像,绘制一个圆圈并在圆圈外屏蔽像素

转载 作者:行者123 更新时间:2023-12-04 11:12:45 26 4
gpt4 key购买 nike

下面的代码绘制一个图像,然后在该图像上绘制圆圈。我想让所有落在该圆圈外的像素都变成黑色。我怎么能那样做?

library(raster)
library(plotrix)
r1 <- brick(system.file("external/rlogo.grd", package="raster"))
width=50
height=40
x <- crop(r1, extent(0,width,0,height))
plotRGB(x)
circlex=20
circley=15
radius=10
draw.circle(circlex,circley,radius,border="blue")

最佳答案

查看带有 str() 的 'x' 对象,您会看到:

..@ data    :Formal class '.MultipleRasterData' [package "raster"] with 14 slots
.. .. ..@ values : num [1:2500, 1:3] 255 248 221 199 198 210 221 190 104 79 ...
.. .. .. ..- attr(*, "dimnames")=List of 2
.. .. .. .. ..$ : NULL
.. .. .. .. ..$ : chr [1:3] "red" "green" "blue"

....所以 1:50 x 1:50 值映射到三列。 X 值可能是 0:2500 %% 50 y 值可能是 0:2500 %/% 50
所以请记住,如果光栅对象的左上角为“原点”,而绘图函数的左下角则为“原点”,因此 20 的 y 值变为 50-20 或 30,这使您接近您的要求(抱歉用于将 y 序列放在首位):
x@data@values[( ((1:2500 %/% 50 )- 30)^2 + ((1:2500 %% 50) - 20)^2 ) >=100, 1] <- 0
x@data@values[( ((1:2500 %/% 50 )- 30)^2 + ((1:2500 %% 50) - 20)^2 ) >=100, 2] <- 0
x@data@values[( ((1:2500 %/% 50 )- 30)^2 + ((1:2500 %% 50) - 20)^2 ) >=100, 3] <- 0
plotRGB(x)
draw.circle(20,20,10,border="blue")

enter image description here

逻辑是标准的形式为 (x-dx)^2+(y-dy)^2 > r^2,其中 dx 和 dy 是圆的中心坐标,r 是半径 == 10。

问题更改后的编辑:

对于每个颜色层,带有命名参数的代码将类似于使最暗的“红色”的代码。尽管没有正确处理使中心对齐,但这给出了一个大致圆形的掩码:
x@data@values[( ((1:(height*width) %/% (height*5/4) )- (height-circley*5/4) )^2 + 
((1:(height*width) %% width) - circlex )^2 ) >= radius^2, 1] <- 0

进一步的实验提供了这似乎非常接近:
x@data@values[( ((1:(height*width) %/% (height) )- (height-circley) *5/4)^2 + 
((1:(height*width) %% width) - circlex )^2 ) >= radius^2, 1] <- 0
plotRGB(x, asp=5/4, addfun=function() draw.circle(circlex,circley,radius,border="blue") )

显然你可以替换 width/height出现 5/4 处的新纵横比的缩放因子。

enter image description here

关于R光栅绘制图像,绘制一个圆圈并在圆圈外屏蔽像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31709990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com