使用 R 从图像中检测特定线

the*_*hao 4 r image-processing

在此输入图像描述

我是图像处理新手。我想检测该图像中的一条特定线,即图像中间的水平线。我想知道如何处理它。这是地图,它已经被简化为边缘地图。

All*_*ron 6

这是一种方法。

让我们从阅读您的图像开始。我们将为此使用该png库,因此如果您尚未安装它,则需要install.packages("png")先安装。

library(png)

img_link <- "https://i.stack.imgur.com/PygvJ.png"

img <- readPNG(readBin(img_link, "raw", 1e6))
Run Code Online (Sandbox Code Playgroud)

readPNG函数将图像提取为数组。在本例中,数组大小为 360 x 371 x 4:

dim(img)
#> [1] 360 371   4
Run Code Online (Sandbox Code Playgroud)

这意味着图像为 360 x 371 像素,包含四个通道:红色、蓝色、绿色和 Alpha(透明度)。

我们可以随时通过调用绘制该数组:

plot(as.raster(img))
Run Code Online (Sandbox Code Playgroud)

为了找到一条水平的红线,我们需要做的就是查看绿色通道中像素值的行和,该行和在目标行处会急剧下降。

sum_green <- apply(img[,,2], 1, sum)
Run Code Online (Sandbox Code Playgroud)

我们可以绘制这个向量,以确保其中一行中存在有较大下降的行,正如我们所期望的那样。

plot(sum_green, type = "l")
Run Code Online (Sandbox Code Playgroud)

为了得到这一行,我们只需找到最小行总和:

target_row <- which.min(sum_green)

target_row
#> [1] 183
Run Code Online (Sandbox Code Playgroud)

所以我们的红线在第 183 行。为了证明这一点,让我们将图像的第 183 行设为黑色并再次绘制:

img[target_row, , 1:3] <- 0

plot(as.raster(img))
Run Code Online (Sandbox Code Playgroud)

这看起来是正确的。