繁体   English   中英

栅格绘制图像,绘制圆并在圆外遮罩像素

[英]R raster plotting an image, draw a circle and mask pixels outside circle

下面的代码绘制图像,然后在该图像上绘制圆圈。 我要使落在该圆圈之外的所有像素变黑。 我该怎么办?

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")

在此处输入图片说明

逻辑是准则的形式为(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") )

显然,您可以在出现5/4的任何地方用width/height比例因子代替新的纵横比。

在此处输入图片说明

这是一个更通用的解决方案,也适用于具有不同坐标系的栅格。

函数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")

结果:圆圈外有黑点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM