R光栅绘制图像,绘制圆并遮罩圆外的像素

R光栅绘制图像,绘制圆并遮罩圆外的像素,r,image,mask,raster,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 radiu

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

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")
库(光栅)
库(plotrix)

r1用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乘以1:50的值映射到三列。X值可能是
0:2500%%50
,y值可能是
0:2500%%/%50

因此,请记住,“原点”如果是光栅对象的左上角,而打印函数的左下角,那么y值20将变为50-20或30,这将使您接近您所要求的(对于将y序列放在首位表示歉意):

x@data@值[((1:2500%/%50)-30)^2+((1:2500%%50)-20)^2)>=100,1]=100,2]=100,3]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@值[((1:(高度*宽度)%/%(高度*5/4))-(高度圆圈*5/4))^2+

((1:(高度*宽度)%%宽度)-circlex)^2)>=半径^2,1]=半径^2,1]这是一个更通用的解决方案,也适用于具有不同坐标系的光栅

函数
rasterToPoints()
将光栅转换为点。按照您的示例,
head(rasterToPoints(x))
返回以下内容:

> head(rasterToPoints(x))
       x    y red green blue
[1,] 0.5 39.5 255   255  251
[2,] 1.5 39.5 204   205  199
[3,] 2.5 39.5 171   172  164
[4,] 3.5 39.5 157   159  148
[5,] 4.5 39.5 162   164  151
[6,] 5.5 39.5 187   189  176
然后,我们需要找出哪些点落在圆之外,并将其值设置为零:

is_outside_circ = (rasterToPoints(x)[,1] - circlex)^2 + (rasterToPoints(x)[,2] - circley)^2 >= radius^2
x@data@values[ is_outside_circ,] <- 0
plotRGB(x)
draw.circle(circlex,circley,radius,border="blue")
是否在圆周=(栅格点(x)[,1]-circlex)^2+(栅格点(x)[,2]-circley)^2>=半径^2>

x@data@值[is_out_circ,]我更新了裁剪的大小以及圆心的坐标。是否可以更改代码以反映新的裁剪尺寸和坐标?如果您不使用实际数字(2500、50、30、100等),而是使用图像宽度、高度、中心的x坐标等功能,那么代码将在任何图像上运行。谢谢你提出了一个没有命名参数的问题。我试过你的代码…但我没有得到一个圆形区域:(蓝色的圆圈和黑色的区域相交很多:(可能需要加入一个比例因子,因为“像素”的纵横比)不再是1.0不知何故,您已设法获得一个空的逻辑矩阵作为@data@values.这是如何发生的,这是一个你需要解决的难题。你可能需要在另一个问题中发布
str(r1)
的完整输出。我真的认为我已经完全回答了这个问题。
> head(rasterToPoints(x))
       x    y red green blue
[1,] 0.5 39.5 255   255  251
[2,] 1.5 39.5 204   205  199
[3,] 2.5 39.5 171   172  164
[4,] 3.5 39.5 157   159  148
[5,] 4.5 39.5 162   164  151
[6,] 5.5 39.5 187   189  176
is_outside_circ = (rasterToPoints(x)[,1] - circlex)^2 + (rasterToPoints(x)[,2] - circley)^2 >= radius^2
x@data@values[ is_outside_circ,] <- 0
plotRGB(x)
draw.circle(circlex,circley,radius,border="blue")