首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用R从图像中检测特定行

使用R从图像中检测特定行
EN

Stack Overflow用户
提问于 2022-01-26 13:41:07
回答 1查看 130关注 0票数 4

我对图像处理很陌生。我想在这张图像中检测到一条特定的线,这是它中间的一条水平线。我想知道如何接近它。这是地图,它已经简化为边缘地图。

EN

回答 1

Stack Overflow用户

发布于 2022-01-26 14:11:21

这里有一个方法。

让我们从以你的形象阅读开始。为此,我们将使用png库,因此如果您没有安装它,您将首先使用install.packages("png")

代码语言:javascript
运行
AI代码解释
复制
library(png)

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

img <- readPNG(readBin(img_link, "raw", 1e6))

readPNG函数将图像提取为数组。在这种情况下,数组是360乘371乘4:

代码语言:javascript
运行
AI代码解释
复制
dim(img)
#> [1] 360 371   4

这意味着图像是360乘371像素,包含四个通道:红色、蓝色、绿色和阿尔法(透明)。

我们可以通过调用以下方法在任何时候绘制此数组:

代码语言:javascript
运行
AI代码解释
复制
plot(as.raster(img))

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

代码语言:javascript
运行
AI代码解释
复制
sum_green <- apply(img[,,2], 1, sum)

我们可以绘制这个向量,以确保其中一个行中有一个大的行,就像我们所期望的那样。

代码语言:javascript
运行
AI代码解释
复制
plot(sum_green, type = "l")

要得到这一行,我们只需找到最小行和:

代码语言:javascript
运行
AI代码解释
复制
target_row <- which.min(sum_green)

target_row
#> [1] 183

所以我们的红线在第183排。为了证明这一点,让我们把第183行图像变成黑色,然后再画一次:

代码语言:javascript
运行
AI代码解释
复制
img[target_row, , 1:3] <- 0

plot(as.raster(img))

这看起来是对的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70870621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档