缩放R图像

3
我希望对图像进行缩放以便进行进一步分析,而不是立即绘制。如果我能使用EBImage,那么它的resize()函数将是理想的选择,但我需要避免它,所以我必须找到另一种替代方法。目前我的搜索没有收到任何结果。在我自己实现双线性过滤之前,我想确认是否有其他选择。请注意保留所有HTML标签。

rasterImage 可以进行插值,但可能只有在实际渲染时才能进行。 - baptiste
2个回答

6

最近邻插值缩放是最常见且最简单的实现方法。

假设您的图像仅有一层/通道,因此只有一个矩阵:

resizePixels = function(im, w, h) {
  pixels = as.vector(im)
  # 初始宽度/高度
  w1 = nrow(im)
  h1 = ncol(im)
  # 目标宽度/高度
  w2 = w
  h2 = h
  # 创建空向量
  temp = vector('numeric', w2*h2)
  # 计算比例
  x_ratio = w1/w2
  y_ratio = h1/h2
  # 进行调整大小操作
  for (i in 0:(h2-1)) {
    for (j in 0:(w2-1)) {
      px = floor(j*x_ratio)
      py = floor(i*y_ratio)
      temp[(i*w2)+j] = pixels[(py*w1)+px]
    }
  }
m = matrix(temp, h2, w2) return(m) }

我会让您自己想办法将其应用于RGB图像

以下是对上述代码在此图像的红色通道上进行测试的结果:

lena = readImage('~/Desktop/lena.jpg')[,,1]
display(lena)

enter image description here

r = resizePixels(lena, 150, 150)
display(r)

enter image description here

r2 = resizePixels(lena, 50, 50)
display(r2)

输入图像描述

注意:

  1. 请注意,目标宽度和高度必须保持原始图像的纵横比,否则将无法正常工作。
  2. 如果你想避免使用EBImage,可以尝试使用jpeg包中的方法readJPEGwriteJPEG来读写图像。

3

最近邻缩放(无插值)可以很容易地实现。
虽然@by0的答案很清晰,但我想提供另一种实现方法。 它适用于图像的矩阵表示,我觉得比索引向量更简单。

resizeImage = function(im, w.out, h.out) {
  # function to resize an image 
  # im = input image, w.out = target width, h.out = target height
  # Bonus: this works with non-square image scaling.

  # initial width/height
  w.in = nrow(im)
  h.in = ncol(im)

  # Create empty matrix
  im.out = matrix(rep(0,w.out*h.out), nrow =w.out, ncol=h.out )

  # Compute ratios -- final number of indices is n.out, spaced over range of 1:n.in
  w_ratio = w.in/w.out
  h_ratio = h.in/h.out

  # Do resizing -- select appropriate indices
  im.out <- im[ floor(w_ratio* 1:w.out), floor(h_ratio* 1:h.out)]

  return(im.out)
}

这适用于任意图像缩放,而不仅限于正方形。另一方面,只有当w.out/w.in = h.out/h.in时,它才会保留图像的纵横比。


1
我可以对一个3D数组做到这一点吗?例如,从array(56,64,46)到array(256,256,256)?怎么做?谢谢! - DemetriusRPaula
嗯,我有一段时间没有看过这段代码了。由于不同方向的比例不同(256 / 56 != 256 / 46等),你会得到一个奇怪拉伸的3D图像。 - Suz
谢谢,这比上面的解决方案好多了。奇怪的是,我不得不切换所有列/行引用才能使它正确工作。 - Verena Haunschmid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接