有没有一种方法可以检测和量化图像中物体的缺失区域?

4

我正在尝试使用 R 计算叶片损伤百分比。我能够使用 pliman 包进行图像分割和面积计算,遵循以下文档:https://cran.r-project.org/web/packages/pliman/vignettes/pliman_start.html

enter image description here

我正在使用以下 R 代码。我放置了一个1cm的正方形作为参考尺度。可以在此处下载样本分割图像here:

#...........................Load image...........................
library(pliman)

img_segm <- pliman::image_import("C:/Users/sando/Desktop/test/imgseg/imgseg.jpg")

#.........................Analize leaves.........................
layout(t(1:2))
meas <-  analyze_objects(img_segm, index = "BIM", marker = "id", invert= F,show_image=T, parallel=T, watershed= T, fill_hull= F, 
                         tolerance = 30, object_size = "large")
# Measures area in pixels
area1 <-  get_measures(meas)[,c(1,4)]
area1
# Correct the measures using an object in cm
real.area <- get_measures(meas, id = 1, area ~ 1)[,c(1,4)]
real.area

#........................Analize contour.........................
# Draw a convex hull around the objects.
cont_meas <- analyze_objects(img_segm,
                             watershed = T,
                             marker = "id",
                             show_chull = TRUE,index = "BIM", invert= F,show_image=T, parallel=T, fill_hull= F, tolerance = 30, object_size = "large") # shows the convex hull

# Measures area 
real.area2 <- get_measures(cont_meas, id = 1, area ~ 1 )[,c(1,4)]

然而,我无法获取受损区域,并且无法使用颜色分割,因为背景是白色的。我希望能够:

  • 单独识别每片叶子
  • 使用某种凸包检测或ROI来预测或选择缺失的叶子边缘。
  • 计算受损面积(红色)和总面积(叶子+红色)。

我知道可以进行一些二进制转换。所以我尝试了以下代码:

#### detect contours in red
library(imager)
img_segm2 <- imager::as.cimg(img_segm)
plot(img_segm2)

# isoblur, greyscale
img_segm3 <- isoblur(grayscale(img_segm2),2) > .60
plot(img_segm3)

px <- img_segm3 > 0.1
ct <- imager::contours(px,nlevels=3)

plot(px)
#Add contour lines
purrr::walk(ct,function(v) lines(v$x,v$y,col="red",lwd=1.5))

enter image description here

有没有一种半自动的方法可以让我获取这个? 我知道可以在ImageJ和一些软件(如leafbyte或bioleaf)中完成,但我希望能够在R或Python中分析这些图像。谢谢您的时间。


这是一个非常酷的问题,你是科学家吗? - Brock Brown
1
谢谢。是的,这是我的博士论文。我想在R中分析数百张像这样的照片。欢迎提供任何关于代码的建议。 - M Sandoval
1
Alpha Shapes,类似于凸壳但不是凸的形状,可以为您提供良好的轮廓。然后,您只需计算不存在的部分的掩码。如果您已经有轮廓... 用层次结构获取这些轮廓,或者只获取最外层的轮廓(请确保您理解白色=前景和黑色=背景像素的语义)。 - Christoph Rackwitz
@MSandoval 非常棒,祝好运!我今天会看一下这个,希望很快就能给你一些代码。 - Brock Brown
1个回答

1
好的,这是给你的一个开始:

https://github.com/brockbrownwork/leaves

我稍后会修改这个答案,但这里是主要结果:

输入input_image 输出frayed_edges holes

毛边:3.947%

非毛边孔的百分比:5.589%

编辑:

如果您有一些要使用的图像示例,那将很有帮助。主要我想知道凸包是否能够精确地包裹住您的叶子,否则我们将不得不使用其他方法。您是想了解每个单独叶片的统计数据,还是整个叶片的平均值?您可能需要更改表示叶子最小区域的变量的值。孔检测也会稍微绕过叶子的边缘部分,我们会修复它。


我可以建议您在答案中粗略地概述您用于达到这些结果的概念/原则吗?如果网站上的答案足以定性地复制结果,则可以链接到外部完整代码。 - Christoph Rackwitz
哇!谢谢你!你的代码几乎完全符合我的要求。在边缘有一些叶子区域,你的代码无法检测到。你觉得也可能考虑到这种损伤吗?也许可以在应用蒙版之前使用凸包或alpha hull来填充轮廓。此外,如果可能的话,我想提取每个单独叶子的损伤百分比。非常感谢你的帮助!更多照片可以在这里找到,链接 - M Sandoval
1
嗨,@MSandoval!很高兴能为您的项目工作。代码应该在一天内准备好了,如果您需要关于其他问题的编码帮助,请随时与我联系。我很乐意帮助你的论文或任何其他项目,我认为这很好玩。 - Brock Brown
@ChristophRackwitz 这是一个很好的建议,我会在完成代码后加入它。 - Brock Brown
@BrockBrown 谢谢,我会通过你的 GitHub 存储库与你联系。 - M Sandoval

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接