Man*_*jit 5 r image-processing edge-detection sobel
我正在做一个关于 Sobel 边缘检测的 R 作业。不幸的是,我遵循的视频教程使用 R 来完成所有其他任务,但切换到 python 进行图像处理 - 我猜测他没有找到任何有用的 R 包来进行图像卷积类型的工作(本教程来自去年)。我尝试过EBImage和magick(这个似乎是新的),但没有发现太多。这个神奇的小插图讨论了image_convolve('Sobel')(大约在页面的一半),但仅适用于垂直边缘,而不是水平边缘。有人可以推荐一些我可以使用的好材料吗?我对图像处理相当陌生。
更新:
我已经设法使用 magick 包(下面粘贴的代码)分别检测垂直和水平边缘,但不知道如何将它们组合起来生成单个图像
library(magick)
# get image
img <- image_read("https://www.r-project.org/logo/Rlogo.png")
print(image_info(img))
# define horizontal and vertical Sobel kernel
Shoriz <- matrix(c(1, 2, 1, 0, 0, 0, -1, -2, -1), nrow = 3)
Svert <- t(Shoriz)
# get horizontal and vertical edges
imgH <- image_convolve(img, Shoriz)
imgV <- image_convolve(img, Svert)
print(plot(as.raster(img))) # view original image
print(plot(as.raster(imgH))) # view horizontal edges
print(plot(as.raster(imgV))) # view vertical edges
Run Code Online (Sandbox Code Playgroud)
从教程中,接下来我需要通过计算这些边缘之间的欧几里得距离来组合imgH和,但不适用于图像对象本身。我需要从这些图像中获取数据,但不知道如何。类似in package 的东西会有帮助,但在 .it 中找不到它。它有功能,但它的输出看起来很复杂。imgVdist()imageData()EBImagemagickimage_data()
更新(2):
我(希望)得到了我想要的EBImage包(代码如下)。一旦我弄清楚magick如何从边缘图像获取像素数据(如上所述),以及如何将最终边缘数据转换回图像,我仍然希望它能够与包一起使用。
library(EBImage)
# get image
img <- readImage("https://www.r-project.org/logo/Rlogo.png")
print(img, short = T)
# define horizontal and vertical Sobel kernel
Shoriz <- matrix(c(1, 2, 1, 0, 0, 0, -1, -2, -1), nrow = 3)
Svert <- t(Shoriz)
# get horizontal and vertical edges
imgH <- filter2(img, Shoriz)
imgV <- filter2(img, Svert)
# combine edge pixel data to get overall edge data
hdata <- imageData(imgH)
vdata <- imageData(imgV)
edata <- sqrt(hdata^2 + vdata^2)
# transform edge data to image
imgE <- Image(edata, colormode = 2)
print(display(combine(img, imgH, imgV, imgE), method = "raster", all = T))
Run Code Online (Sandbox Code Playgroud)
谢谢。