17

如何在 R 中平滑这张图片,以便只剩下两个峰?

如果这是一维数据,我会做一个运行平均值或拟合回归函数。但是我没有找到关于在二维矩阵上应用这些方法的非常具体的信息。例如,我尝试filter()stats包中使用。

我也考虑过克里金法,但这更多是关于插值,是吗?

频谱图

4

3 回答 3

21

该包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")
于 2013-06-12T09:08:56.930 回答
13

我认为你应该看看focalraster 包中的函数。例如(从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))

该文档包含更多详细信息。

于 2013-06-12T12:05:05.943 回答
8

你肯定想看看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)

应用 7x7 的中值滤波器

或者你可以尝试高斯模糊:

# Apply a gaussian blur with sigma=4
im.gaus = gblur(im, sigma=4)
# Display image
display(im.gaus)

在此处输入图像描述

希望这可以帮助!

于 2013-06-12T17:28:55.173 回答