我正在研究关于Sobel边缘检测的R任务 . 不幸的是,我关注的视频教程使用R进行其他任务,但切换到python进行图像处理 - 我猜他没有找到任何有用的R包用于图像卷积类型的工作(本教程来自去年) . 我试过EBImagemagick(这个似乎是新的),但没有找到太多 . 这个magick vignette谈论 image_convolve('Sobel') (大约是页面的一半),但仅适用于垂直边缘,而不是水平边缘 . 有人可以提出一些我可以使用的好材料吗?我对图像处理很新 .

Update:

我已设法使用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

从教程开始,接下来我需要通过计算这些边之间的欧几里德距离来组合 imgHimgV ,但是 dist() 将无法与图像对象本身一起使用 . 我需要从这些图像中获取数据,但不知道如何 . 与 EBImage 包中的 imageData() 类似的东西会有所帮助,但在 magick 中找不到它 . 它有 image_data() 函数,但其输出看起来很复杂 .

Update(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))

谢谢 .