通过Haskell 'hip'库(LoG滤波器)对两个图像进行相关性分析

nwwlzxa7  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(92)

Haskell库中的logFilter是在correlate函数的帮助下获得的。当我将这个滤镜应用到这张图片上时:

然后我得到这个图像:

我试着用R语言用imager包重现它,但没有办法得到这样的结果:我尝试了几种方法,都给了一个灰色的图像。我尝试了内置方法,也尝试了手动操作,大致如下:

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是前面算法的双循环实现,还是别的什么?

s5a0g9ez

s5a0g9ez1#

如果您按照链接到解释logFilter函数的页面,它似乎本质上是图像与以下矩阵作为内核的相关性:

在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)

然而,您的图像显示为LoG的Laplacian。拉普拉斯算子是图像与这个矩阵的相关性:

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")

创建于2023-08-30带有reprex v2.0.2

相关问题