如何在R中平滑此图片,以便只剩下两个峰?
如果这是1d数据,我会做一个运行平均值或适合它的回归函数。但我没有找到关于在二维矩阵上应用这些方法的非常具体的信息。例如,我尝试使用filter()
包中的stats
。
我也考虑过克里金法,但这更多是关于插值的,是吗?
答案 0 :(得分:19)
包spatstat
包含一个应用高斯模糊的函数blur()
。这样可以使图像在某种程度上消失,大部分噪声消失,两个主要峰值明显不同。
效果可以在下面的图片中看到并且非常显着,特别是在3d图中。
生成图片的代码是:
library(jpeg)
library(fields)
library(spatstat)
picture <- readJPEG("~/Downloads/spectrogram.png.jpeg")
picture2 <- as.matrix(blur(as.im(picture), sigma=6))
layout(matrix(c(1:4), nrow=2))
image.plot(picture, col=gray.colors(50), main="original image", asp=1)
image.plot(picture2, col=gray.colors(50), main="blurred with sigma = 6", asp=1)
drape.plot(1:nrow(picture), 1:ncol(picture), picture, border=NA, theta=0, phi=45, main="original spectrogram")
drape.plot(1:nrow(picture), 1:ncol(picture), picture2, border=NA, theta=0, phi=45, main="blurred with sigma = 6")
答案 1 :(得分:12)
我认为您应该查看栅格包中的focal
函数。例如(从raster
文档中复制):
r <- raster(ncols=36, nrows=18, xmn=0)
r[] <- runif(ncell(r))
# 3x3 mean filter
r3 <- focal(r, w=matrix(1/9,nrow=3,ncol=3))
文档包含更多详细信息。
答案 2 :(得分:7)
您一定要查看EBImage
包。有多种功能可以平滑图像。
例如,中值过滤器:
# Load EBImage up
require(EBImage)
# Read in your image
im = readImage('/path/to/your/image')
# Apply a median filter with window size of 7
im.med = medianFilter(im, size=7)
# Display image
display(im.med)
或者你可以尝试高斯模糊:
# Apply a gaussian blur with sigma=4
im.gaus = gblur(im, sigma=4)
# Display image
display(im.gaus)
希望这有帮助!