HIP Haskell库中的logFilter是在correlate函数的帮助下获得的.当我将此滤镜应用于此图像时:

enter image description here

然后我得到了这张图片:

enter image description here

我试着用imager包在R中重现它,但没有办法得到这个结果:我try 了几种方法,但都得到了灰色图像.我try 了内置的方法,也try 了手动,大致如下:

for(r in 1:512) {
  for(c in 1:512){
    red[r, c] <- gre[r, c] <- blu[r, c] <- 0
    for(u in 1:9){
      for(v in 1:9) {
        red[r, c] <- red[r, c] + kernel[u, v] * RED[r+u, c+v]
        gre[r, c] <- gre[r, c] + kernel[u, v] * GRE[r+u, c+v]
        blu[r, c] <- blu[r, c] + kernel[u, v] * BLU[r+u, c+v]
      }
    }
  }
}

一直到边界的问题.

我不完全理解correlate的代码,特别是我不理解toManifest函数的作用.toManifest是做什么的?correlate是使用双循环的前一种算法的实现,还是其他什么?

推荐答案

如果您沿着链接一直到解释logFilter函数的页面,它看起来基本上是图像与以下矩阵的关联作为核心:

enter image description here

它在R中是

LoG_kernel <- matrix(c(0, 1, 1,   2,   2,   2, 1, 1, 0, 
                       1, 2, 4,   5,   5,   5, 4, 2, 1, 
                       1, 4, 5,   3,   0,   3, 5, 4, 1, 
                       2, 5, 3, -12, -24, -12, 3, 5, 2, 
                       2, 5, 0, -24, -40, -24, 0, 5, 2, 
                       2, 5, 3, -12, -24, -12, 3, 5, 2, 
                       1, 4, 5,   3,   0,   3, 5, 4, 1, 
                       1, 2, 4,   5,   5,   5, 4, 2, 1, 
                       0, 1, 1,   2,   2,   2, 1, 1, 0), 9L)

然而,您的图像似乎是原木的拉普拉斯.拉普拉斯矩阵是图像与该矩阵的相关性:

L_kernel <- matrix(c(-1, -1, -1,
                     -1,  8, -1, 
                     -1, -1, -1), 3L)

此外,Haskell似乎将值截断到0,1范围,这意味着我们需要以下小辅助函数:

truncate <- function(image) {
  image[image < 0] <- 0
  image[image > 1] <- 1
  image
}

完成后,我们可以通过以下方式复制您的Haskell结果:

library(imager)

load.image("Klein.png") |>
  correlate(as.cimg(LoG_kernel)) |> 
  correlate(as.cimg(L_kernel)) |>
  truncate() |>
  save.image("LLoG.png")

enter image description here

创建于2023-08-30,共reprex v2.0.2

R相关问答推荐

如何将具有重复名称的收件箱合并到R中的另一列中,而结果不同?

名称输出pmap on tible

如何计算前一行的值,直到达到标准?

用derrr在R中查找组间的重复项

derrr summarise每个组返回多行?

如何使用按钮切换轨迹?

如何利用模型函数在格图中添加双曲/指数曲线

R for循环返回到先前值

将数据集中的值增加到当前包含的最大值

R-更新面内部的栅格值

使用across,starts_with和ifelse语句变更多个变量

使用外部文件分配变量名及其值

如何同时从多个列表中获取名字?

有效识别长载体中的高/低命中

使用geom_iles在一个切片中包含多个值

为R中的16组参数生成10000个样本的有效方法是什么?

如何在R中创建条形图,使条形图在y轴上围绕0.5而不是0构建条形图?

为什么将负值向量提升到分数次方会得到NaN

生存时间序列的逻辑检验

将仪表板中的值框大小更改为Quarto