【问题标题】:Image smoothing in RR中的图像平滑
【发布时间】:2013-06-06 00:29:01
【问题描述】:

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

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

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

【问题讨论】:

  • imageJ 擅长这些事情
  • 你可以看看raster包。
  • 此外,您的问题并未显示出大量的研究工作。您向我们展示了您尝试过的内容,并指出了您不理解的内容。现在你要求我们为你做这项工作,至少感觉是这样。
  • 感谢raster 包的提示。我希望我在两个月前找到了这个,因为它包含一些我当时可以使用的功能。但是我没有找到可以解决我目前的问题的方法。
  • 搜索图像卷积或内核:en.wikipedia.org/wiki/Kernel_(image_processing)

标签: r image-processing filtering smoothing


【解决方案1】:

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

【讨论】:

  • 你知道为什么它在这里不起作用吗? rawimg=readJPEG("church.jpg") rawimg=t(rawimg) #rawimg=t(blur(as.im(rawimg), sigma=6)) rawimg=rawimg[,ncol(rawimg):1] 我收到此错误:Error in [.im(rawimg, , ncol(rawimg):1) : The subset operation is undefined for this type of index
  • 如果您没有黑白图像,您的图像将是三个矩阵的列表,每个矩阵对应一个 rgb 通道(红色、绿色和蓝色)。因此你不能使用 t() 命令。
  • 如果您被允许使用关于峰形状的知识,那么您可以通过指定参数 varcov 而不是使用各向异性高斯核来进一步改进 blur 的结果sigma
  • 这有助于 rgb 与灰度:stackoverflow.com/a/27491947/2371031
【解决方案2】:

我认为你应该看看 raster 包中的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))

文档包含更多详细信息。

【讨论】:

  • 好的,这也行。这确实像我的第一个想法一样运行意味着。但高斯模糊效果更好。不过还是谢谢你的回答。
【解决方案3】:

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

希望这会有所帮助!

【讨论】:

  • 这也可以,就像spatstat 包中的高斯模糊或raster 包中的运行均值一样。我更喜欢高斯模糊,因为中值滤波器会产生一种垂直和水平条纹。感谢您的回答。很高兴知道有多种方法可以实现我的搜索!
  • @by0 如果我收到此错误该怎么办? &gt; install.packages("EBImage") Warning in install.packages : package ‘EBImage’ is not available (for R version 3.0.2)
  • 您是否尝试从 CRAN 安装 EBImage?不要install.packages('EBImage'),而是像这样从 Bioconductor 安装它source("http://bioconductor.org/biocLite.R"); biocLite("EBImage")
猜你喜欢
  • 2014-11-18
  • 2017-06-01
  • 2013-01-23
  • 2011-09-11
  • 1970-01-01
  • 2018-08-19
  • 2012-09-07
  • 1970-01-01
  • 2011-02-09
相关资源
最近更新 更多