R栅格绘制图像,绘制圆圈并屏蔽圆形外的像素

use*_*622 5 r image mask raster

下面的代码绘制图像,然后在该图像上绘制圆圈.我想让所有落在该圈外的像素变黑.我怎么能这样做?

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")
Run Code Online (Sandbox Code Playgroud)

42-*_*42- 5

用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"
Run Code Online (Sandbox Code Playgroud)

....所以1:50乘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")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

逻辑是标准具有(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
Run Code Online (Sandbox Code Playgroud)

进一步的实验提供了这似乎非常接近:

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") )
Run Code Online (Sandbox Code Playgroud)

显然,您可以将width/height比例因子替换为5/4出现的新宽高比.

在此输入图像描述