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
是前面算法的双循环实现,还是别的什么?
1条答案
按热度按时间s5a0g9ez1#
如果您按照链接到解释
logFilter
函数的页面,它似乎本质上是图像与以下矩阵作为内核的相关性:在R中,
然而,您的图像显示为LoG的Laplacian。拉普拉斯算子是图像与这个矩阵的相关性:
此外,Haskell似乎将值截断到0,1范围,这意味着我们需要以下小助手函数:
完成后,我们可以复制您的Haskell结果:
创建于2023-08-30带有reprex v2.0.2