3

我想在 R 中缩放图像以进行进一步分析,而不是立即绘图。

如果我可以使用 EBImage,EBImage 的 resize() 将是理想的,但我需要避免它,所以我必须找到一个替代方案。

我没有任何运气搜索。我可以手动实现双线性过滤,但在我这样做之前,我想确认没有任何替代方案。

4

2 回答 2

6

最近邻调整大小是最常见和最容易实现的。

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

resizePixels = 函数(im,w,h){
  像素 = as.vector(im)
  # 初始宽度/高度
  w1 = nrow(im)
  h1 = ncol(im)
  # 目标宽度/高度
  w2 = w
  h2 = h
  # 创建空向量
  temp = 矢量('数字',w2*h2)
  # 计算比率
  x_ratio = w1/w2
  y_ratio = h1/h2
  # 调整大小
  for (i in 0:(h2-1)) {
    for (j in 0:(w2-1)) {
      px = 楼层(j*x_ratio)
      py = floor(i*y_ratio)
      温度[(i*w2)+j] = 像素[(py*w1)+px]
    }
  }

  m = 矩阵(温度,h2,w2)
  返回(米)
}

我会让你弄清楚如何将它应用于 RGB 图像

下面是在此图像的红色通道上运行上述代码的测试:

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

笔记:

  1. 注意,目标宽度和高度必须保持原始图像的纵横比,否则将不起作用
  2. 如果您想避免EBImage, 读/写图像,请尝试使用包jpeg方法readJPEGwriteJPEG
于 2013-05-04T22:40:38.697 回答
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

于 2013-06-16T12:03:27.393 回答